Arduino АЦП опорного напряжения, если он батарейках

9

Я ищу, возможно, контролировать заряд батареи Arduino, используя его АЦП. Это довольно просто и просто (особенно если вы используете API Arduino); однако, если батарея питает Arduino и не регулируется извне, разве эталонное напряжение АЦП не будет постоянно падать вместе с батареей? Другими словами, не будет ли значение АЦП постоянно показывать одно и то же значение (максимальное значение), даже если напряжение батареи будет уменьшаться?

В таком случае было бы неэффективно и бессмысленно измерять напряжение аккумулятора.

ryeager
источник

Ответы:

4

... не будет ли эталонное напряжение АЦП постоянно падать с батареей?

Да, именно поэтому вы либо используете, либо измеряете внутреннюю ссылку запрещенной зоны.

Используйте analogReference()функцию, чтобы выбрать ссылку, подходящую для используемой платы. Обратите внимание, что вам нужно будет использовать делитель напряжения, чтобы уменьшить напряжение батареи до значения ниже значения выбранного эталона, если вы хотите его измерить.

Для измерения напряжения запрещенной зоны вместо ( с использованием AV CC в качестве ссылки и работы «назад») , вам необходимо установить MUX[3:0]в ADMUXк 0b1110 , а затем выполнить АЦП чтение напрямую (набор ADSCв ADCSRAи ждать , пока он не сбросит, а затем читать ADC[H:L]).

Как всегда, см. Таблицу данных MCU для деталей.

Игнасио Васкес-Абрамс
источник
Отличная информация, теперь я думаю, что могу продолжить самостоятельно. Я надеялся, что есть какая-то внутренняя ссылка, которую можно использовать. Как вы предложили, мне нужно поделить напряжение делить напряжение питания ниже AVccref, однако я стремлюсь максимально продлить срок службы батареи во всех возможных аспектах, поэтому я собирался использовать большое эквивалентное сопротивление для делителя, чтобы убедиться, что у меня меньше мкА тока утечки. Вы видите какие-либо проблемы с этим?
Ryeager
1
Сопротивление АЦП составляет всего 100 МОм. Попробуйте вместо этого измерить внутренний эталон.
Игнасио Васкес-Абрамс
1
К вашему сведению, я нашел этот потрясающий блог после того, как ответ @Ignacio опубликовал: ссылка
ryeager
1

Ссылка @ ryeager на http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 содержит следующий код для считывания напряжения батареи Arduino:

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

Хитрость здесь в том, что он измеряет свою внутреннюю ссылку на 1.1V, используя напряжение аккумуляторной батареи, а затем переворачивает его вычислить искомую опорное напряжение.

Волшебство ADMUX в этом коде может обеспечить другие интересные показания АЦП, такие как дифференциальные измерения и дифференциальные измерения АЦП с усилением, в зависимости от компонента и таблицы данных.

Дэйв Икс
источник