今回はSTM32マイコンのADC機能の一つである内蔵リファレンス電圧 \( V_{\mathrm{REFINT}} \) を計測することでSTM32マイコンの電源電圧を計測する方法を紹介します。

通常、マイコンを駆動する際は三端子レギュレータ等を用いて安定した電源を用意するのが普通です。 しかし、電池駆動のアプリケーションでは三端子レギュレータのドロップアウト電圧が惜しかったり、省コスト化や回路を小型化したかったり、低消費電力化のためにレギュレータの静止電流を減らしたいといった場合、レギュレータを省いて電池を直接マイコンの電源に繋げることがあります。
このような場合、マイコン内蔵のADCは電源電圧\( V_{\mathrm{DDA}} \) をAD変換結果の最大値(12ビットの場合0x0FFF)とするため、正しくアナログ値を読み取るためにはマイコンの電源電圧を計測する必要があります。 また、電池残量を確認したいといった場合は電池電圧を計測して電池の放電特性と照らし合わせて電池残量を求めます。

このような場合に役立つのがSTM32マイコンの内蔵リファレンス電圧 \( V_{\mathrm{REFINT}} \) を計測する方法です。
本記事ではNUCLEO-L476RGを使用して \( V_{\mathrm{REFINT}} \) を計測し、そこから電源電圧を計測する方法を紹介します。

STM32CubeMXの設定方法

まずADCのVrefint Channelを有効にします。

次にクロックの設定をします。今回はADCのクロック源をSYSCLK:80MHzと設定しました。

次にADCの設定を行います。レギュラ変換のチャンネルを"Channel Vrefint"とし、ノイズの影響を低減するためにサンプリングタイムを長めにとります。

\( V_{\mathrm{REFINT}} \) と\( V_{\mathrm{DDA}} \)の計測

サンプルコードは以下のとおりです。


ADCの初期化後、まずHAL_ADCEx_Calibration_Start関数を使用してADCのキャリブレーションを行います。
その後、通常のADCのポーリング変換処理を行います。
114行目で \( V_{\mathrm{REFINT}} \) の変換結果を取得しています。

\( V_{\mathrm{REFINT}} \) はマイコン自体の個体差と周辺温度によって変化し、その関係性はSTM32L476RGのデータシートのFigure 19に示されています。


この図を見ると、マイコンの個体差や温度を加味しても\(1.21\mathrm{V}±2%\)に収まっているので、概ね2%以内の誤差で電源電圧を計測できそうです。
なお、サンプルコードの115行目では周辺温度25℃、 \( V_{\mathrm{REFINT}} =1.212\mathrm{V}\) と仮定して\( V_{\mathrm{DDA}} \)を求めています。

結果は以下のようになりました。


マルチメータでNUCLEOのAVDDピンの電圧を測ってみたところ\( 3.305\mathrm{V}\) でしたので概ね正しく電源電圧を計測できたと思います。

なお、計測のポイントはADCの初期化後には必ずキャリブレーションを行うことです。