今回は、STM32のADCを使用してみます。
回路について
以下のような回路としました。前回までの回路をベースにしていることもありごちゃごちゃとした印象を受けるかもしれません。しかし、今回やりたいことは単純明快で、ADCを使用して電圧を計測するというものです。これによりLi-Poの電圧を監視し、一定電圧を下回ったらマイコンをSTOP状態に落とし、過放電を防ぐ目的での使用を想定しています。
100KΩ接続を計測対象の電源とGNDの間に2つ直列に接続し、その間に PA10 を接続します。抵抗分圧ですね。Li-Poは3.7Vありマイコンには3.3Vを提供し、基準電圧も3.3Vにします。このままでは3.3V以上の計測は出来ないため抵抗分圧で電圧を落としています。この場合は1/2の電圧になるはずです。
STM32CubeMXでの設定
まずはEclipseを起動し、これまで使用していたプロジェクトファイルを読み込みます。 Configuration >> Peripherals >> ADC にある IN0 にチェックを入れます。
ADC をクリックします。
Parameter Settings に移動し、 Clock Prescaler を Synchronous clock mode divided by 4 に、 Continuous Conversion Mode を Enabled に設定してみます。
ここまでできたらコードを生成しましょう。
ソフトウェア
main()関数先頭に変数の定義を追加します。
uint32_t adcValue = 0; uint32_t volt = 0; uint8_t adcCount = 0;
main()関数にあるwhile()ループ内に以下のようなコードを記述します。
if (adcCount == 0) { HAL_ADC_Start(&hadc); if (HAL_ADC_PollForConversion(&hadc, 1000000) == HAL_OK) { adcValue = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); volt = (adcValue * 3300 * 2) / 4096; // 4096 => 3.3V printf("ADC Value=%lu, Volt=%lu.%2lu\n", adcValue, volt / 1000, volt % 1000); adcCount++; } } else { adcCount = (adcCount + 1) % 10; } HAL_Delay(50);
50ms毎にループさせていますが、10回ループする毎、つまり500ms毎に計測を開始します。電圧が取得できたらその値を表示します。
実行例
Open On-Chip Debugger 0.9.0 (2015-05-28-12:05) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : FTDI SWD mode enabled adapter speed: 300 kHz adapter_nsrst_delay: 100 none separate cortex_m reset_config sysresetreq Info : clock speed 300 kHz Info : SWD IDCODE 0x0bc11477 Info : stm32l0.cpu: hardware has 4 breakpoints, 2 watchpoints Info : accepting 'gdb' connection on tcp/3333 Info : STM32L flash size is 64kb, base address is 0x8000000 undefined debug reason 7 - target needs reset adapter speed: 300 kHz target state: halted target halted due to debug-request, current mode: Thread xPSR: 0xf1000000 pc: 0x080005a0 msp: 0x20002000 STM32L0: Enabling HSI16 adapter speed: 2500 kHz Error: stm32l0.cpu -- clearing lockup after double fault Warn : couldn't use loader, falling back to page memory writes adapter speed: 300 kHz target state: halted target halted due to debug-request, current mode: Thread xPSR: 0xf1000000 pc: 0x080005a0 msp: 0x20002000 semihosting is enabled hello world ADC Value=2637, Volt=4.249 ADC Value=2641, Volt=4.255 ADC Value=2639, Volt=4.252 ADC Value=2656, Volt=4.279 ADC Value=2645, Volt=4.261 ADC Value=2645, Volt=4.261 ADC Value=2641, Volt=4.255