AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Индикатор RSSI

Чтение аналогового RSSI приёмника и перевод в проценты.

DMC.06 · Питание · ATmega328P

Задача

Считывать аналоговый RSSI-выход приёмника и мигать светодиодом при слабом сигнале.

Алгоритм

АЦП читает RSSI; линейная привязка отсчётов к 0..100% по калибровочным границам min/max.

Исходный код (C, avr-gcc)

⇩ Скачать 06-rssi-adc.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>

static uint16_t adc_read(uint8_t ch){
  ADMUX=(1<<REFS0)|(ch&0x0F);
  ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC));
  return ADC;
}
int main(void){
  DDRB|=(1<<PB5);
  const uint16_t RMIN=150, RMAX=850;
  for(;;){
    uint16_t r=adc_read(2);
    int16_t pct = (int16_t)((int32_t)(r-RMIN)*100/(RMAX-RMIN));
    if(pct<0)pct=0; if(pct>100)pct=100;
    if(pct<30){ PORTB^=(1<<PB5); _delay_ms(120); }  // тревога миганием
    else { PORTB&=~(1<<PB5); _delay_ms(200); }
  }
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

Границы RSSI различаются у приёмников — их калибруют по факту (сигнал у передатчика и на пределе).

Смотрите также

Телеметрия