ESP32には12bitのADコンバータが内蔵されています。どうも変換ノイズが大きいなと思ったらADピンと電源のどちらも対策が必要でした。
AD変換ノイズを調べてみる
ボリウムだけ接続
5kΩのボリウムで電源を分圧して作った1.000VをAD変換します。2000回サンプリングして、最小値と最大値の差、標準偏差、平均値を求めてみます。
#define AD_PIN 34 #define N 2000 void setup() { Serial.begin(115200); delay(100); analogSetAttenuation(ADC_6db); //ATT -6dB pinMode(AD_PIN, ANALOG); } void loop() { short adMax = 0; short adMin = 4096; short adValue[N]; float adMean = 0.0; long adMillivoltTemp = 0; for ( int i = 0 ; i < N ; i++ ) { adValue[i] = (short)analogRead(AD_PIN); if ( adValue[i] > adMax ) adMax = adValue[i]; if ( adValue[i] < adMin ) adMin = adValue[i]; adMean += adValue[i]; adMillivoltTemp += (long)analogReadMilliVolts(AD_PIN); } adMean /= N; //Average float adStd = 0.0; for( int i=0 ; i<N ; i++ ) { adStd += ( (float)adValue[i] - adMean )*( (float)adValue[i] - adMean ); } adStd = sqrt( adStd/N ); //Standard deviation float adMillivolt = (float)((double)adMillivoltTemp / (double)N); //mV Average Serial.printf("min:%d max:%d delta:%d std:%.1f mean:%d mV:%d\n", adMin, adMax, adMax - adMin , adStd, (int)(adMean+0.5) , (int)(adMillivolt+0.5)); }
上のプログラムを実行し、シリアルモニターに出力された結果がこちらです。
2000回測定したときの、変換のノイズの大きさと標準偏差は
標準偏差:12〜15
となりました。結構大きな変換ノイズですね。フルスケールで4095なので、1割程度ノイズが乗っているということになります。
ADピンに100nFのコンデンサ追加
ADピンに100nFのバイパスコンデンサを追加しました。
標準偏差:7.5〜9
コンデンサがない場合に比べ、変換ノイズが減りました。
ADピンに10uFのコンデンサを追加
ADピンのコンデンサの値を100nFから10uFに増やしてみます。
標準偏差:9〜11
バイパスコンデンサを100nFから10uFに増やしたのに、変換ノイズが増えています。
ADピンに470uFのコンデンサを追加
ADピンのコンデンサを10uFから470uFへと増やしてみます。
標準偏差:9〜13
10uFから470uFへと増やしたにも関わらず、10uFの場合よりも変換ノイズが悪化しています。
ADピンへ追加したコンデンサの容量が増えるに従って、ADピンへ供給される電圧は安定化するはずなのですが、反対に変換ノイズが増加する現象が見られます。
こんな時は、電源を疑ってみます。
電源にバイパスコンデンサを追加してみる
電源に100uFを追加
ESP32の電源3.3VとGNDの間に100uFのコンデンサを追加してみます。ADピンにはコンデンサは付けていません。
標準偏差:9〜12
電源にコンデンサを追加することで、変換ノイズが減少しました。
電源に470uFを追加
電源のコンデンサを100uFから470uFへと増やしてみます。
標準偏差:8.5〜11
電源のコンデンサを100uFから470uFへと増やすことで、さらに少しだけ標準偏差が小さくなりました。
電源へのコンデンサの追加は効果がありそうです。また容量が大きい方が効果があることがわかりました。
電源とADピン両方にコンデンサを追加する
電源に容量の大きいコンデンサを追加することで、変換ノイズが軽減しました。それでは、電源とADピン両方にコンデンサを追加した場合はどうでしょう。電源のコンデンサは470uFとして、ADピンに接続するコンデンサの容量を変化させてみます。
ADピンに100nFを追加
標準偏差:6.5〜7.5
電源とADピンと両方にコンデンサを追加することで、より変換ノイズが低下しました。
ADピンに10uFを追加
標準偏差:6.0〜8.0
ADピンの容量を100nFから10uFへと増やしましたが、ほとんど変化はみられません。
ADピンに470uFを追加
標準偏差:6.5〜8.0
10uFから470uFにしても変換ノイズはほとんと変わりませんでした。
変換ノイズを低減するには
これまでの結果をまとめると、
- 電源には大きな容量(470uF程度)のコンデンサを追加する
- ADピンには100nFのコンデンサを追加すれば十分である
ということになりました。
2000回AD変換した時の、コンデンサがない場合では
標準偏差:12〜15
電源に470uF、ADピンに100nF追加した場合
標準偏差:6.5〜7.5
と、変換ノイズが約半分になりました。
電源とADピン両方にコンデンサを追加することで、AD変換のビット幅を1bit得することができました。
コメント