日々の記録

ほどよく書いてきます。

マイコン内蔵10bit ADC オーバーサンプリングのテスト

2013年11月23日 01時00分24秒 | その他雑記

今日試しているのは次のコード。Arduino UNO R3でやってます。
やってる内容は簡単。ADCを4096回行ってパソコンにデータ送信。
4096回のサンプリングの間に測定対象の値が多少ふらつくはずなので、そのふらつきを後から平均したら、見かけは10bit以上の分解能が得られる。んじゃないかと思うのね。
そこで、やってみるわけです。ArduinoのADCは115μs程必要らしいので、4096回行って約0.5秒、それぞれのADCの間に120us混ぜると大体1秒ごとにデータをパソコンに送り出してくれる訳です。
4096回積算しているので、値そのものの分解能は元の10bitを更に12bit相当加算しているので、なんと22bit。しかし今回はどの程度の分解能があるのかのチェックなのでまあ適当に値を決めました。これでどの程度なめらかに値が出てくれるか楽しみです。

ちなみに、アナログ信号源としてはゆっくり変動する値として、LM35の出力を使っています。

パソコン側ではひたすらシリアルポートのバッファを見ているので、出力する値は@と改行マークに挟むことにした。データ転送している間にバッファ読みに行くとデータが切れちゃうのでね。データ送信終わったら割り込み、ってなことができたらいいけどエクセルVBAじゃ限界がありますね。

unsigned long sensorValue32bit; //32bit 変数
void setup() {
  Serial.begin(9600);
}
void loop() {
  sensorValue32bit =0;
  for(unsigned int i =0;i<4096;i++){
    sensorValue32bit += analogRead(A0);
    delayMicroseconds(120);
  }
  Serial.print("@");
  Serial.println(sensorValue32bit);
}

これで一晩データをとってみてどうなるか調べてみた。ADC_10bitは10ビットADCのときの分解能を階段状にしてます。
10bit ADCにくらべて、オーバーサンプリングしたものはなめらかになっているような気がします。
 

コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 2013 F1 日本グランプリ | トップ | 疑似MPPTのトライ »

2 コメント

コメント日が  古い順  |   新しい順
ノイズ (いち)
2013-11-26 00:45:28
この手法、データー整理に私も良く利用しました。

面白いのが、データーにノイズがほとんど無いと
平均化しても階段状になってしまうのですけど、
データーにノイズが多い時には、きれいな線形状になるんですよね。

正確に量子化ビットを上げる場合はノコギリ波のオフセット信号を加えるんですけど、単純なノイズでもなかなか良い結果になったりしますね。

ただし、ノイズがサンプリング周期に同期化する周波数を含んでいる場合は、エイリアシング現象で階段状になりますが・・・。
返信する
のいず (まこち)
2013-12-16 23:59:35
そうですね。1LSB程度のノイズがないと動きませんね。なので、人為的にノイズを入れたかったのですがいい方法が思いつかなくて。

この方法を使って会社でデータロガーが運用されはじめました。炉の温度モニターなんですけどね。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

その他雑記」カテゴリの最新記事