Tensão de referência do Arduino ADC, se for alimentado por bateria

9

Estou procurando monitorar a energia da bateria no Arduino usando seu ADC. Isso é bastante direto e simples (especialmente se você estiver usando a API do Arduino); no entanto, se a bateria estiver alimentando o Arduino e não for regulamentada externamente, a tensão de referência do ADC não cairá constantemente com a bateria? Em outras palavras, o valor ADC não leria constantemente o mesmo valor (o valor máximo), mesmo que a bateria estivesse diminuindo de tensão?

Se for esse o caso, seria ineficiente e inútil medir a tensão da bateria.

ryeager
fonte

Respostas:

4

... a tensão de referência do ADC não cairá constantemente com a bateria?

Sim, é por isso que você usa ou mede uma referência de intervalo de banda interno.

Use a analogReference()função para selecionar uma referência apropriada para o quadro em uso. Observe que você precisará usar um divisor de tensão para reduzir a tensão da bateria para um valor abaixo do da referência selecionada, se desejar medi-la.

Para medir a tensão bandgap vez (usando AV CC como uma referência e trabalhando "para trás") você terá de conjunto MUX[3:0]em ADMUXque 0b1110 e, em seguida, realizar uma ADC leitura diretamente (conjunto ADSCem ADCSRAe espera até ser restaurada, em seguida, ler a partir ADC[H:L]).

Como sempre, consulte a folha de dados do MCU para obter detalhes.

Ignacio Vazquez-Abrams
fonte
Ótima informação, agora acho que posso prosseguir por conta própria. Eu esperava que houvesse algum tipo de referência interna que pudesse ser usada. Como você sugeriu, precisarei dividir a tensão abaixo de AVccref, no entanto, estou procurando maximizar a vida útil da bateria em todos os aspectos possíveis, então eu usaria uma resistência equivalente grande para o divisor para garantir que eu tenho menos de um uA de vazamento de corrente. Você vê algum problema com isso?
precisa saber é o seguinte
11
A impedância ADC é de apenas 100Mohm. Considere medir a referência interna.
Ignacio Vazquez-Abrams
11
FYI eu encontrei este blog incrível após a resposta @Ignacio postou: ligação
ryeager
1

O link do @ ryeager para http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 possui este código para ler a tensão da bateria do 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
}

O truque aqui é que ele mede sua referência interna de 1,1V usando a tensão da bateria e depois a inverte para calcular a tensão de referência desconhecida.

A mágica do ADMUX neste código pode permitir outras leituras ADC interessantes, como medições diferenciais e medições diferenciais de ADC com ganho, dependendo do componente e da folha de dados.

Dave X
fonte