マイコン内蔵の10bitや12bitのADCで、もう少し細かく測りたい。そんなときに、外付けのADCを足さずに使えるのがオーバーサンプリングです。何回も測って足し合わせるだけで分解能が上がるという、少し不思議な手法です。
この記事では、仕組みと限界をQ&A形式で整理します。
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万回のときの出力 |
|---|---|---|---|
| +1bit | 4回 | 13bit | 毎秒2,500回 |
| +2bit | 16回 | 14bit | 毎秒625回 |
| +3bit | 64回 | 15bit | 毎秒約156回 |
| +4bit | 256回 | 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を検討する。


コメント