ADC機能によるアナログセンサデータのデジタル化を行います。まずはシングルで1chだけ取得して前回行ったUART経由printf関数を使ってTera Termで表示します。
参考にした先達のサイト一覧

STM32で光センサの値を読み取る - 元Web屋のマイクロマウス製作記 Part.16
ししかわです。 社員研修の一環で、自作マウスを作って大会に出場します。 記事一覧 – 元Web屋のマイクロマウス製作記 | RT MicroMouse 前回はマウスモジュール側の開発環境構築をしました。 これから数回に渡って、マウスモジュー...

ショウのマイクロマウス制作-Part9
前回は割り込みを設定しました。今回はAD変換を使えるようにします。AD変換はバッテリーの電圧のチェックや、壁センサの値の取得に使います。とりあえず今回は1チャンネルのAD変換をするように作成します。

printf - しゅうの自作マウス研修 part9
こんにちは、しゅうです。 今日は結構短いです! 今まで、HAL_UART_Transmit関数を使っていましたが、それをおなじみprintf関数で行うことができるのでご紹介します。 変数ごとにしか表示できなかったり、引数が多かったりと書いて...
回路図
バッテリ電圧最大8.4Vを、20kΩと6.8kΩの分圧抵抗でADCで計測できる範囲の0~3.3Vに収まるようにします。リポ3Sも動かすかもしれないと思っていたので、12.6Vでも入力できるパラメータにしています。ローパスアナログフィルタとして0.1uFのコンデンサを搭載していますが、この値でいいかどうかはあとで考えようと思っていたので、実際に走らせていくうちに変更するかもしれません。
ポートはPA5に接続しています。
STM32CubeMX
CubeMXでADCの設定を行います。入力した結果がこちら。
ここで、Sampling Timeを決めるのにデータシートをひっくり返してADC時定数等を調べる羽目になります。が、それは後日に回します。
ここでは、実際の値に近い28 Cyclesに設定しました。
Clock Configurationは前回同様、最大値になるように設定しています。
プログラム
プログラムです。ADCで電圧をデジタルデータに変換して単位をVで出せるよう演算してadc_voltに代入して表示しています。さらに分圧抵抗からバッテリ電圧batt_voltを演算して表示します。
/* USER CODE BEGIN 2 */ setbuf(stdout, NULL); setbuf(stdin, NULL ); printf("Started!\n\r"); uint16_t adc_Value = 0; float adc_volt, batt_volt; /* USER CODE END 2 */
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 1000); adc_Value = HAL_ADC_GetValue(&hadc1); adc_volt = (float)adc_Value * 3.3 / 4096; // Voltage divider resistor Vbatt -> 20kΩ -> 6.8kΩ -> GND batt_volt = adc_volt * (20+6.8) / 6.8; printf("adc_Value = %d, adc_volt = %.3f, batt_volt = %.3f\n\r", adc_Value, adc_volt, batt_volt); HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }