インターフェース・バス(有線)

ADC(A/D変換)

アナログ信号をデジタルに変換。

概要

ADC(Analog-to-Digital Converter:A/D変換器)は、温度・圧力・電圧などのアナログ信号を、コンピュータやマイコンが処理できるデジタル値(2進数)に変換するハードウェアです。「A/D変換」「A-D変換」とも呼ばれます。

センサー(温度センサー・圧力センサー加速度センサー・マイクロフォン等)の出力は通常アナログ電圧であるため、マイコンで処理するにはADCによるデジタル変換が必要です。現代のマイコン(MCU)の多くはADCを内蔵しており、外部ADC ICなしにアナログ入力を処理できます。

ADCの主要な性能指標は「分解能(ビット数)」と「サンプリングレート(サンプル毎秒)」です。分解能が高いほど細かな変化を捉えられ、サンプリングレートが高いほど速い信号変化に追従できます。

歴史・背景

ADCの基本概念はシャノンのサンプリング定理(1948年)に基づいており、信号の最高周波数の2倍以上のサンプリングレートが必要とされます(ナイキスト定理)。

1950〜60年代にはFlash ADC(並列比較型)が研究され、1960年代末には逐次比較型(SAR: Successive Approximation Register)ADCが実用化されました。1970〜80年代にはΔΣ(デルタシグマ)型ADCが登場し、高分解能・低速サンプリングの用途(オーディオ・計測器)に革命をもたらしました。

マイコンへのADC内蔵は1980年代から始まり、現在ではSTM32・ESP32・AVR・PIC等のほぼ全てのマイコンが12〜16ビットのADCを複数チャンネル内蔵しています。

技術仕様

ADCの種類

方式原理分解能サンプリングレート用途
SAR(逐次比較型)二分探索8〜18bit数kS/s〜数MS/sマイコン内蔵・汎用
ΔΣ(デルタシグマ)ノイズシェービング16〜32bit数kS/s以下計測・オーディオ
Flash(並列比較型)全レベル同時比較6〜10bit数百MS/s〜数GS/s高速デジタルオシロ
Dual-slope積分12〜22bit数十S/s以下高精度マルチメータ
Pipelined多段SAR10〜16bit数十MS/s〜高速中精度

マイコン内蔵ADCは通常SAR型です。

主要スペック

項目説明
分解能ビット数。12ビットなら0〜4095(2^12=4096段階)
フルスケール入力電圧0〜VREFまたは差動入力範囲
サンプリングレート1秒間のサンプル数(S/s, SPS)
SNR(信号雑音比)理論上: SNR ≈ 6.02×N + 1.76 dB(Nはビット数)
INL(積分非線形誤差)理想直線からの誤差(±LSB単位)
DNL(差分非線形誤差)隣接ステップ間の誤差
ENOB(実効ビット数)ノイズを含めた実際のビット精度

代表的なマイコン内蔵ADC

マイコン分解能チャンネル数最大サンプリングレート
STM32F4xx12bit最大19ch2.4 MS/s
STM32H7xx16bit最大20ch3.6 MS/s
ESP3212bit18ch〜18 ksps(ノイズ多い)
RP204012bit5ch500 ksps
nRF5284012bit8ch200 ksps
Arduino Uno (ATmega328P)10bit6ch15 ksps

外付け高精度ADC IC

マイコン内蔵ADCでは分解能・精度が不足する場合:

IC方式分解能チャンネルインターフェース
ADS1115ΔΣ16bit4chI2C
ADS1256ΔΣ24bit8chSPI
MCP3204SAR12bit4chSPI
LTC2312SAR12bit1chSPI
AD7124ΔΣ24bit8chSPI

動作原理

SAR ADCの変換プロセス

逐次比較型ADCは2分探索アルゴリズムで変換を行います:

例:8ビットADCでアナログ入力=2.5V、VREF=3.3Vの場合

Step1: MSBを1(128)に仮定 → DAC出力=1.65V → 入力>1.65V → MSB=1
Step2: 次ビットを1(64)に仮定 → DAC出力=2.475V → 入力>2.475V → bit6=1
Step3: 次ビットを1(32)に仮定 → DAC出力=2.96V → 入力<2.96V → bit5=0
...(8回繰り返し)
結果: 0b11000000 = 192 → 192/255×3.3V ≈ 2.49V

サンプリングと変換タイミング

ADCは「サンプリング→ホールド→変換」の順序で動作します:

// STM32 HALを使ったADC読み取り(ポーリング)

// ADC初期化後
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);  // 変換完了まで最大100ms待機
uint32_t raw = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

// 電圧換算(3.3V VREF、12ビット)
float voltage = (float)raw / 4095.0f * 3.3f;
printf("ADC: raw=%lu, voltage=%.3fV\r\n", raw, voltage);

// DMAを使った連続サンプリング
#define ADC_BUF_SIZE 256
uint32_t adc_buffer[ADC_BUF_SIZE];

HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUF_SIZE);

// 変換完了コールバック
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
    // adc_buffer に256サンプルが揃った
    // 平均値計算や移動平均など
    uint32_t sum = 0;
    for (int i = 0; i < ADC_BUF_SIZE; i++) sum += adc_buffer[i];
    uint32_t avg = sum / ADC_BUF_SIZE;
}

オーバーサンプリングによる分解能向上

複数サンプルを平均することで、実効的な分解能を上げるオーバーサンプリング技術:

// 4倍オーバーサンプリングで12bit→14bitに向上
// 4^N倍のサンプル数 → Nビット向上(4倍=1ビット)
// 例:16倍オーバーサンプリング → +2ビット向上

uint32_t oversampled_read(uint32_t samples) {
    uint64_t sum = 0;
    for (uint32_t i = 0; i < samples; i++) {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, 10);
        sum += HAL_ADC_GetValue(&hadc1);
    }
    return (uint32_t)(sum / samples);  // 平均値を返す
}

// 256倍オーバーサンプリング → +4ビット(12bit→16bit相当)
uint32_t high_res = oversampled_read(256);

用途・ユースケース

ADCが使われる典型的な場面:

  • 温度測定: サーミスタ・Pt100温度センサーのアナログ出力を読み取り
  • 電圧・電流モニタリング: バッテリー電圧監視・電流センサー(分流抵抗)の計測
  • 圧力・ひずみセンサー: ホイートストンブリッジ型センサーの微小電圧変化を計測
  • マイクロフォン入力: アナログマイクの音声信号サンプリング(PCM変換)
  • ポテンショメータ(ボリューム): ツマミ回転角を電圧値として読み取り
  • 光センサー: フォトダイオード・CdSセルの電流/電圧を計測
  • バッテリーマネジメント: Li-ionセル電圧を個別モニタリング(BMSの基本機能)

実装・開発のポイント

アナログ入力の保護と調整

ADCへのアナログ入力は過電圧保護と適切な信号調整が必要です:

センサー出力 ─── R(10kΩ) ─── ADC入力ピン
                          |
                     TVSダイオード(ESD保護)
                          |
                         GND

注意:ADCピンの最大入力電圧はVDDA(通常VCC=3.3V)を超えてはならない
5V信号は分圧抵抗(10kΩ/6.8kΩ)で3.3V系に変換する

リファレンス電圧の重要性

ADCの精度はリファレンス電圧(VREF)の安定性に直結します:

  • 内部VREF: 多くのマイコン内蔵ADCはVDDAをVREFとして使用。電源ノイズが直接影響
  • 外部VREF IC: 高精度計測にはLM4040・MAX6102等の精密電圧リファレンスICを外付け
  • VDDA安定化: ADC近くに100nF + 10μFのデカップリングコンデンサを配置

シングルエンド vs 差動入力

  • シングルエンド入力: GNDを基準とした電圧を計測(ほとんどの用途)
  • 差動入力: 2本の入力線の電位差を計測。コモンモードノイズを除去できる(計装用途)

ノイズ低減のレイアウト対策

高精度ADC回路のPCBレイアウト:

  • アナログGNDとデジタルGNDを分離し、ADCピン直下の1点でのみ接続
  • ADCの電源ピン(VDDA/VREF)に専用デカップリングコンデンサ(100nF + 10μF)
  • アナログ入力ラインとデジタル信号ラインを離す(クロストーク防止)

他技術との比較

内蔵ADC vs 外付けADC

項目内蔵ADC外付けADC(SPI/I2C接続)
コスト低い(追加部品不要)高い
精度中程度(12〜16bit)高精度(16〜24bit)
ノイズデジタルノイズの影響受けやすい専用チップで低ノイズ
チャンネル数多いIC依存
サンプリングレート高速可能一般に低速

ADC vs DAC

DAC(デジタル/アナログ変換)はADCの逆方向変換です。ADCが現実世界のアナログ信号をデジタルに取り込むのに対し、DACはデジタル制御値をアナログ電圧・電流として出力します。音声再生・アナログ制御出力・基準電圧生成等にDACを使います。

関連用語

参考リンク