ADCの電圧への変換は、+ 5 Vピンの実際の値に依存していますか?


13

質問:

  1. ADCカウントの電圧への変換は、+ 5 Vピンの実際の電圧に依存しますか?
  2. はいの場合、ボードからその電圧を取得するための一般的な方法は何ですか?

背景/詳細:

USBコネクター(ハブ)からArduino Nano(クローン)を実行している回路があります。Arduinoの仕事は、Nanoによってオン/オフに切り替えられた2番目の回路を駆動するバッテリーの電圧を測定することです。参考のため、バッテリーテスターです。

試験回路

下の非常に簡単なスケッチの電圧を表示するNokia 5110画面があります。

void setup() {
  Serial.begin(9600);
  display.begin();
  // Init done

  // You can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  // Text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
}


void loop() {
  display.clearDisplay();   // Clears the screen and buffer
  display.setCursor(0,0);
  display.print("Vin=");
  int rawVIN = analogRead(VIN);
  float floatVin = (rawVIN*4.75)/1023.0;
  display.println(floatVin);
  Serial.println(rawVIN);
  display.display();
  delay(1000);
}
  • DVMを使用してバッテリーの電圧を測定したところ、4.13 Vでしたが、Nanoは4.35 Vと報告しています。
  • バッテリーとArduinoの間に共通のグラウンドがあります。
  • 電圧をテストするための接続がフローティングになる可能性があるため、プルダウン抵抗を使用して、大きな変動(> 10kΩ)を停止します

いくつかの調査の後、+ 5 Vが実際に4.75 Vを出力していることがわかり、スケッチを

float v = (rawVIN*5.0)/1024.0;

float v = (rawVIN*4.75)/1024.0;

そして、Arduinoの電圧測定値が正しくなりました。私がやったことを理解しているからではなく、値を正しい値に変更するかもしれないという予感があったので、私はこれをしました。


3
サイドとしては、1023 ではなく 1024で割る必要があります。これは、Arduinoの例にある間違いに起因する、繰り返し繰り返される間違いです。ソース?AVRのデータシート。
トムカーペンター

@TomCarpenterこれは計算に手探りし、かなり長い時間机に頭をぶつけた後に何かを読んだ結果だと思います-私は1024から始めましたが、あなたが見るように1023で終わった-私は私の質問を修正します。
カリブー

回答:


16

Arduino内のADCは電圧を測定するのではなく、電圧比を測定します。つまり、アナログ入力の電圧とVrefピンの電圧の比です。

デフォルト設定では、Vrefピンは内部で+5 Vラインに接続されています。代わりにVrefとして内部参照を使用することを選択できます。

analogReference(INTERNAL);

この基準は約1.1 Vであり、+ 5 Vの変動の影響を受けません。問題は、基準より高い電圧を測定できないことです。

バッテリーテスターで何らかの「絶対」測定が必要な場合は、内部リファレンスと分圧器を使用して、測定電圧が1.1 V未満であることを確認できます。

編集:分圧器を必要としない別のオプションは、Vccをリファレンスとして使用してアナログ入力と内部1.1 V「バンドギャップ」リファレンスの両方を測定することです。Vccに対して1.1 Vを測定することは、Vccを測定する間接的な方法です。これはArduinoコアライブラリではサポートされていませんが、ADCの制御レジスタを直接プログラミングすることでサポートできます。

// Return the supply voltage in volts.
float read_vcc()
{
    const float V_BAND_GAP = 1.1;     // typical
    ADMUX  = _BV(REFS0)    // ref = Vcc
           | 14;           // channel 14 is the bandgap reference
    ADCSRA |= _BV(ADSC);   // start conversion
    loop_until_bit_is_clear(ADCSRA, ADSC);  // wait until complete
    return V_BAND_GAP * 1024 / ADC;
}

起動後の最初の読み取り値は偽物である可能性があることに注意してください。


迅速な返信をありがとう:)これは今では完全に理にかなっており、コード(ファッジ)調整によって正しい答えが得られる理由を説明しています。これとenricsの回答を組み合わせることで、継続するために必要なすべてが得られます。
カリブー

9

USB駆動のArduino Nanoには、入力USB電圧の許容誤差が+/- 5%であるため、信頼できないADC電圧リファレンスがあります。その上、NanoにはMBR0520ショットキーダイオード(D1)があり、製造許容誤差、温度、およびボードの消費電流に応じて0.1〜0.5 Vの間で低下します。

あなたはそれについて何ができますか?

Arduino Nanoに搭載されているMCUはATmega328Pです。NanoのADCは、利用可能な複数のリファレンスに従ってアナログ電圧の測定値をスケーリングできます(そして、より適切なリファレンスを選択できます)。これはanalogReference (type)関数を介して行うことができ、次の参照から選択しますtype

  • デフォルト:5ボルト(5 V Arduinoボード上)または3.3ボルト(3.3 V Arduinoボード上)のデフォルトアナログリファレンス
  • 内部:ATmega168またはATmega328で1.1ボルト、ATmega8で2.56ボ​​ルト(Arduino Megaでは使用不可)に等しい内蔵リファレンス[...]
  • 外部:AREFピンに印加される電圧(0〜5 Vのみ)が基準として使用されます。

ソース:analogReference

これはATmega328の内部のADC回路図であり、そこで何が起こっているのかを見ることができます。

ATmega328P ADCブロック

出典:ATmega328データシート

したがって、簡単な解決策は、測定したい電圧が内部1.1 V基準を下回るように弱い分圧器を構築し、それにanalogReference応じて構成することです。

分圧器は弱い(Rの値が高い)必要がありますので、バッテリーからあまり多くの電流を引き出さないようにしますが、ADC入力インピーダンスによって負荷がかかるほど弱くはなりません。

ボーナス

ただし、ATmega328の内部1.1 Vバンドギャップリファレンスよりも高い電圧リファレンスが必要な場合は、まだうまくいきません。オプションは、オンボードFT232RLからの3.3 V LDOレギュレータ出力を使用することです。これは、ヘッダーのピン14で利用できますが、信頼できるとは思いません。FT232RLのデータシート 3.0で指定し、それを- 3.6 V(公称3.3V)

したがって、普遍的な解決策は、安価なTL431に基づいて外部電圧リファレンスを構築することです。これにより、+ /-1%の精度で、4.0〜4.25 Vまでの信頼できる基準を得ることができます。

外部電圧リファレンス回路はこれと同じくらい簡単です(TL431はブレッドボードに優しいTO-92パッケージで入手可能です!):

TL431ベースのシャント電圧レギュレータ


この包括的な回答と、私が取り上げることができるすべての選択肢に感謝します。おそらく、単純に進み、分圧器を使用して入力を0〜1.1の間にスケーリングします。抵抗値に関するヒントは私にとって貴重でした-ありがとう
カリブー

3

Atmega328PにADCコンバーターに関するページがあります。少し下のページで、電圧リファレンスについて説明します。TL431チップを使用して、さまざまな基準電圧(4Vなど)を提供できます。

4V電圧リファレンス

抵抗を変更することで、他の電圧を得ることができます(4.2V付近が必要なようです)。

出力電圧は、入力電圧(この場合は5V)の影響を受けません。

リンクされたページには、抵抗値の選択方法が記載されています。


2

adcカウントの電圧への変換は、+ 5vピンの実際の電圧に依存しますか?

yesおよびno:adcモジュールはVrefを考慮します。Vrefは、Vddを介して内部または外部から供給できます。

はいの場合、ボードからその電圧を取得するために受け入れられている方法は何ですか?

adcモジュールを構成します。デバイスのデータシートには、そのために設定する必要があるレジスタ/ビットが必要です。

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