※本記事にはプロモーション(広告)が含まれています。
ADC(エーディーコンバータ)の分解能は「1段の細かさ」で、10ビットなら1段=基準電圧÷1024 です。5V 基準なら 4.88mV、内部 1.1V 基準なら 1.07mV で、ビット数と基準電圧ごとの値は早見表、基準電圧の選び方は3つの基準の節へ。
マイコンでセンサの値を読むとき、最初に出会う部品が ADC です。データシートには「10ビット」「VREF」「10kΩ」と書いてありますが、それが何を意味するのかは書いてありません。
この記事では、Arduino Uno にも載っている ATmega328P を例に、データシートの数字を1つずつ計算しながら、ADC の基本を図で説明します。

ADCは電圧を数字に変える部品
ADC は、0〜5V のような電圧を、0〜1023 のような数字に変えます。マイコンのプログラムは電圧をそのまま扱えないので、ADC で数字にしてから計算します。
マイコンの端子は、ふだんは「HIGH か LOW か」の2通りしか見分けません。ADC につながった端子(Arduino Uno なら A0〜A5)だけは、その間の電圧を細かく数字にできます。
例えば 5V 基準・10ビットの ADC に 1.65V を入れると、1.65×1024÷5=337.9 なので、読みは 337 です。小数は切り捨てになります。
A/D 変換のしくみ(標本化・量子化・符号化)そのものを知りたい人は、電験三種の理論の記事に図でまとめています。
A/D 変換を、標本化・量子化・符号化の3つの手順で図解
つまり、ADC は「電圧を、決まった目盛りの数で数える部品」です。

1段=基準電圧÷1024:電圧を階段で数える
10ビットの ADC は、0V から基準電圧までを 1024段の階段に分けます。1段の高さは 基準電圧÷1024 で、5V なら 4.88mV です。1段より小さな電圧の差は、数字に表れません。
電圧が少しずつ上がっても、読みはなめらかには増えません。1段の高さを超えるたびに、1つずつ増えます。
段の数が少ないと見えにくいので、図の左は 3ビット(8段)にした例です。5V を8段に分けると1段は 0.625V で、0.6V を入れても読みは 0 のままです。10ビットでは1段が 4.88mV になり、ずっと細かく読めます。
つまり、1段の高さが ADC の「目の細かさ」です。読みには、この1段より細かい分の切り捨てが必ず入ります。

ADCの分解能:ビット数で段数が決まる
ビット数が1つ増えるごとに段数は2倍、1段の電圧は半分になります。8ビットは 256段、10ビットは 1024段、12ビットは 4096段です。
| ビット数 | 段数 | 読みの範囲 | 5V 基準の1段 |
|---|---|---|---|
| 8ビット | 256 | 0〜255 | 19.5mV |
| 10ビット | 1024 | 0〜1023 | 4.88mV |
| 12ビット | 4096 | 0〜4095 | 1.22mV |
Arduino Uno の ATmega328P の ADC は 10ビットです。Arduino の説明にも「5V÷1024 で 1段は約4.9mV」と書かれています。
つまり、分解能は「何ビットか」と「基準電圧はいくつか」の2つで決まります。

電圧と数字の換算:2つの式で行き来する
電圧から数字は「電圧×1024÷基準電圧」、数字から電圧は「数字×基準電圧÷1024」です。ATmega328P のデータシートにも同じ式が書かれています。
入れた電圧が基準電圧を超えると、読みは 1023 で止まります。データシートでも、入力は GND から VREF までの範囲と決められています。
つまり、プログラムで電圧に戻すときは「読み×基準電圧÷1024」。基準電圧の値をまちがえると、答えもそのぶんずれます。

基準電圧の選び方:電源・内部1.1V・AREFの3つ
ATmega328P では、基準電圧を電源(AVCC)・内部の 1.1V・AREF ピンの3つから選べます。測りたい電圧の最大より少し上の基準を選ぶと、1段が細かくなります。
| 基準電圧 | 測れる範囲 | 1段(10ビット) | 誤差のもと |
|---|---|---|---|
| 電源(AVCC)5V | 0〜5V | 4.88mV | 電源の電圧のずれ・ゆれ |
| 内部の 1.1V | 0〜1.1V | 1.07mV | 1.0〜1.2V の個体差 |
| AREF ピン(外から入れる) | 0〜その電圧 | 電圧しだい | つないだ基準用 IC の精度 |
可変抵抗や CdS(明るさで抵抗が変わる部品)のように、電源の電圧を抵抗で分けて作った信号は、電源を基準にすると都合がよくなります(次の節)。
温度センサのように、電源と関係なく決まった電圧を出す部品で、電圧が 1V 前後と小さいなら、内部の 1.1V を基準にすると 1段が約 1/4.5 に細かくなります。
つまり、電源を分けた信号は電源、決まった小さい電圧は内部 1.1V、精度が要るなら基準用 IC を AREF へ、が基本です。

電源を基準にすると:誤差が消える信号と、出る信号
電源が 5.0V ではなく 4.8V だったとき、電源を分けた電圧(可変抵抗のまん中など)は読みが 512 のまま変わりません。決まった 2.5V を読むと、5.0V のつもりで計算した値は 2.603V になり、+4.1% ずれます。
電源を基準にすると、ものさしの長さ(基準電圧)が電源といっしょに伸び縮みします。
可変抵抗のまん中の電圧は、電源のちょうど半分です。電源が 4.8V なら 2.4V になりますが、ものさしも 4.8V に縮むので、読みは 512 のまま同じです。電源のずれが打ち消し合います。
一方、センサが出す 2.5V のように電源と関係なく決まった電圧は、ものさしだけが縮むので読みが 533 に増えます。プログラムで 5.0V として計算すると 2.603V になり、4.1% 高く出ます。
電源を抵抗で分けて作る回路の、抵抗の選び方は分圧回路の記事にまとめています。
電源を2本の抵抗で分ける分圧回路の、比・大きさ・誤差の決め方
つまり、可変抵抗・CdS は電源基準で誤差が消え、温度センサのような決まった電圧は電源のずれがそのまま誤差になります。

内部の1.1Vは1.0〜1.2V:1台ずつ合わせ込む
内部の 1.1V は、データシートで最小 1.0V・代表 1.1V・最大 1.2V です。同じ 0.75V を読んでも、1.1V として計算した値は 0.688〜0.825V まで、±9% ばらつきます。
内部の基準は電源のゆれに強く、1段も 1.07mV と細かくなります。ただし、マイコン1個ずつの値が少しずつ違います。
| 本当の基準電圧 | 0.75V の読み | 1.1V として計算した電圧 |
|---|---|---|
| 1.0V | 768 | 0.825V |
| 1.1V | 698 | 0.750V |
| 1.2V | 640 | 0.688V |
正確に測りたいときは、1台ずつ合わせ込み(校正)をします。テスターで正しい電圧がわかっている入力を1回読み、読みから基準の本当の値を逆算して、プログラムに書いておきます。
つまり、内部 1.1V は「細かくて電源に強いが、1台ずつ違う」基準です。

入力の抵抗は10kΩ以下:中のコンデンサを一瞬で充電するため
ADC は読む一瞬だけスイッチをつなぎ、中の小さなコンデンサ(ATmega328P は 14pF)を入力の電圧まで充電してから数えます。つないだ回路の抵抗(信号源の抵抗)が大きいと、充電が間に合いません。
ADC の入力の中には、スイッチとコンデンサが入っています。読む瞬間にスイッチが閉じ、コンデンサに入力の電圧が写しとられます。そのあとスイッチを開いて、写した電圧を数えます。これがサンプリング(サンプル&ホールド)です。
コンデンサを充電する電流は、つないだ回路の抵抗を通って流れます。抵抗が大きいと電流が小さく、決められた短い時間ではコンデンサが入力の電圧まで届きません。すると読みが低めになったり、前に読んだ別のピンの電圧に引きずられたりします。
つまり、ADC ピンにつなぐ回路の抵抗は 10kΩ 以下にします。100kΩ どうしの分圧のような大きな抵抗は要注意です。

信号源の抵抗が大きいと:充電の時間が10倍になる
コンデンサの充電の速さは、時定数 τ=抵抗×容量で決まります。10kΩ×14pF なら 0.14µs、100kΩ なら 1.4µs です。1/2段の誤差まで落ち着くには、τ の約7.6倍かかります。
時定数 τ(タウ)は、コンデンサが目標の約63%まで充電される時間です。τ の5倍で約99%、1/2段(1/2048)の誤差まで落ち着くには約7.6倍が目安です。
信号源の抵抗が 10kΩ なら約1.1µs、100kΩ なら約11µs です。読む一瞬の長さは ADC のクロックの速さで決まるので、抵抗が大きいほど足りなくなりやすくなります。
図は、中の 1〜100kΩ の抵抗を入れずに計算したイメージです。実際は中の抵抗のぶん、もう少し遅くなります。
時定数 τ=RC の考え方と、フィルタ・遅延の部品値の決め方
つまり、10kΩ 以下なら一瞬、それより大きいと時間が足りなくなりやすい、と覚えておけば十分です。

抵抗が大きい信号は0.1µFかフォロワで助ける
ADC ピンと GND の間に 0.1µF を付けると、14pF を充電する電気を 0.1µF が一瞬で渡すので、読みはほとんど下がりません(0.014%)。ただし、ゆっくり変わる信号にしか使えません。
0.1µF は 14pF の約7000倍の電気をためています。読む一瞬に 14pF へ配っても、0.1µF の電圧は 0.014% しか下がりません。1段は 1/1024=0.098% なので、それよりずっと小さく、読みに表れません。
そのかわり、100kΩ どうしの分圧(ADC から見ると 50kΩ)に 0.1µF を付けると、τ=50kΩ×0.1µF=5ms になります。入力が変わってから読みが追いつくまでに数十ms かかるので、温度や電池の電圧のように、ゆっくり変わる信号向きです。
速く変わる信号を、抵抗の大きい回路から読みたいときは、オペアンプのボルテージフォロワ(入ってきた電圧をそのまま出す回路)を間に入れます。フォロワの入力はほとんど電流を引かず、出力は抵抗が小さいので、ADC のコンデンサをすぐに充電できます。
オペアンプのボルテージフォロワを、5V の片電源で実際に組む
つまり、ゆっくり変わる信号は 0.1µF、速い信号はフォロワ。どちらも「ADC から見た抵抗を小さくする」工夫です。

平均でゆれを減らす:16回読めばゆれは1/4
同じ電圧を読んでも、ノイズで読みは数段ゆれます。N 回読んで平均すると、ばらばらなゆれは 1/√N に小さくなります。16回なら 1/4、64回なら 1/8 です。
電源のノイズやまわりの電気の影響で、読みは 511・513・512 のように少しずつゆれます。何回か読んで平均をとると、上へのゆれと下へのゆれが打ち消し合い、ゆれが小さくなります。
| 平均の回数 | ゆれの大きさ | かかる時間(1回 約100µs) |
|---|---|---|
| 1 | ×1 | 約0.1ms |
| 4 | ×0.5 | 約0.4ms |
| 16 | ×0.25 | 約1.6ms |
| 64 | ×0.125 | 約6.4ms |
回数を4倍にするたびに、ゆれは半分になります。そのかわり時間は回数ぶんかかります。Arduino Uno では1回の読みに約100µs かかるので、64回なら約6.4ms です。
「ゆれが 1/√N になる」理由は、統計の標準誤差と同じ考え方です。
平均のばらつきが σ/√n になる理由(標準誤差)を図で
つまり、平均はゆれを減らす手軽な方法。回数は、ゆれと時間のかね合いで決めます。

早見表:ビット数と基準電圧で決まる1段の電圧
答えだけ欲しい人向けの表です。10ビット・5V 基準なら 4.88mV、12ビット・3.3V 基準なら 0.81mV が1段です。
| 5V 基準 | 3.3V 基準 | 1.1V 基準 | |
|---|---|---|---|
| 8ビット(256段) | 19.5mV | 12.9mV | 4.3mV |
| 10ビット(1024段) | 4.88mV | 3.22mV | 1.07mV |
| 12ビット(4096段) | 1.22mV | 0.806mV | 0.269mV |
ATmega328P の絶対精度(読みのずれの合計)は、データシートの条件(基準 4V)で 2段です。4V÷1024×2=7.8mV にあたります。1段がいくら細かくても、正しさはそれより粗いことを覚えておきます。
つまり、1段=基準電圧÷2のビット数乗。必要な細かさから、ビット数と基準電圧を選びます。

ブレッドボードで試す:可変抵抗をA0で読む
10kΩ の可変抵抗の両はしを 5V と GND に、まん中の足をマイコンの A0 につなぎます。つまみを回すと、読みが 0〜1023 で変わります。
10kΩ の可変抵抗は、ADC から見た抵抗がいちばん大きいまん中の位置でも 2.5kΩ(5kΩ と 5kΩ の並列)なので、10kΩ 以下の条件を満たします。
つまり、両はしを電源、まん中を A0。電源を分けた電圧なので、電源を基準にすれば電源のずれも気になりません。

テスターで確かめる:基準電圧と入力の2か所
最低限、①5V ピン(基準電圧)と ②A0 の電圧をテスターで測り、「読み×①÷1024」が②に近いかを確かめます。
最低限ここだけ
余裕があれば
同じ電圧を100回読んで、最大と最小の差(ゆれの幅)を見ます。ゆれが大きいなら、0.1µF を足す・配線を短くする・平均の回数を増やす、の順に試します。
つまり、テスターで「ものさし」と「入力」の2つを測れば、読みが正しいかを確かめられます。

よくある失敗4つ:ADCで電圧を読むとき
AREF の短絡・基準を超える入力・何もつないでいないピン・基準を切り替えた直後の値、の4つがよくある失敗です。
1. AREF に電圧をつないだまま内部基準を選ぶ
マイコンの中で、外の電圧と内部の基準がぶつかり、壊れることがあります。AREF を使うなら、外の基準の設定にしてから読みます。
2. 基準電圧を超える電圧を入れる
読みは 1023 で止まり、それ以上は測れません。電源より高い電圧は、端子を壊す原因にもなります。分圧で範囲に入れ、外から入る信号には保護を入れます。
マイコンの入力ピンを、直列抵抗とダイオードで守る値の決め方
3. 何もつないでいないピンを読む
つないでいないピンの読みはふらふら変わり、手を近づけただけでも変わります。Arduino の説明にも書かれています。センサを外すことがあるなら、プルダウン抵抗で 0V に決めておきます。
何もつないでいない「浮いた」ピンと、プルアップ・プルダウンの決め方
4. 基準を切り替えた直後の値を使う
切り替えた直後の1回目は不正確なことがあります。1回読んで捨ててから使います。
つまり、つなぐ前(AREF・電圧の範囲)と、読むとき(つないでいないピン・切り替え直後)の4点を確かめます。


