スポンサーリンク
Translate

ESP32のADCの変換ノイズを減らすにはADピンと電源の両方にコンデンサが必要でした

スポンサーリンク

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回測定したときの、変換のノイズの大きさと標準偏差は

変換ノイズの大きさ:300〜400
標準偏差:12〜15

となりました。結構大きな変換ノイズですね。フルスケールで4095なので、1割程度ノイズが乗っているということになります。

ADピンに100nFのコンデンサ追加

ADピンに100nFのバイパスコンデンサを追加しました。

変換ノイズの大きさ:120〜200
標準偏差:7.5〜9

コンデンサがない場合に比べ、変換ノイズが減りました。

ADピンに10uFのコンデンサを追加

ADピンのコンデンサの値を100nFから10uFに増やしてみます。

変換ノイズの大きさ:150〜240
標準偏差:9〜11

バイパスコンデンサを100nFから10uFに増やしたのに、変換ノイズが増えています。

ADピンに470uFのコンデンサを追加

ADピンのコンデンサを10uFから470uFへと増やしてみます。

変換ノイズの大きさ:170〜250
標準偏差:9〜13

10uFから470uFへと増やしたにも関わらず、10uFの場合よりも変換ノイズが悪化しています。

ADピンへ追加したコンデンサの容量が増えるに従って、ADピンへ供給される電圧は安定化するはずなのですが、反対に変換ノイズが増加する現象が見られます。

こんな時は、電源を疑ってみます。

スポンサーリンク

電源にバイパスコンデンサを追加してみる

電源に100uFを追加

ESP32の電源3.3VとGNDの間に100uFのコンデンサを追加してみます。ADピンにはコンデンサは付けていません。

変換ノイズの大きさ:180〜250
標準偏差:9〜12

電源にコンデンサを追加することで、変換ノイズが減少しました。

電源に470uFを追加

電源のコンデンサを100uFから470uFへと増やしてみます。

変換ノイズの大きさ:180〜270
標準偏差:8.5〜11

電源のコンデンサを100uFから470uFへと増やすことで、さらに少しだけ標準偏差が小さくなりました。

電源へのコンデンサの追加は効果がありそうです。また容量が大きい方が効果があることがわかりました。

スポンサーリンク

電源とADピン両方にコンデンサを追加する

電源に容量の大きいコンデンサを追加することで、変換ノイズが軽減しました。それでは、電源とADピン両方にコンデンサを追加した場合はどうでしょう。電源のコンデンサは470uFとして、ADピンに接続するコンデンサの容量を変化させてみます。

ADピンに100nFを追加

変換ノイズの大きさ:140〜180
標準偏差:6.5〜7.5

電源とADピンと両方にコンデンサを追加することで、より変換ノイズが低下しました。

ADピンに10uFを追加

変換ノイズの大きさ:135〜170
標準偏差:6.0〜8.0

ADピンの容量を100nFから10uFへと増やしましたが、ほとんど変化はみられません。

ADピンに470uFを追加

変換ノイズの大きさ:150〜220
標準偏差:6.5〜8.0

10uFから470uFにしても変換ノイズはほとんと変わりませんでした。

スポンサーリンク

変換ノイズを低減するには

これまでの結果をまとめると、

  • 電源には大きな容量(470uF程度)のコンデンサを追加する
  • ADピンには100nFのコンデンサを追加すれば十分である

ということになりました。

2000回AD変換した時の、コンデンサがない場合では

変換ノイズの大きさ:300〜400
標準偏差:12〜15

電源に470uF、ADピンに100nF追加した場合

変換ノイズの大きさ:140〜180
標準偏差:6.5〜7.5

と、変換ノイズが約半分になりました。

電源とADピン両方にコンデンサを追加することで、AD変換のビット幅を1bit得することができました。