バッテリー駆動の場合のArduino ADC基準電圧


9

ADCを使用してArduinoへのバッテリー電源を監視する可能性があります。これはかなり単純明快でシンプルです(特にArduino APIを使用している場合)。ただし、バッテリーがArduinoに電力を供給していて、外部で調整されていない場合、ADCの基準電圧はバッテリーとともに常に低下していませんか?言い換えれば、バッテリの電圧が実際に低下している場合でも、ADC値は常に同じ値(最大値)を読み取らないのではないでしょうか。

この場合、バッテリ電圧を測定することは非効率的で無意味です。

回答:


4

... ADCの基準電圧は常にバッテリーで低下していませんか?

はい、代わりに内部バンドギャップリファレンスを使用または測定します。

analogReference()関数を使用して、使用中のボードに適したリファレンスを選択します。測定したい場合は、分圧器を使用してバッテリー電圧を選択したリファレンスの値よ​​りも低い値に下げる必要があることに注意してください。

代わりにバンドギャップ電圧を測定するには(AV CCを基準として使用し、「逆方向」に動作)、0b1110 に設定MUX[3:0]してADMUXから、ADCの読み取りを直接実行する必要があります(設定ADSCADCSRAてリセットするまで待ってから、から読み取りますADC[H:L])。

いつものように、詳細についてはMCUデータシートを参照してください。


すばらしい情報です。今、自分で進めることができると思います。使用できるある種の内部参照があることを期待していました。あなたが示唆したように、電源電圧をAVccref未満に電圧分割する必要がありますが、可能な限りすべての面でバッテリ寿命を最大化するため、分圧器に大きな等価抵抗を使用して、漏れ電流のuA。これに問題はありますか?
ライジャー14年

1
ADCのインピーダンスはわずか100Mオームです。代わりに内部リファレンスを測定することを検討してください。
Ignacio Vazquez-Abrams 14年

1
参考までに、@ Ignacioが投稿した回答の後にこの素晴らしいブログを見つけました: リンク
ryeager

1

http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836への@ryeagerのリンクには、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
}

ここでの秘訣は、バッテリー電圧を使用して1.1Vの内部リファレンスを測定し、それを反転して未知のリファレンス電圧を計算することです。

このコードのADMUXマジックは、コンポーネントやデータシートに応じて、差動測定やゲイン付きの差動ADC測定など、他の興味深いADCの読み取りを可能にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.