AD変換(ADC)とは?アナログ入力・分解能・基準電圧の仕組みを初心者向けに解説

組み込み基礎

マイコンでセンサーの値やボリュームの位置などを読み取りたいときによく使われるのが、AD変換(ADC)です。

マイコン内部では基本的にデジタル値を扱いますが、温度、明るさ、圧力、音など、現実世界の多くの情報は連続的に変化するアナログ量です。

そこで、センサーなどから出力されたアナログ電圧を、マイコンで扱える数値へ変換するためにADCを使用します。

この記事では、AD変換とは何かという基本から、分解能、基準電圧、12bit ADCで「0~4095」という値になる理由、ADC値から電圧を求める方法まで順番に解説します。

AD変換(ADC)とは?

AD変換とは、アナログ(Analog)の信号をデジタル(Digital)の値へ変換することです。

その変換を行う回路をADC(Analog-to-Digital Converter)と呼びます。

たとえば、あるセンサーから0~3.3Vの電圧が出力されるとします。

ADCを使うことで、この電圧をマイコン内部で扱える整数値へ変換できます。

アナログ電圧
     ↓
    ADC
     ↓
デジタル値

つまりADCは、現実世界のアナログ信号とマイコン内部のデジタル処理をつなぐ役割を持っています。

AD変換(ADC)の仕組み。アナログ電圧を12bitのデジタル値0~4095へ変換する関係と、可変抵抗を使ったADC入力の例
AD変換(ADC)の基本的な仕組みと、12bit ADC・可変抵抗を使った入力例

上図①のように、ADCは入力されたアナログ電圧をデジタル値へ変換します。さらに図②では12bit ADCにおける入力電圧と0~4095の関係、図③では可変抵抗を使ってADC値を変化させる実験例を示しています。

アナログ信号とデジタル信号の違い

ADCを理解するには、まずアナログ信号とデジタル信号の違いを理解しておきましょう。

アナログ信号は、電圧などの値が連続的に変化します。

たとえば、0Vから3.3Vまでの間には、

  • 0.5V
  • 1.2V
  • 1.65V
  • 2.48V
  • 3.1V

など、さまざまな電圧が存在します。

一方、通常のデジタル入力では、入力された電圧をHIGHまたはLOWとして判断します。

ADCを使うと、単にHIGH・LOWを判断するのではなく、入力された電圧をより細かい数値として読み取ることができます。

ADCの分解能とは?

ADCを理解するうえで非常に重要なのが分解能です。

分解能は、入力電圧を何段階のデジタル値として表現できるかを示します。

たとえば8bit ADCの場合、

28 = 256段階

で表現できます。

デジタル値は0から始まるため、実際に得られる値は0~255です。

ADC分解能段階数デジタル値
8bit2560~255
10bit1,0240~1,023
12bit4,0960~4,095
16bit65,5360~65,535

分解能が高いほど、入力電圧の違いを細かく区別できます。

なぜ12bit ADCは0~4095なの?

12bit ADCでは、1bitにつき0または1の2通りを表現できます。

これが12個あるため、表現できる組み合わせは、

212 = 4096通り

になります。

しかし最初の値は0なので、

0 ~ 4095

という4096段階になります。

「4096段階なのに最大値が4095なのはなぜ?」と疑問に思いやすいですが、0も1段階として数えているためです。

基準電圧とは?

ADCでは、デジタル値だけでなくどの電圧範囲を変換するのかも重要です。

その基準となる電圧を基準電圧(Vref)と呼びます。

理解しやすくするため、ここでは0~3.3Vを12bitで変換する理想的なADCを例に考えてみましょう。

入力電圧ADC値のイメージ
0V0
約0.825V約1024
約1.65V約2048
約2.475V約3072
約3.3V最大値付近

このように、入力電圧が高くなるほどADCのデジタル値も大きくなります。

ただし、実際のマイコンでは「電源電圧3.3Vだから必ず0~3.3Vをそのまま0~4095へ変換する」とは限りません。ADCの基準電圧、入力レンジ、減衰設定などはマイコンによって異なるため、データシートを確認する必要があります。

ADCの1段階は何V?

ADCの分解能が分かれば、理想的には1段階がどのくらいの電圧に相当するかを計算できます。

たとえば0~3.3Vを4096段階で表す12bit ADCなら、

3.3V ÷ 4096 ≒ 0.000806V

となります。

つまり理想的には、1段階あたり約0.806mVです。

この値を1 LSBに相当する電圧として考えることができます。

ただし、これはあくまで理想的な計算値です。実際のADCには誤差やノイズ、非直線性などがあるため、「12bitだから必ず0.806mV単位で正確に測定できる」という意味ではありません。

ADC値から電圧を求める

理想的なADCとして単純化すると、ADC値から入力電圧のおおよその値を計算できます。

12bit、基準となる入力範囲が0~3.3Vの場合は、概念的には次のように計算できます。

入力電圧 ≒ ADC値 × 3.3 ÷ 4095

たとえばADC値が2048だった場合、

2048 × 3.3 ÷ 4095 ≒ 1.65V

となり、およそ1.65Vの入力だったことが分かります。

実際のマイコンではADCの特性や入力レンジが単純な比例関係にならない場合もあるため、高い測定精度が必要な用途では校正値やメーカーが提供するADC変換機能などを利用します。

ADCは何に使われる?

ADCは、アナログ電圧を出力するさまざまなセンサーや回路の読み取りに利用されます。

  • 可変抵抗(ボリューム)の位置
  • アナログ温度センサー
  • 光センサー
  • 圧力センサー
  • 電池電圧の監視
  • 電流センサー
  • マイクなどのアナログ信号

センサーによってはI2CやSPIを使って測定値をデジタルデータとして出力するものもあります。その場合、マイコン側でセンサー出力をADC変換する必要はありません。

可変抵抗をADCで読み取る仕組み

ADCの学習で分かりやすいのが可変抵抗(ボリューム)です。

可変抵抗を電源とGNDの間に接続し、中央端子の電圧をADC入力へ接続すると、つまみの位置によってADCへ入力される電圧が変化します。

3.3V
 │
 ├── 可変抵抗
 │      │
 │      └──── ADC入力
 │
GND

つまみを回すと入力電圧が変化し、それに合わせてADC値も変化します。

ADCの仕組みを実際に確認するには非常に分かりやすい実験です。

ADCでは入力可能な電圧を超えない

ADCを使用するときに特に注意したいのが入力電圧です。

ADC入力端子には、マイコンが許容する範囲を超える電圧を入力してはいけません。

たとえば5Vの信号を測定したいからといって、3.3V系マイコンのADC端子へ5Vをそのまま接続できるとは限りません。

必要に応じて抵抗による分圧回路などを使用して、ADC入力が許容範囲内になるようにします。

許容電圧は必ず使用するマイコンのデータシートで確認してください。

ADC値が安定しないのはなぜ?

ADCで同じ電圧を測定していても、取得する値が少しずつ変動することがあります。

原因としては、次のようなものがあります。

  • 電源ノイズ
  • センサー出力のノイズ
  • ADCそのものの変換誤差
  • 配線から入り込むノイズ
  • 基準電圧の変動
  • 信号源の出力インピーダンス

必要に応じて、複数回測定して平均値を求めたり、コンデンサやフィルタ回路を使ったりすることで値を安定させます。

ADCとPWMの違い

ADCとPWMは名前も用途も異なりますが、セットで理解するとマイコンの入出力が分かりやすくなります。

ADCPWM
主な役割アナログ量を読み取る出力の割合を制御する
方向入力出力
例電圧・センサーを測定LED調光・モーター速度制御
基本動作電圧をデジタル値へ変換HIGH/LOWの時間比率を変える

PWMについては「PWMとは?デューティ比・周波数と仕組みを初心者向けに解説」で詳しく解説しています。

KUMITATE-C3でADCを試してみる

ADCは、実際に入力電圧を変化させて値を確認すると理解しやすくなります。

KUMITATE-C3はESP32-C3を搭載した学習用ボードで、GPIOやADC、PWM、I2Cなどのマイコン機能を実際に動かしながら学習できます。

Arduino環境では、ADCに対応したGPIOに対してanalogRead()を使用することでADC値を取得できます。

const int ADC_PIN = 0;  // 実際に使用するADC対応GPIOへ変更

void setup() {
  Serial.begin(115200);
}

void loop() {
  int value = analogRead(ADC_PIN);

  Serial.print("ADC = ");
  Serial.println(value);

  delay(500);
}

ADC入力へ可変抵抗などを接続して電圧を変化させると、シリアルモニターに表示されるADC値が変化します。

なお、ESP32-C3のADCは設定や入力範囲、校正などについて注意点があります。単純に「ADC値 ÷ 4095 × 3.3V」で高精度な電圧計になるわけではありません。正確な電圧測定が必要な場合は、使用しているESP32 Arduino CoreやESP-IDFのADC API、EspressifのADC仕様を確認してください。

ADCがうまく測定できないときの確認ポイント

ADCの値がおかしい場合は、次のポイントを確認してみましょう。

  • 使用しているGPIOがADC入力に対応しているか
  • ADCへ入力している電圧が許容範囲内か
  • GNDが正しく共通になっているか
  • ADCの分解能設定が想定どおりか
  • 入力レンジや減衰設定が適切か
  • 入力信号にノイズが多くないか
  • 入力が浮いた状態になっていないか

特にADC入力を何も接続せずに読み取ると、端子が浮いた状態になり、不規則な値が表示されることがあります。

まとめ

ADCは、アナログ電圧をマイコンで扱えるデジタル値へ変換するための機能です。

  • ADCはAnalog-to-Digital Converterの略
  • アナログ電圧をデジタル値へ変換する
  • 分解能によって表現できる段階数が決まる
  • 12bitなら4096段階、値は0~4095
  • 基準電圧や入力レンジによってADC値と電圧の関係が決まる
  • 実際のADCにはノイズや誤差がある
  • 許容範囲を超える電圧をADC端子へ入力してはいけない

ADCを理解すると、センサーや可変抵抗などから取得したアナログ情報をマイコンで扱えるようになります。PWMと合わせて理解すると、マイコンによる「入力」と「出力」の基本がさらに分かりやすくなります。

KUMITATE

読むだけでなく、
実際に動かして学びませんか?

クミタテは、組み込み開発や電子工作を 実践しながら学べる学習プラットフォームです。 ESP32を使ったプログラミングから、電子回路、センサー、 通信、基板設計まで、自分のペースで学習できます。

  • 無料で学べる実践的な教材を掲載
  • すぐに試せるサンプルプログラム付き
  • Googleアカウントですぐに登録可能
クミタテに無料登録する
組み込み基礎
スポンサーリンク