Arduino ADC Reference Voltage se è alimentato a batteria


9

Sto forse cercando di monitorare la carica della batteria di Arduino usando il suo ADC. Questo è abbastanza semplice e diretto (specialmente se si utilizza l'API di Arduino); tuttavia, se la batteria alimenta Arduino e non è regolata esternamente, la tensione di riferimento ADC non diminuirà costantemente con la batteria? In altre parole, il valore ADC non rileggerebbe costantemente lo stesso valore (il valore massimo) anche se la batteria diminuisce effettivamente di tensione?

In tal caso, sarebbe sia inefficace che inutile misurare la tensione della batteria.

Risposte:


4

... la tensione di riferimento ADC non diminuirà costantemente con la batteria?

Sì, è per questo che usi o misuri invece un riferimento di banda interna interno.

Utilizzare la analogReference()funzione per selezionare un riferimento appropriato per la scheda in uso. Si noti che sarà necessario utilizzare un divisore di tensione per ridurre la tensione della batteria a un valore inferiore a quello del riferimento selezionato se si desidera misurarlo.

Per misurare la tensione bandgap invece (utilizzando AV CC come riferimento e di lavoro "a ritroso") è necessario set MUX[3:0]in ADMUXa 0b1110 e quindi eseguire un ADC lettura diretta (set ADSCin ADCSRAe attendere che si resetta, quindi leggere da ADC[H:L]).

Come sempre, consultare la scheda tecnica MCU per i dettagli.


Ottima informazione, ora penso di poter procedere da solo. Speravo ci fosse una sorta di riferimento interno che potesse essere usato. Come hai suggerito, avrò bisogno di dividere la tensione di alimentazione sotto AVccref, tuttavia, sto cercando di massimizzare la durata della batteria in tutti i possibili aspetti, quindi avrei usato una grande resistenza equivalente per il divisore per assicurarmi di avere meno di un uA di dispersione di corrente. Vedi qualche problema con questo?
ryeager

1
L'impedenza ADC è di soli 100Mohm. Prendi invece in considerazione la misurazione del riferimento interno.
Ignacio Vazquez-Abrams,

1
Cordiali saluti, ho trovato questo fantastico blog dopo la risposta che @Ignacio ha pubblicato: link
ryeager

1

Il link di @ ryeager a http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 ha questo codice per leggere la tensione della batteria dell'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
}

Il trucco qui è che misura il suo riferimento interno di 1,1 V usando la tensione della batteria, quindi lo inverte per calcolare la tensione di riferimento sconosciuta.

La magia ADMUX in questo codice può abilitare altre letture ADC interessanti, come misure differenziali e misure ADC differenziali con guadagno, a seconda del componente e della scheda tecnica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.