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.

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.


Ó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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.