概要
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 | 多段SAR | 10〜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
| マイコン | 分解能 | チャンネル数 | 最大サンプリングレート |
|---|---|---|---|
| STM32F4xx | 12bit | 最大19ch | 2.4 MS/s |
| STM32H7xx | 16bit | 最大20ch | 3.6 MS/s |
| ESP32 | 12bit | 18ch | 〜18 ksps(ノイズ多い) |
| RP2040 | 12bit | 5ch | 500 ksps |
| nRF52840 | 12bit | 8ch | 200 ksps |
| Arduino Uno (ATmega328P) | 10bit | 6ch | 15 ksps |
外付け高精度ADC IC
マイコン内蔵ADCでは分解能・精度が不足する場合:
| IC | 方式 | 分解能 | チャンネル | インターフェース |
|---|---|---|---|---|
| ADS1115 | ΔΣ | 16bit | 4ch | I2C |
| ADS1256 | ΔΣ | 24bit | 8ch | SPI |
| MCP3204 | SAR | 12bit | 4ch | SPI |
| LTC2312 | SAR | 12bit | 1ch | SPI |
| AD7124 | ΔΣ | 24bit | 8ch | SPI |
動作原理
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を使います。