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

Определение числа банок

Автоопределение числа банок (S) LiPo по суммарному напряжению.

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

Задача

По измеренному суммарному напряжению определить число последовательных банок (1S..6S).

Алгоритм

Пересчёт отсчёта АЦП в вольты, деление на типовое напряжение банки (~3.7 В) с округлением к ближайшему.

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

⇩ Скачать 03-cell-count-detect.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 float VREF=5.0f, DIV=11.0f;      // делитель 1:11 -> до ~55В
  for(;;){
    float v = adc_read(0)*VREF/1024.0f*DIV;
    uint8_t s = (uint8_t)((v/3.7f)+0.5f);
    if(s<1) s=1; if(s>6) s=6;
    for(uint8_t i=0;i<s;i++){ PORTB|=(1<<PB5); _delay_ms(150); PORTB&=~(1<<PB5); _delay_ms(150); }
    _delay_ms(800);                        // мигнул S раз = число банок
  }
}

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

Пояснения

Работает при подключении заряженной/номинальной батареи. Границы можно уточнить под свою систему.

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

Определение числа банок (теория)