Arduino ADC Reference Voltage jika Bertenaga Baterai

9

Saya ingin memantau daya baterai ke Arduino menggunakan ADC-nya. Ini cukup mudah dan sederhana (terutama jika menggunakan API Arduino); Namun, jika baterai menyalakan Arduino dan tidak diatur secara eksternal, bukankah tegangan referensi ADC akan terus turun dengan baterai? Dengan kata lain, bukankah nilai ADC akan terus-menerus membaca nilai yang sama (nilai maks) meskipun baterai akan benar-benar mengalami penurunan tegangan?

Jika ini masalahnya, akan menjadi tidak efisien dan tidak ada gunanya untuk mengukur tegangan baterai.

ryeager
sumber

Jawaban:

4

... bukankah tegangan referensi ADC akan terus turun dengan baterai?

Ya, itulah mengapa Anda menggunakan atau mengukur referensi celah pita internal sebagai gantinya.

Gunakan analogReference()fungsi untuk memilih referensi yang sesuai untuk papan yang digunakan. Perhatikan bahwa Anda perlu menggunakan pembagi tegangan untuk mengurangi tegangan baterai ke nilai di bawah referensi yang dipilih jika Anda ingin mengukurnya.

Untuk mengukur tegangan bandgap bukan (menggunakan AV CC sebagai referensi dan bekerja "mundur") Anda akan perlu set MUX[3:0]di ADMUXuntuk 0b1110 dan kemudian melakukan ADC membaca langsung (set ADSCdi ADCSRAdan menunggu sampai ulang, kemudian membaca dari ADC[H:L]).

Seperti biasa, lihat lembar data MCU untuk detailnya.

Ignacio Vazquez-Abrams
sumber
Informasi hebat, sekarang saya pikir saya bisa melanjutkan sendiri. Saya berharap ada semacam referensi internal yang bisa digunakan. Seperti yang Anda sarankan, saya perlu membagi tegangan daya di bawah AVccref, namun, saya ingin memaksimalkan masa pakai baterai dalam semua aspek yang memungkinkan jadi saya akan menggunakan resistansi setara yang besar untuk pembagi untuk memastikan saya memiliki kurang dari satu uA arus bocor. Apakah Anda melihat ada masalah dengan ini?
ryeager
1
Impedansi ADC hanya 100Mohm. Pertimbangkan untuk mengukur referensi internal sebagai gantinya.
Ignacio Vazquez-Abrams
1
FYI Saya menemukan blog yang luar biasa ini setelah jawaban @Ignacio diposting: link
ryeager
1

Tautan @ ryeager ke http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 memiliki kode ini untuk membaca tegangan baterai 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
}

Kuncinya di sini adalah bahwa ia mengukur referensi internal 1.1V menggunakan tegangan baterai, dan kemudian membalikkannya untuk menghitung tegangan referensi yang tidak diketahui.

Sihir ADMUX dalam kode ini dapat mengaktifkan pembacaan ADC menarik lainnya, seperti pengukuran diferensial, dan pengukuran ADC diferensial dengan penguatan, tergantung pada komponen dan lembar data.

Dave X
sumber