2016-12-18 12 views
0

Arduino Mini Pro 3.3Vを使用すると、ADCの内部リファレンス電圧とデフォルト電圧リファレンスを切り替える際に問題が発生しました。 VCCを計算するための分圧器[GND - 110kOhm - A2 - 500kOhm - VCC]の出力を測定したいと考えています。 VCCは3.3Vと測定されています。電圧レギュレータによって提供されます。Arduino Mini Pro 3.3VはADCの1.1V内部リファレンスを使用していません

ループでは、最初に内部リファレンスを使って分圧器出力を測定し、その後はデフォルト電圧リファレンスを使って測定します。 analogReference()を呼び出した後、最初の読み取り値を無視することをお勧めします(analogReference() documentation)。私はこれらのガイドラインに従います。

Iは最小例スケッチを提供します:ADC結果の最初の対が(184分の553)が正しいと思われるが、次の反復の最初の値は、上の実際の電圧を変化させることなく、故障している

// the setup function runs once when you press reset or power the board 
void setup() 
{ 
    pinMode(A2, INPUT); // ADC pin 
    Serial.begin(9600); 
    Serial.println("----------------"); 
} 

void burn8Readings(int pin) 
{ 
    for (int i = 0; i < 8; i++) 
    { 
    analogRead(pin); 
    } 
} 

// the loop function runs over and over again forever 
void loop() 
{ 
    uint16_t nResult1, nResult2; 

    analogReference(INTERNAL); // set the ADC reference to 1.1V 
    delay(10);     // idle some time 
    burn8Readings(A2);   // make 8 readings but don't use them to ensure good reading after ADC reference change 

    nResult1 = analogRead(A2); // read actual value 

    analogReference(DEFAULT);  // set the ADC reference back to internal for other measurements 
    delay(10);     // idle again 
    burn8Readings(A2);   // make 8 readings but don't use them to ensure good reading after ADC reference change 

    nResult2 = analogRead(A2); // do other measurements 

// print result to serial interface.. 
    Serial.print("1: "); 
    Serial.print(nResult1); 
    Serial.print(" - 2: "); 
    Serial.println(nResult2); 

    delay(2000); 
} 

をADCピン。 (240/183) DEFAULTリファレンスのADC結果は常に良好です。

2.56Vリファレンスの場合、240の値が実現可能です。私はいくつかのATmegasが2.56Vのリファレンス電圧を使用していることを知っていますが、ATmega328は1.1Vしか持たないはずです。不思議なことに(ATmega328/P datasheet)は、28.7章のADCの例で2.56Vリファレンスを記述しているので、私は混乱しています。

特定のATmega328pバージョンに2.56V ADCリファレンスが存在する可能性はありますか?

+1

...誰ももうこれに時間を費やす必要がありません願っています:あなたは、実行時に基準電圧を変更する必要がありますなぜですか?あなたのアプリケーションが正確なリファレンスを必要とする場合は、すべてのメジャーのためにinternalに設定しなければならないと思います。(セットアップでリファレンスを設定して決して変更しないでください) – frarugi87

+0

私の最小限のスケッチで、VCCを2回測定しました。そこでは、基準電圧を切り替える理由がわからないことを認めなければなりません。 実際のアプリケーションでは、GNDとVCCの間の電圧分割器として機能する他のセンサーを読みたいと思います。 ADCのリファレンス電圧と同じVCCを使用することで、実際のVCCとは独立して測定値を解釈することができます。 – random

+0

そしてさらに安定したリファレンスで何かを測定する必要があります。それは全く合理的です。ありがとうございました – frarugi87

答えて

0

2.56Vとの類似性は、データシート(または私の理解)の偶然とおそらくエラーでした。 問題は、analogReference(INTERNAL)呼び出しの後、ADC値を直ちに読み取らなければならないことでした。私がやったように数ミリ秒後ではありません。 (Source

また、ダミー読み出しを行ってから数ミリ秒を待つことも重要です。私にとっては、1回の読み出しと遅延(5)だけで十分でしたが、ADCのコンデンサに残っている電荷に依存していると思います。

正しい順序は次のとおりです。

analogReference(INTERNAL); // set the ADC reference to 1.1V 
    burn8Readings(A2);   // make 8 readings but don't use them 
    delay(10);     // idle some time 
    nResult1 = analogRead(A2); // read actual value 

とバックDEFAULTへの参照を変更する

analogReference(DEFAULT);  // set the ADC reference back to internal 
    burn8Readings(A2);   // make 8 readings but don't use them 
    delay(10);     // idle again 
    nResult2 = analogRead(A2); // read actual value 

少ない傾向のようです...が、少なくとも1つの読み出しは、まだ正確な結果を得るために必要でした。

私はちょうど1コメント

関連する問題