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 */
}



