Arduino ADC-Referenzspannung, wenn es batteriebetrieben ist

9

Ich möchte möglicherweise die Batterieleistung des Arduino mithilfe seines ADC überwachen. Dies ist ziemlich einfach und unkompliziert (insbesondere bei Verwendung der Arduino-API). Wenn die Batterie den Arduino mit Strom versorgt und extern nicht geregelt ist, fällt die ADC-Referenzspannung dann nicht ständig mit der Batterie ab? Mit anderen Worten, würde der ADC-Wert nicht ständig denselben Wert (den Maximalwert) anzeigen, obwohl die Spannung der Batterie tatsächlich abnehmen würde?

In diesem Fall wäre es sowohl ineffizient als auch sinnlos, die Batteriespannung zu messen.

Ryeager
quelle

Antworten:

4

... fällt die ADC-Referenzspannung nicht ständig mit der Batterie ab?

Ja, weshalb Sie stattdessen entweder eine interne Bandlückenreferenz verwenden oder messen.

Verwenden Sie die analogReference()Funktion, um eine Referenz auszuwählen, die für die verwendete Karte geeignet ist. Beachten Sie, dass Sie einen Spannungsteiler verwenden müssen, um die Batteriespannung auf einen Wert unter dem Wert der ausgewählten Referenz zu reduzieren, wenn Sie sie messen möchten.

Um stattdessen die Bandgap Spannung zu messen (AV mit CC als Referenz und Arbeits „rückwärts“) , die Sie Satz benötigen MUX[3:0]in ADMUXzu 0b1110 und dann einen ADC ausführen Lese direkt (Satz ADSCin ADCSRAund warten , bis es zurücksetzt, dann aus ADC[H:L]).

Einzelheiten finden Sie wie immer im MCU-Datenblatt.

Ignacio Vazquez-Abrams
quelle
Tolle Informationen, jetzt denke ich, dass ich alleine weitermachen kann. Ich hatte gehofft, dass es eine Art internen Verweis gibt, der verwendet werden kann. Wie Sie vorgeschlagen haben, muss ich die Netzspannung unter AVccref spannungsunterteilen. Ich möchte jedoch die Batterielebensdauer in allen möglichen Aspekten maximieren, sodass ich einen großen äquivalenten Widerstand für den Teiler verwenden wollte, um sicherzustellen, dass ich weniger als a habe uA Leckstrom. Sehen Sie irgendwelche Probleme damit?
Ryeager
1
Die ADC-Impedanz beträgt nur 100 Ohm. Ziehen Sie stattdessen die Messung der internen Referenz in Betracht.
Ignacio Vazquez-Abrams
1
Zu Ihrer Information Ich fand diesen fantastischen Blog nach der Antwort @Ignacio gepostet: link
ryeager
1

Der Link von @ ryeager zu http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 enthält diesen Code zum Lesen der Batteriespannung des 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
}

Der Trick dabei ist, dass es seine interne Referenz von 1,1 V unter Verwendung der Batteriespannung misst und sie dann invertiert, um die unbekannte Referenzspannung zu berechnen.

Die ADMUX-Magie in diesem Code kann je nach Komponente und Datenblatt andere interessante ADC-Messwerte ermöglichen, z. B. Differenzmessungen und Differenz-ADC-Messungen mit Verstärkung.

Dave X.
quelle