PR

オーバーサンプリングでADCの分解能を上げる仕組み 4倍で1bit増える理由と、効かない条件

ソフトウェア

マイコン内蔵の10bitや12bitのADCで、もう少し細かく測りたい。そんなときに、外付けのADCを足さずに使えるのがオーバーサンプリングです。何回も測って足し合わせるだけで分解能が上がるという、少し不思議な手法です。

  • なぜ「4倍測ると1bit増える」のか?
  • ただの平均と何が違うのか?
  • ノイズがないと効かない、というのは本当か?
  • どこまで分解能を上げられるのか?

この記事では、仕組みと限界をQ&A形式で整理します。

先に結論

  • ランダムなノイズは、N回の平均で1/√Nに減ります。4回でノイズが半分になり、これが1bit分にあたります。
  • 分解能をnbit増やすには、4n回測って足し合わせ、2nで割ります。
  • 入力にノイズがまったくないと効きません。1〜2LSB程度のランダムなノイズが必要です。
  • 上がるのは分解能だけです。直線性やゲイン誤差といった精度は変わりません。

Q1. オーバーサンプリングとは何か?

A. 必要な回数よりも多く測定し、その結果をまとめることで、ADC本来のbit数より細かい分解能を得る手法です。

たとえば1秒に10回の測定値がほしいとき、ADCを1秒に160回動かして、16回分をひとつの値にまとめます。速度を分解能に交換している、と考えると分かりやすいです。

Q2. なぜ4倍測ると1bit増えるのか?

A. ランダムなノイズは、4回の平均で半分になるからです。ノイズが半分になれば、区別できる電圧の差も半分になります。

互いに無関係なランダムなノイズをN回分平均すると、ノイズの大きさは1/√Nになります。

  • 4回の平均:ノイズは1/2(約6dB改善)
  • 16回の平均:ノイズは1/4(約12dB改善)

ADCの1bitは約6dBに相当するので、4倍で1bit、16倍で2bitという関係になります。分解能をnbit増やすのに必要な回数は4n回です。

増やすbit数必要な回数12bit ADCの場合元が毎秒1万回のときの出力
+1bit4回13bit毎秒2,500回
+2bit16回14bit毎秒625回
+3bit64回15bit毎秒約156回
+4bit256回16bit毎秒約39回

1bit増やすたびに速度が4分の1になります。欲張るほど、急速に遅くなります。

Q3. ただの平均と何が違うのか?

A. やっていることはほぼ同じです。違いは「割る数」で、小数点以下を捨てずに残す点にあります。

12bitのADCで16回測り、合計を16で割ると、結果は0〜4095の整数に戻ります。せっかく平均で得られた小数点以下の情報が、整数に丸めるときに消えてしまいます。

オーバーサンプリングでは、16回の合計を16ではなく4で割ります。すると結果は0〜16380の範囲になり、14bit相当の値として使えます。

// 12bit ADCを16回読んで、14bitの値を得る
uint16_t readAdc14bit(void) {
  uint32_t sum = 0;
  for (int i = 0; i < 16; i++) {
    sum += readAdc();   // 0〜4095
  }
  return sum >> 2;      // 16ではなく4で割る(右に2bitシフト)
}

一般的には「4n回を足し合わせて、右にnbitシフトする」という手順です。浮動小数点で平均を計算して小数点以下を残すなら、結果は同じことです。

Q4. ノイズがないと効かない、というのは本当か?

A. 本当です。入力が完全に静かだと、何回測っても同じ値しか出ないので、平均しても何も変わりません。

本当の値が「コード100.3」に相当する電圧だとします。

  • ノイズがない場合:ADCは毎回100を出力します。100回測っても平均は100で、0.3の部分は永久に分かりません。
  • ノイズがある場合:ADCの出力は99、100、101などを行き来します。100.3に近い電圧なので、101より100が出る回数のほうが多くなり、たくさん平均すると100.3に近づきます。

ノイズが入力電圧を揺らしてくれるおかげで、「隣のコードとの間のどのあたりにいるか」という情報が出現頻度として現れるわけです。

効くための条件

  • ノイズの振れ幅が1〜2LSB程度以上あること
  • ノイズがランダムで、測定のたびに無関係に変化すること
  • まとめる間、測りたい信号そのものは変化しないこと

マイコン内蔵のADCは、もともと数LSBのノイズを持っていることが多く、何もしなくても条件を満たしている場合がよくあります。ノイズが小さすぎる場合は、わざと小さなノイズや三角波を入力に加える方法があります。これをディザと呼びます。

Q5. オーバーサンプリングで改善しないものは何か?

A. ランダムではない誤差は、何回平均しても減りません。

誤差の種類改善するか理由
ランダムなノイズ ○ 平均で打ち消し合う。
オフセット誤差、ゲイン誤差、基準電圧の誤差 × 毎回同じ方向にずれるので、平均しても残る。
INL(直線性の誤差) × ADCの特性そのものの曲がりなので、平均では直らない。
電源のリップルや商用電源のハム △ 周期的なノイズなので1/√Nでは減らない。ただし下記の工夫で消せる。
温度によるドリフト、ゆっくりした変動 × まとめる時間より長い周期の変動は、そのまま残る。

つまり、上がるのは分解能であって、精度ではありません。12bitのADCを16bit相当にしても、直線性が12bit相当なら、絶対値の正確さは12bitのままです。

ハムノイズは、まとめる時間を合わせると消せる

商用電源のハムのような周期的なノイズは、まとめる時間をその周期の整数倍にすると打ち消せます。50Hzなら20ミリ秒、60Hzなら約16.7ミリ秒です。100ミリ秒にすれば、50Hzの5周期分、60Hzの6周期分になり、どちらの地域でも効きます。

Q6. 実際には何bitくらいまで増やせるのか?

A. マイコン内蔵のADCでは、+2〜3bitあたりが実用的な範囲です。

計算上は回数を増やせばいくらでも増やせますが、実際には次の壁に当たります。

  • 回数を増やすほど測定時間が延び、その間に温度や電源がゆっくり変動します。この変動は平均では減りません。
  • ノイズが減ってくると、それまで隠れていた直線性の誤差が目立つようになります。
  • 速度が4分の1ずつ落ちるので、必要な応答速度を満たせなくなります。

もっと高い分解能が必要なら、最初から高分解能のADC(ΔΣ型など)を使うほうが確実です。

Q7. ΔΣ(デルタシグマ)型ADCとは、どう関係するのか?

A. ΔΣ型は、オーバーサンプリングを前提に設計されたADCです。さらに「ノイズシェーピング」という仕組みで、効率を大きく高めています。

単純なオーバーサンプリングでは、速度を4倍にして得られるのは1bitです。ΔΣ型は、量子化で生じるノイズを高い周波数側に追いやり、あとからデジタルフィルタで取り除きます。これにより、速度を2倍にするごとに、1次の構成で約1.5bit、2次の構成で約2.5bitの改善が得られます。

同じ「たくさん測ってまとめる」でも、ΔΣ型のほうがはるかに効率よく分解能を稼げるわけです。

Q8. マイコン側に専用の機能はあるか?

A. ハードウェアでオーバーサンプリングを行う機能を持つマイコンがあります。

たとえばMicrochipのSAMシリーズの一部は、ADCにオーバーサンプリングとデシメーションの機能を持ち、12bitの結果を最大16bitまで拡張できます。STM32にも、同様の機能を持つシリーズがあります。

ハードウェアで処理すると、プログラム側の負荷が減り、測定のタイミングも正確に揃います。使っているマイコンのADCに「オーバーサンプリング」や「アベレージング」の設定がないか、一度確認してみる価値があります。

まとめ

  • 4n回測って足し合わせ、2nで割ると、分解能がnbit増える。
  • 入力に1〜2LSB程度のランダムなノイズがあることが条件。
  • 改善するのはランダムなノイズだけ。オフセット、ゲイン、直線性の誤差は残る。
  • ハムノイズは、まとめる時間を電源周期の整数倍にすると消せる。
  • 内蔵ADCでは+2〜3bitが実用的な範囲。それ以上はΔΣ型ADCを検討する。

参考資料

コメント

タイトルとURLをコピーしました