本記事に記載する数値はすべて ST 公式データシート DS12288 (STM32G474, Rev 1, 2019年5月) および AN2834 (Rev 3, 2017年2月) を一次資料として参照しています。最新版(DS12288 Rev 6, 2021年11月)で更新がある可能性があるため、実設計時は最新版でご確認ください。
はじめに:STM32G4 のアナログ機能が "見落とされやすい"
STM32G4 シリーズは、Cortex-M4F コア(170 MHz)に加え、内蔵 OPAMP × 6個 / COMP × 7個 / 高速 ADC × 5個 / DAC × 7チャネルを搭載する、STM32 史上もっともアナログ機能が充実したマイコンです。本来なら外付け OPAMP / コンパレータ IC で構成する電流センス・閾値検出・小信号バッファをワンチップで完結できる、モータ制御 / 電源 / センサ案件の本命です。
ところが、いざ CubeMX で組んで動かしてみると 「ADC の値がノイジー」「想定より下のビットが立つ」「期待した電圧と全然違う」 といった「計測誤差の罠」にハマるケースが頻発します。原因はほぼ一つで、ソース抵抗 R_AIN とサンプリング時間 T_S の関係を理解せずに使っているためです。
本記事では AN2834「How to get the best ADC accuracy」 と STM32G474 データシート DS12288 の Table 70 を一次資料に、この関係を体系的に解説します。さらに「内蔵 OPAMP を Voltage Follower にして R_AIN を実質ゼロにする」 G4 ならではの決め技、そして Errata に潜む落とし穴まで踏み込みます。基礎となる UART/I2C/SPI 通信は STM32 のUART・I2C・SPI・CAN通信 実装ガイド、DMA との連携は STM32 DMA 完全ガイド を併せてご覧ください。
弊社では STM32G4 を用いたモータ制御装置・電流センシング・産業計測機器など 多数のアナログ寄り組込み開発実績 があります。本記事は、その実案件で蓄積した「ADC 値が想定と違う」を解決した経験則を、公式 AN の数式と照らし合わせて整理したものです。
STM32G4 内蔵アナログ周辺の俯瞰
主要 2 ライン(STM32G474xx Performance / G431xx Access)の搭載数を比較します。(出典: DS12288 §3 / ST product page)
| 機能 | STM32G474xx(Performance) | STM32G431xx(Access) |
|---|---|---|
| Cortex-M4F | 最大 170 MHz | 最大 170 MHz |
| 内蔵 OPAMP | 6 個(OPAMP1〜OPAMP6) | 3 個 |
| 内蔵 COMP | 7 個(COMP1〜COMP7) | 4 個 |
| 12-bit ADC | 5 個(最大 4 Msps @ 12-bit) | 2 個(最大 4 Msps @ 12-bit) |
| DAC | 7 チャネル(3 個 外部出力 + 4 個 内部) | 4 チャネル(2 個 外部 + 2 個 内部) |
| HRTIM(高分解能タイマ) | ○(モータ・電源制御用) | - |
STM32G4 ADC のマーケティング上の「5 Msps」表記は 6-bit などの低分解能モードを含めた最高値です。12-bit 分解能での最大変換速度は 4 Msps(DS12288 §3.18.1)。記事や仕様検討で「12-bit / 5 Msps」と誤解しないよう注意してください(低分解能時の最高値は最新データシートの該当 Table を参照)。
ADC サンプリング時間の根拠式(AN2834)
STM32 の ADC は SAR(Successive Approximation Register)方式で、入力は次の等価回路で表されます。(出典: AN2834 §2.2.6)
R_AIN R_ADC
────/\/\/───────────/\/\/───┬──── ADC SAR Core
(外付け (内部 │
信号源抵抗) スイッチ) ┤
C_ADC (内蔵 S&H キャパシタ)
┤
GND
サンプリング時、信号源は R_AIN + R_ADC を通って C_ADC を充電します。サンプリング時間 T_S の間に C_ADC が真の電圧まで十分充電される必要があり、不足すると次の変換に影響を残して誤差になります。
AN2834 §3.2.6 では、N-bit 分解能 / 1/2 LSB 誤差を許容する場合の最大ソース抵抗を以下のように導きます。
充電時定数: τ = (R_AIN + R_ADC) × C_ADC
1/2 LSB 誤差で済むには:
T_S ≥ τ × ln(2^(N+1))
よって最大 R_AIN は:
T_S
R_AIN_max = ─────────────────── − R_ADC
C_ADC × ln(2^(N+1))
N = 12 のとき ln(2^13) ≒ 9.01。これを覚えておくと、ファミリ別の R_AIN_max が即計算できます。
例(AN2834 §3.2.6 の STM32F1 数値):f_ADC = 14 MHz、C_ADC = 8 pF、R_ADC = 1 kΩ、T_S = 7.5 cycles の場合、R_AIN_max ≒ 6.4 kΩ。(出典: AN2834 §3.2.6 数値例)
DS12288 Table 70:G4 では「式」ではなく「ルックアップ」
ここが多くの日本語記事が見落とすポイントです。STM32G4 では R_ADC が温度・VDDA・analog switch booster の有無で変動するため、データシートは AN2834 の式の代わりに「サンプリング時間ごとの R_AIN_max ルックアップテーブル」を掲載しています。(出典: AN2834 §3.2.6 Note / DS12288 §5.3.21 Note)
STM32G4 で公開されている定数は C_ADC typ 5 pF のみ(DS12288 Table 69)。R_ADC は不開示なので、設計者は Table 70 を直接見て使うサンプリング時間を決めるのが公式の流儀です。
DS12288 Table 70(12-bit 抜粋、f_ADC = 60 MHz)
| サンプリング cycles | サンプリング時間 | R_AIN_max Fast ch. | R_AIN_max Slow ch. |
|---|---|---|---|
| 2.5 | 41.67 ns | 100 Ω | N/A |
| 6.5 | 108.33 ns | 330 Ω | 100 Ω |
| 12.5 | 208.33 ns | 680 Ω | 470 Ω |
| 24.5 | 408.33 ns | 1.5 kΩ | 1.2 kΩ |
| 47.5 | 791.67 ns | 2.2 kΩ | 1.8 kΩ |
| 92.5 | 1.54 µs | 4.7 kΩ | 3.9 kΩ |
| 247.5 | 4.13 µs | 12 kΩ | 10 kΩ |
| 640.5 | 10.675 µs | 39 kΩ | 33 kΩ |
※ DS12288 Rev 1, §5.3.21 Table 70(12-bit 抜粋)。10-bit / 8-bit / 6-bit は値が緩くなる方向で同表が完全提供されています。実設計では必ず最新データシートの該当 Table を参照してください。
STM32G4 ADC では、ADCx_IN1 〜 ADCx_IN5 の 「Fast channels」 のみが最短 2.5 cycles サンプリングをサポートします。それ以外はすべて 「Slow channels」 で、最短でも 6.5 cycles 必要です。高速電流センシング(モータ制御)など速度を稼ぎたい用途では、必ず Fast channel に割り当ててください。(出典: DS12288 Table 70 注 (3)(4))
HAL のサンプリング時間定数
ADC_SAMPLETIME_2CYCLES_5 // 2.5
ADC_SAMPLETIME_3CYCLES_5 // 3.5(G4 限定 SMPPLUS 機能)
ADC_SAMPLETIME_6CYCLES_5 // 6.5
ADC_SAMPLETIME_12CYCLES_5 // 12.5
ADC_SAMPLETIME_24CYCLES_5 // 24.5
ADC_SAMPLETIME_47CYCLES_5 // 47.5
ADC_SAMPLETIME_92CYCLES_5 // 92.5
ADC_SAMPLETIME_247CYCLES_5 // 247.5
ADC_SAMPLETIME_640CYCLES_5 // 640.5
3.5 cycles モードは G4 限定の SMPPLUS 機能で、2.5 cycles 設定の「+1 サイクル」版です。ADC 全体共通の SMPPLUS ビットで切り替えるため、チャネルごとに混在はできません。(出典: stm32g4xx_hal_adc.h)
R_AIN を下げる4つの手段
外部信号源の R_AIN は「センサーの出力抵抗 + 直列保護抵抗 + 入力 RC フィルタの抵抗成分」の合計値です。よくあるハマりポイントとして、「入力に 10 kΩ + 1 nF の RC フィルタを入れた」だけで、R_AIN が 10 kΩ に跳ね上がることを認識せず、サンプリング時間を 6.5 cycles のままにしているケースが頻発します。
R_AIN を許容範囲に収める手段は 4 つです。
① ADC クロックを下げる(変換は遅くなる)
同じサンプリング cycles でも f_ADC が低ければ時間は長くなる → R_AIN_max が緩む。消費電流も減るのでセンサノード向き。
② 分解能を下げる(精度は落ちる)
12-bit → 10-bit / 8-bit / 6-bit と落とすほど R_AIN_max が緩む。例:12-bit / 640.5 cycles で 39 kΩ なのに対し、6-bit では同条件で 50 kΩ。
③ 入力直前に小さな C を追加(電荷リザーバ)
ADC 入力直前に 100 pF 〜 1 nF の C を追加すると、サンプリング瞬間の電荷を C から供給できる。ただし「次のサンプリングまでに信号源から十分再充電できる」場合のみ有効。
④ アクティブバッファ(OPAMP)で R_AIN を実質ゼロに(決め技)
外付け OPAMP、あるいは STM32G4 の内蔵 OPAMP を Voltage Follower モードにして、ADC 入力をバッファする。これにより ADC から見た R_AIN は OPAMP の出力インピーダンス(200 Ω 未満)まで下がる。次セクションで詳述します。
決め技:内蔵 OPAMP を ADC バッファに使う
STM32G4 内蔵 OPAMP の最大の強みは、出力を物理ピンに出さず内蔵 ADC に直結(Internal Output)できることです。これにより外付け OPAMP IC + 配線がゼロでバッファアンプを構成できます。
OPAMP の電気的特性(DS12288 Table 80 抜粋)
| Symbol | パラメータ | Typ | 備考 |
|---|---|---|---|
| CMIR | 同相入力範囲 | 0 ~ VDDA | rail-to-rail |
| VIOFFSET | 入力オフセット(キャリブ後 25℃) | ±1.5 mV max | HAL_OPAMP_SelfCalibrate() で到達可能 |
| GBW | 利得帯域積 | 13 MHz | min 7 MHz |
| SR | スルーレート(Normal) | 6.5 V/µs | min 2.5 |
| SR | スルーレート(High-Speed) | 45 V/µs | min 18 |
| I_DDA(Normal、follower) | 消費電流 | 1.3 mA | max 2.2 mA |
| I_DDA(High-Speed) | 消費電流 | 1.4 mA | max 2.6 mA |
| TS_OPAMP_VOUT | ADC 直結時の最短サンプリング | 200 ns (VDDA≥2V) 300 ns (VDDA<2V) | これが大きい |
注目すべきは TS_OPAMP_VOUT = 200 ns。OPAMP Internal Output 経由なら、ADC のサンプリング時間は最短 12.5 cycles (208 ns @60MHz) まで詰められます。外部 R_AIN がなくなったうえで OPAMP 出力インピーダンスは 200 Ω 未満。これにより 「高インピーダンスセンサーを 12-bit / 高速サンプリング」 が無理なく実現できます。
HAL コード例:OPAMP1 を Voltage Follower、ADC1 に直結
OPAMP_HandleTypeDef hopamp1;
hopamp1.Instance = OPAMP1;
hopamp1.Init.PowerMode = OPAMP_POWERMODE_HIGHSPEED; // 高速モード
hopamp1.Init.Mode = OPAMP_FOLLOWER_MODE; // ボルテージフォロワ
hopamp1.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO0; // PA1 入力
hopamp1.Init.InternalOutput = ENABLE; // ADC に直結(PA2 ピン出力なし)
hopamp1.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
HAL_OPAMP_Init(&hopamp1);
/* 起動時に1回だけ校正 → オフセットを ±1.5 mV まで詰める */
HAL_OPAMP_SelfCalibrate(&hopamp1);
HAL_OPAMP_Start(&hopamp1);
/* ADC1 側で OPAMP1 出力チャネルを選択 */
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_VOPAMP1; // OPAMP1 内部直結チャネル
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_12CYCLES_5; // TS_OPAMP_VOUT(200ns) を満たす
sConfig.SingleDiff = ADC_SINGLE_ENDED;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
PGA モードでセンサ信号を増幅
OPAMP は PGA(Programmable Gain Amplifier)モードにも切り替えられ、Non-inverting で ×2, ×4, ×8, ×16, ×32, ×64、Inverting で ×-1, ×-3, ×-7, ×-15, ×-31, ×-63 の固定ゲインが選べます。(出典: DS12288 Table 80)
注意:PGA のゲイン精度はゲイン×2〜16で約 1%、×32/64で約 2%です(ゲインは抵抗の「比」で決まるため、内蔵抵抗の絶対値ばらつきが大きくてもゲイン誤差は小さく保たれます)。一方でオフセット電圧やゲイン誤差をさらに追い込みたい高精度測定では、Standalone モードで外部精密抵抗を組む構成も検討してください。
Normal モード vs High-Speed モードの選び方
- Normal モード:SR 6.5 V/µs typ、消費 1.3 mA typ。DC〜数十 kHz の低速信号に十分
- High-Speed モード:SR 45 V/µs typ、消費 1.4 mA typ。消費はわずか +0.1 mA なのに SR は約 7 倍。動信号や PGA で帯域が必要なら基本これ
消費電流のペナルティが小さいため、バッテリ駆動でない案件はデフォルトで High-Speed にしておくのが現場の鉄則です。
内蔵 COMP の DAC 直結とブランキング
STM32G4 の COMP は他ファミリには無い 2 つの強力な機能を持ちます。
① 反転入力に DAC を直結(閾値をソフトウェア可変)
外部に「閾値設定用のボリュームや分圧抵抗」を置く必要がありません。内蔵 DAC を COMP の反転入力に直結でき、ソフトウェアから自由に閾値を変えられます。
COMP_HandleTypeDef hcomp1;
hcomp1.Instance = COMP1;
hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; // PA1 入力
hcomp1.Init.InputMinus = COMP_INPUT_MINUS_DAC3_CH1; // DAC3_CH1 を閾値に
hcomp1.Init.Hysteresis = COMP_HYSTERESIS_40MV; // 中ヒステリシス
hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING_FALLING;
HAL_COMP_Init(&hcomp1);
HAL_COMP_Start(&hcomp1);
/* 閾値を 1.5V に設定(VREF=3.3V、12-bit DAC の場合) */
HAL_DAC_SetValue(&hdac3, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 1862);
② Blanking 機能:PWM のスパイクを無視
モータ制御で MOSFET のスイッチング瞬間に流れるリンギング電流が、COMP の過電流検出を誤発火させる問題は古典的なトラブルです。STM32G4 の Blanking 機能は、指定した TIM 出力(PWM の通電期間)の 立ち上がり後の一定期間 COMP 出力をマスクすることで、スパイクを無視します。
hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_TIM1_OC5_COMP1;
/* TIM1 OC5 で生成した「通電直後の N µs」だけ COMP 出力を強制 Low に */
これを知らずに RC フィルタで対処しようとして応答時間が遅くなる失敗パターンが多い領域です。
ヒステリシス設定(HYST レジスタ値 vs mV)
| HAL 定数 | Vhys Typ | Vhys Max |
|---|---|---|
| COMP_HYSTERESIS_NONE | 0 | - |
| COMP_HYSTERESIS_10MV (LOW) | 9 mV | 16 mV |
| COMP_HYSTERESIS_40MV (MEDIUM) | 36 mV | 63 mV |
| COMP_HYSTERESIS_70MV (HIGH) | 63 mV | 110 mV |
(出典: DS12288 Table 79 / stm32g4xx_hal_comp.h)
ハードウェアオーバーサンプリングで ENOB を稼ぐ
STM32G4 の ADC は 最大 256x のハードウェアオーバーサンプリングを搭載しています。CPU を介さずに ADC が自動で N 回サンプリング → 累算 → 指定ビットだけ右シフトしてくれる機能で、ノイズが白色(ガウシアン)であれば実効分解能 ENOB を +4 bit(256x の場合)まで向上できます。(出典: stm32g4xx_hal_adc.h)
/* 16x オーバーサンプリング → ENOB +2 bit、累算 16-bit → 4-bit 右シフトで 12-bit 結果 */
hadc1.Init.OversamplingMode = ENABLE;
hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
変換時間は OSR 倍に延びるため、サンプリングレート要件と精度要件のトレードオフを見極めて選定します。実測例として、Cerevo TechBlog では STM32L432KC で 16x OSR + 入力直列抵抗の組合せで ENOB 8.91 → 13.18 bit まで改善した報告があります(参考リンクは末尾)。
PCB レイアウトと電源分離(AN5346)
ADC・OPAMP・COMP の性能はソフトウェアだけでは決まりません。AN5346「STM32G4 ADC use tips and recommendations」に PCB 設計の鉄則が整理されています。
- パッケージ選定:寄生インダクタンスが小さい順に UFBGA > UFQFPN > WLCSP > LQFP。アナログ性能を最大化したいなら UFBGA / UFQFPN を選ぶ
- VDD と VDDA の分離:フェライトビーズ + 0.1 µF + 1 µF + 4.7 µF の階層型デカップリング
- AGND / DGND の単一接続点:複数点で繋ぐとグランドループが発生
- ADC 入力前段の RC フィルタ抵抗は R_AIN に加算される。「10 kΩ + 1 nF」を入れたら R_AIN_max を 10 kΩ 以上に確保できるサンプリング時間を選ぶこと
- 高速電流センス(モータ制御)は Fast channel (ADCx_IN1〜IN5) のみ使う
VREF / VREFINT の精度
内蔵 VREFINT は典型 1.212 V(min 1.182、max 1.232、温度係数 30 ppm/℃ typ)。(出典: DS12288 Table 20) 温度ドリフトを考慮し、絶対精度が必要な用途では外部リファレンス IC(例:REF3030)を VREF+ ピンに接続するか、内蔵 VREFBUF(2.048 / 2.5 / 2.9 V 選択可)を活用してください。
VREFINT は工場校正値が 0x1FFF 75AA 〜 0x1FFF 75AB に格納されており、これを読み出して補正計算に使えば製品ばらつきを吸収できます。
現場で踏むハマりポイント(Errata 抜粋)
STM32G47x / G48x の device errata から、計測誤差に直結する重要項目を抜粋します。Errata は ST 公式が公開している既知の不具合リストで、量産設計では必読ですが、開発初期に目を通す人は少なく現場で踏みやすい罠です。
§2.7.7 Wrong ADC result if conversion done late after calibration
ADC キャリブレーション直後、しばらく変換を行わないと最初の変換結果が正しくない。対策:キャリブレーション直後に必ずダミー変換を 1 回入れる。
§2.7.9 An ADC instance may impact the accuracy of another ADC instance at specific conditions
複数の ADC を同時動作させると、特定条件下で互いの精度に影響する。対策:高精度測定が必要な ADC は他 ADC と同時動作させない、もしくは Dual-mode を活用してタイミング相関を取る。
§2.10.1 OPAMP disturbed by fast-edge toggle on GPIO pin corresponding to VINM0
OPAMP の反転入力(VINM0)に対応する GPIO ピンが高速にトグルすると OPAMP 出力に擾乱が出る。対策:VINM0 ピンが他用途で高速 GPIO として使われていないか確認し、必要ならピンレイアウトを変更。
Errata は品種ごとに公開されており、量産設計に入る前に必ず通読してください。STM32G4 系の Errata はおおむね 50〜100 項目あり、ADC / OPAMP / COMP 関連だけで 10 件以上に及びます。「データシート通りに作ったのに動かない」のほとんどは Errata に書いてあります。
公式リソース・参考文献
最重要 Application Note
- AN2834 – How to get the best ADC accuracy in STM32 microcontrollers(ADC 精度の決定版)
st.com → AN2834 PDF - AN5306 – Operational Amplifier (OPAMP) usage in STM32G4 Series
st.com → AN5306 PDF - AN4232 – Getting started with analog comparators for STM32F3 and STM32G4 Series
st.com → AN4232 PDF - AN5346 – STM32G4 ADC use tips and recommendations
st.com → AN5346 PDF - AN5310 – Guideline for using analog features of STM32G4 Series vs STM32F3
st.com → AN5310 PDF - AN5093 – Getting started with STM32G4 Series hardware development boards
st.com → AN5093 PDF
Reference Manual / Datasheet / Errata
- RM0440 – STM32G4 Series Reference Manual
st.com → RM0440 PDF - DS12288 – STM32G474xB/xC/xE Datasheet(本記事の数値根拠)
st.com → DS12288 PDF - STM32G47x / G48x device errata(品種別に ST.com から DL)
日本語トレーニング資料 / 参考
まとめ
この記事のまとめ
- STM32G4 は内蔵 OPAMP × 6 / COMP × 7 / 12-bit ADC × 5 を搭載する、ST 最強のアナログ寄りマイコン
- 「5 Msps」は低分解能含む値。12-bit では最大 4 Msps
- STM32G4 では AN2834 の R_AIN_max 式は使わない。DS12288 Table 70 のルックアップを直接見るのが公式の流儀
- Fast channels (ADCx_IN1〜IN5) のみ 2.5 cycles サンプリング可能。Slow channels は最短 6.5 cycles
- 内蔵 OPAMP を Voltage Follower で ADC 直結すれば R_AIN を実質ゼロに(TS_OPAMP_VOUT = 200 ns)
- OPAMP の High-Speed モードは Normal 比で SR 約 7 倍、消費電流は +0.1 mA のみ。バッテリ駆動以外はデフォルトで High-Speed 推奨
- COMP は DAC を反転入力に直結できる G4 ならではの強み。モータ制御の Blanking 機能も必須
- ハードウェアオーバーサンプリング 256x で ENOB +4 bit。256x で約 11 bit 程度まで詰められる実測例あり
- Errata §2.7.7 / §2.7.9 / §2.10.1 など、計測誤差に直結する既知不具合は量産前に必ず確認
STM32G4 のアナログ機能をフル活用したモータ制御・電源制御・産業計測機器の設計でお困りのことがあれば、弊社にお気軽にご相談ください。アナログ寄り組込み案件の実績をもとに、回路設計からファームウェア実装・実機評価まで一貫してサポートします。
STM32G4 を使った高精度アナログ計測・モーター/電源制御の試作・量産、既存基板のトラブル調査も 組込み制御・マイコン開発 として対応しています。
高精度アナログ計測 + STM32 の受託開発
内蔵 OPAMP・COMP・ΔΣADC を活用したモータ制御、電力計、振動データロガー、産業計測機器など、アナログ × 組込みの境界が難しい案件を得意としています。回路設計から量産評価まで一貫対応。