#はじめに
電源電圧にバッテリーなどを使用しているときに、マイコンからバッテリー電圧を知りたいことがあります。STM32でそれを行う方法です。
#基礎
STM32の中にはVrefintという基準電圧があります。これはSTM32F401REの場合は電源電圧がいくつであっても(もちろん動作保証範囲内です)以下の電圧に収まるようになっています。
またSTが工場出荷するときに、Vddを3.3VにしたときにVrefintをADCで計測して、その値をFLASH上に書き込んであります。
これを使って現在の電源電圧を計算する式がSTのレファレンスマニュアルに記載されています。残念ながらSTM32F401のリファレンスマニュアルには記載がなく、STM32F0x1のリファレンスマニュアルから引っ張ってきました。
#電源電圧を変える準備
ここの記事に詳細があります。
https://qiita.com/kotetsu_yama/items/2c5c38a708f45184a57b
#コード
以下のように修正します。
/* USER CODE BEGIN 0 */
uint32_t VrefValue;
float V;
__IO uint16_t *VrefCal = (__IO uint16_t*)0x1FFF7A2A;
/* USER CODE END 0 */
/* USER CODE BEGIN 3 */
// Get ADC Value
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,1000);
VrefValue = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
// Get actual Vdd Voltage
V = 3.3f * (float)*VrefCal / (float)VrefValue;
__NOP();
}
/* USER CODE END 3 */
全コードはgithubにあげてあります。
https://github.com/kotetsuy/STM32forWindowsDemos/tree/master/ADCmesureVdd
#実験結果
電源を1.8Vにしたとき
電源を2.4Vにしたとき
電源を3.3Vにしたとき
#おわりに
これでバッテリー駆動の時にバッテリー電圧を外部回路なしで計測できます。