ADCの分解能とは?|12bit・16bitで電圧をどうデジタル値に変換するのか

ADCの分解能とは? 12bitはなぜ4096段階? 計測シリーズ共通の背景と、アナログ波形から0〜4095のコードへ変換する概念図。 計測・電子回路

センサから1.23 Vの電圧が出ているとき、マイコンはそのまま「1.23 V」という数字を受け取るわけではありません。間にあるADCが、電圧を0〜4095のような整数のコードへ変換します。

では、12bitとは何を表していて、なぜ4096段階なのに最大値は4095なのでしょうか。読み取った値を電圧へ直すときの「4095で割るか、4096で割るか」も含めて整理します。

この記事では、特に断りがない限り、入力範囲が0〜基準電圧の理想的なADCを例にします。実際の入力範囲やコードの決まり方は、使用する製品のデータシートで確認してください。

ADCとは? 電圧をコードへ変換する回路

ADCはAnalog-to-Digital Converterの略で、アナログ量をデジタル値に変える回路です。マイコンに内蔵されているものも、独立した部品として使うものもあります。

電圧を整数のボルトへ丸めるのではなく、入力範囲を有限個の区間に分け、どの区間に入ったかをコードで表すと考えると分かりやすくなります。[1]

0〜3.3 Vのアナログ入力を12bit ADCが基準と比較し、0〜4095のコードへ変換する概念図。
図1:コードは電圧の区間に付けた番号。入力範囲と端点の扱いは製品によって異なります。

0〜3.3 Vを測る12bit ADCなら、0 Vは最小側、1.65 Vはおよそ2048、3.3 V付近は最大側のコードになる、というイメージです。コードから電圧へ換算するには、分解能と基準電圧が必要です。

12bitは4096通り。それなのに0〜4095なのはなぜ?

1bitで表せるのは0と1の2通りです。N bitなら組み合わせは2N通りになります。ここでは、0から始まる符号なし整数コードを使うADCとして考えます。[2]

分解能コード数コードの範囲
8 bit2560〜255
10 bit10240〜1023
12 bit40960〜4095
16 bit655360〜65535

12bitでは212 = 4096通り。番号を0から数えるので、最後の番号は4095です。0〜9にも10個の数字があるのと同じで、「個数」と「最大の番号」は1だけ違います。

0から9で10個、12bitでは0から4095で4096個。0〜3.3 Vの理想モデルで1 LSBは約0.806 mV。
図2:4096はコードの個数、4095は最大コードです。

1 LSBは何V? 電圧方向の1段の幅

LSBはLeast Significant Bit(最下位ビット)の略です。ADCの説明では、コードが1カウント変わる公称の電圧幅を「1 LSB」と呼びます。

入力範囲が0〜Vrefの理想的なN bit ADCなら、量子化幅ΔVは次の式です。「量子化」は、連続した値を有限の段階で表すことを指します。[3]

ΔV = Vref / 2N

Vref = 3.3 V、12bitなら、

ΔV = 3.3 V / 4096
≈ 0.0008057 V ≈ 0.806 mV

つまり、公称の1段の幅は約0.806 mVです。mVは1 Vの1000分の1。同じ入力範囲の16bitなら約50.4 μVとなり、理論上の刻みはさらに細かくなります。ただし、これは測定精度を保証する数字ではありません。

4096で割る? 4095で割る? 計算の意味を分ける

ここは「何を計算しているか」を分けると整理できます。

計算したいもの12bit・0〜Vrefの例
公称の量子化幅(1 LSB)Vref / 4096
0と最大コードを両端に対応させる単純換算V ≈ code × Vref / 4095

量子化幅では、先ほどの2N = 4096を使います。一方、下の式は「コード0を0 V、コード4095をVrefに対応させる」と決めた線形換算です。codeはADCから読み取った整数値を表します。

V ≈ code × Vref / (2N − 1)

こうした端点対応の換算は、Arduino公式の電圧読み取り例にも見られます。その10bitの例では、最大コード1023を使って換算しています。[4]

ただし、端点を合わせる式と、実際のADCの変換特性は同じとは限りません。例えばSTの資料には、12bitのコードと入力電圧の関係に4096を使う説明があります。最大コードが4095だからといって、実機の換算式の分母を必ず4095にするわけではありません。[3]

製品ごとに、コードが切り替わる電圧、各区間の代表値、測定範囲の上限の定義が異なります。実機ではデータシートの変換式・コード表に従うのが基本です。4095と4096を、同じ式の中で自由に入れ替えられるという意味ではありません。

ADC値2048を、電圧へ換算してみる

12bit、Vref = 3.3 V、code = 2048として、まず端点対応の単純換算を使います。

V ≈ 2048 × 3.3 V / 4095
≈ 1.6504 V(約1.65 V)

一方、「コードに1 LSBの幅を掛けた値を代表電圧にする」モデルなら、

V ≈ 2048 × 3.3 V / 4096
= 1.6500 V

となります。近い値ですが、換算の前提は違います。また、一つのコードには幅のある入力区間が対応するため、換算しても元の電圧を無限の細かさで復元できるわけではありません。ここでの数値は理想モデルの計算値で、実測値ではありません。

基準電圧Vrefは、電圧を測る物差し

Vrefはreference voltage、つまり基準電圧です。ADCが入力を比較する物差しにあたり、同じ入力電圧でも基準が変わればコードも変わります。

基準には、外付けの基準電圧源、内部の基準電圧、電源電圧を使う方式などがあります。Vref = 電源電圧とは限りません。また、差動入力や内部ゲインを持つADCなどでは、入力範囲も単純な0〜Vrefとは限りません。[1][3]

「3.3 Vで動くマイコンだから、ADCも必ず0〜3.3 Vを測る」と決めつけず、基準電圧と入力範囲の両方を確認しましょう。

分圧回路と組み合わせて、元の電圧を求める

測りたい電圧が0〜10 V、ADCの測定範囲が0〜3.3 Vなら、そのまま接続することはできません。そこで、分圧してからADCへ入力します。

抵抗2本で電圧を小さくする仕組みは、分圧回路とは? 抵抗2本で電圧が決まる仕組みで説明しています。ここでは、上側R1 = 22 kΩ、下側R2 = 10 kΩを使う理想的な例を引き継ぎます。

Vout = Vin × R2 / (R1 + R2)
= Vin × 10 / 32

10 V入力ならADCに入る電圧は3.125 V。逆に、ADC値から入力が2.0 Vと換算できたなら、元の電圧は次のように戻せます。

Vin ≈ Vout × 32 / 10
= 2.0 V × 3.2 = 6.4 V

0〜10 Vを22 kΩと10 kΩで0〜3.125 Vへ分圧。ADCコードを電圧に換算後、3.2倍して元の電圧を求める。
図3:「ADC値→ADC入力電圧→分圧比を戻す」の順に考えます。

例えば分圧比が1/3なら、2.0 Vは元の6.0 Vに相当します。ただしその比率では10 Vが約3.33 Vとなり、3.3 Vを超えます。測りたい最大電圧に合わせた比率が必要です。

実機では抵抗誤差、ADCの入力特性、信号が落ち着くまでの時間、過電圧への対策も確認します。分圧抵抗だけで入力保護が完全になるわけではありません。[3]

分解能と精度は違う

分解能は「どれだけ細かく刻めるか」、精度は「真の値にどれだけ近いか」です。細かい目盛りの物差しでも、目盛り自体がずれていれば正しく測れません。ADCも同じです。[5]

実際には、全体のずれ(オフセット誤差)、換算の傾きのずれ(ゲイン誤差)、理想特性からの曲がり(INL)、段ごとの幅のばらつき(DNL)、基準電圧の誤差、ノイズなどが関係します。[3]

したがって、12bit・3.3 Vで1 LSBが約0.806 mVでも、約0.806 mVの精度で測れるとは言えません。刻み幅と測定の正しさは、分けて考えます。

量子化誤差:同じ段に入った電圧は区別できない

連続した入力を段階で表すため、入力電圧とコードに対応する代表電圧には、一般にずれが生じます。これが量子化誤差です。同じ区間に入った細かな違いは、一つのコードだけでは分かりません。

入力電圧に対し近い代表電圧へ丸めた階段状の関係。飽和しない内側の区間ではずれの絶対値が最大0.5 LSBになる。
図4:横軸は時間ではなく入力電圧。理想的な丸めモデルの、端点から離れた部分を拡大しています。

最も近い代表値に丸める理想モデルでは、端点や飽和する領域を除き、誤差は±0.5 LSB以内です。代表値と入力が一致する点では、誤差は0になります。[6]

この範囲は量子化だけの話です。コードの定義や端点の扱いが違うモデルへ、そのまま当てはめることはできません。また、実機全体の誤差が必ず±0.5 LSBに収まるという保証でもありません。

16bitなら、12bitより必ず正確に測れる?

同じ入力範囲なら、16bitの理論上の刻みは12bitの1/16です。しかし、その細かさを生かせるかは、センサの精度、基準電圧の安定性、回路のノイズなどにも左右されます。

ADCには、ノイズやひずみを含む性能をビット数で表したENOB(有効ビット数)という指標もあります。公称16bitでも、実際に利用できる情報の細かさが16bit相当とは限りません。ENOBも、直流の測定精度そのものを保証する数字ではありません。[5]

必要な細かさに加え、取得速度やコストも見て選びます。「bit数が大きいほど、どんな測定でも正確になる」と考えないことが大切です。

分解能は電圧方向、サンプリングレートは時間方向

例えば12bit / 1 MS/sという仕様なら、二つの別の性能を示しています。

仕様意味
12bit電圧方向:4096通りのコード
1 MS/s時間方向:1秒間に100万回取得

分解能を高くしても、波形を時間方向に細かく取れるとは限りません。逆に、速く取得できても、電圧の刻みが細かいとは限りません。取得間隔との関係は、サンプリング周期とサンプリング周波数の違いで確認できます。

まとめ:段数・換算・精度を分けて考える

ADCは、入力電圧を有限個のコードへ変換します。12bitなら4096通りで、0から数えるため最大コードは4095です。

0〜Vrefの理想モデルでは、量子化幅はVref / 2N。一方、両端を対応させる単純換算には2N − 1を使います。何を求める式なのかを確認し、実機の電圧換算はデータシートに合わせるのが基本です。

そして、分解能は精度ともサンプリングレートとも別の性能です。分圧で入力範囲を合わせ、ADC値を電圧に直し、分圧比を戻す。この流れが分かると、センサの値を読むための土台ができてきます。

参考資料

[1]Microchip:A/D Converter (ADC) Basics

[2]Microchip:ADC Resolution Accuracy

[3]STMicroelectronics:AN2834 Rev 10(ADCの誤差・基準電圧・入力条件)

[4]Arduino:ReadAnalogVoltage 公式サンプル

[5]Texas Instruments:ADC Accuracy Part 1

[6]Texas Instruments:Real-Time Control Reference Guide(量子化誤差)

資料確認:2026年10月。図は説明のために独自作成した概念図、数値は理想条件での計算値です。特定製品での測定結果ではありません。

コメント

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