STM32 ADCのノイズ

STM32F10XなどのADMは12bitなので4096階調、3v3 /4096=0.0008V/setp

0.8mV程度はADCの変換の結果が揺れてもよいが、実際はその10mVの桁で下手するとゆれる。要因の切り分けと対策。オシロがないので、データを連続的に取り込んでの比較。

このテストには安定化1.50Vの電源を使っている。ただし、STM32への電源はPCバスを使っている(データ取り込みのためUSBに接続せざえる得ない)

【無対策:この上の青色】250点の標準偏差の平方根:0.02058392952

青が何も対策しない場合・・・ひどい。定常的に10mVぐらいは揺れているし、時折ピークが見える。なんかのクローストークなんでしょうね。

【対策:パスコン104挿入。この上の赤色】250点の標準偏差の平方根:0.002067946739

センサー側からのノイズをひらってしまって揺れているのを幾分かカット、効果はあり標準偏差(平方根)は一桁下がった。


【対策:プルアップ外部化。この下の黄色】250点の標準偏差の平方根:0.001570396705

パスコンを入れた状態で、同じ回路内に、スイッチの検出のために内部でプルアップしていると、そこからのリークにより増える説。グラフ上はほぼ同じだが、標準偏差を見ていると確かに若干の効果はあり。

【対策:デジタルフィルタ】


ADCを連続的に行って平均をとるとか、移動平均をとるとか統計処理をするのが考えられるんですが、最後はデジタルフィルタ。

ADC_array[1]=ADC_array[0] *0.8+0.2*ADC_buff[0];

ADC_array[0]=ADC_array[1];

V1[0]=ADC_array[0]/4095.0*3.3;

一つ前の値に、新しい値を2割だけ入れる。この割合でフィルター度合がきまるし、応答時間も決まる。パスコンを入れた状態で計測したのが↑の赤線。MUPを使う場合、メモリの制約などもあるため、簡単にというと一つの手法としては有効。(RCフィルタと同じなので振幅が大きいものを測定しようとすると注意が必要。)


【まとめ】250点の標準偏差の平方根を比べた結果

STD
Non0.02058392952
0.1uF0.00206794673
non Pull up0.00157039670
Digital filer0.00027732456

コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法