STM32/アナログ入力を試す

今回は、STM32のADCを使用してみます。

回路について

以下のような回路としました。前回までの回路をベースにしていることもありごちゃごちゃとした印象を受けるかもしれません。しかし、今回やりたいことは単純明快で、ADCを使用して電圧を計測するというものです。これによりLi-Poの電圧を監視し、一定電圧を下回ったらマイコンをSTOP状態に落とし、過放電を防ぐ目的での使用を想定しています。

Circuit

100KΩ接続を計測対象の電源とGNDの間に2つ直列に接続し、その間に PA10 を接続します。抵抗分圧ですね。Li-Poは3.7Vありマイコンには3.3Vを提供し、基準電圧も3.3Vにします。このままでは3.3V以上の計測は出来ないため抵抗分圧で電圧を落としています。この場合は1/2の電圧になるはずです。

STM32CubeMXでの設定

Chip

まずはEclipseを起動し、これまで使用していたプロジェクトファイルを読み込みます。 Configuration >> Peripherals >> ADC にある IN0 にチェックを入れます。

Configuration

ADC をクリックします。

Parameter Settings に移動し、 Clock PrescalerSynchronous clock mode divided by 4 に、 Continuous Conversion ModeEnabled に設定してみます。

Parameter Settings

ここまでできたらコードを生成しましょう。

ソフトウェア

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください