今日試しているのは次のコード。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にくらべて、オーバーサンプリングしたものはなめらかになっているような気がします。
面白いのが、データーにノイズがほとんど無いと
平均化しても階段状になってしまうのですけど、
データーにノイズが多い時には、きれいな線形状になるんですよね。
正確に量子化ビットを上げる場合はノコギリ波のオフセット信号を加えるんですけど、単純なノイズでもなかなか良い結果になったりしますね。
ただし、ノイズがサンプリング周期に同期化する周波数を含んでいる場合は、エイリアシング現象で階段状になりますが・・・。
この方法を使って会社でデータロガーが運用されはじめました。炉の温度モニターなんですけどね。