STM32:AD変換とPWM出力
1.本日の内容
(1) STM32マイコン(nucleo f401RE)を使用して、PWM出力をする。
(2) AD変換で電圧を取得し、その値によって
・PWM出力を変更
・Teratermで値を出力
・LEDの光度変更をする。
(3) PWMの出力をオシロスコープで確認する。
※ オシロスコープは簡易キットを使用
・目次
2.内容
(1) やる内容の詳細
・STM32マイコン(nucleo f401RE)を使用して、PWM出力する。
・AD変換で電圧を読み込み、可変抵抗を変えることに
・PWMの出力を簡易オシロスコープで確認し、動きを理解する。
(2) 使用部品
個数 | 部品名 | 型番 |
---|---|---|
1 | USBケーブル | USBミニBタイプ |
1 | mbed(マイコンボード) | nucleo f401RE |
1 | ブレッドボード・ジャンパーワイヤ(オス-オス) | BBJ-65 |
1 |
小型ボリューム |
JH16K4B103L20KC-A |
※可変抵抗は、ここではジャンパワイヤを直接はんだ付けしている。
はんだ付けなどができない場合は、小型クリックなどを使うと良い。
小型クリップ付コード 5色 45cm 10本入: パーツ一般 秋月電子通商-電子部品・ネット通販
(3) STM32CubeMXの設定、プログラムを出力
(a)使用ピンを設定
・PA1:TIM5_CH2 :オシロスコープ確認用
・PA5:TIM2_CH1 :LED確認用
・PA0:ADC1_IN0 :可変抵抗の入力用
・PA2:USART2_TX:Teraterm用
・PA3:USART2_RX:Teraterm用
CubeMXの設定については下記記事参照。
・STM32マイコン_12(printfの導入)
・STM32マイコン_13(PWM出力)
(4) AtricTrueStdioでプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーに作成したプロジェクトの名前が表示
・チェックされているのを確認して、終了をクリック
(b) プログラムの書き込み
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載する。
/* USER CODE BEGIN Includes */ //printf用ヘッダインクルード #include "stdio.h" /* USER CODE END Includes */
/* USER CODE BEGIN PV */ //ADCの値格納用変数定義 __IO uint16_t analogValue; /* USER CODE END PV */
/* USER CODE BEGIN 0 */ int __io_putchar(int c) { if( c == '\n' ) { int b = '\r'; HAL_UART_Transmit(&huart2,(uint8_t*)&b, 1, 1); } HAL_UART_Transmit(&huart2,(uint8_t*)&c, 1, 1); return 0; } /* USER CODE END 0 */
/* USER CODE BEGIN 2 */ //TIMの開始 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //TIM2のchannel1開始 HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2); //TIM5のchannel2開始 /* USER CODE END 2 */
while (1) { /* USER CODE BEGIN 3 */ //AD値をとりこみ、それにより、PWM変更 //ADCスタート HAL_ADC_Start(&hadc1); //AD変換が正しく処理終わり、1000ms以内に値が入るか if(HAL_ADC_PollForConversion(&hadc1,1000)==HAL_OK){ //AD変換の値をanalogValueに格納 analogValue = HAL_ADC_GetValue(&hadc1); } //ADC終了 HAL_ADC_Stop(&hadc1); //analogValueをMAX1000に設定 analogValue = analogValue*1000/4095; //注:analogValue = analogValue/4095*1000だと0になる。 //teraterm表示 printf("analog=%d",analogValue); //TIM5のchannnel2の出力をanalogValueに設定 __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, analogValue); //TIM2のchannel1の出力をanalogValueに設定 (LED光度変更) __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, analogValue); } /* USER CODE END 3 */
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
・SPI通信とは - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・C++日本語リファレンス(uint8_t)
・STM32でUARTをやってみる1
・STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (5) UARTを使ってみよう
・マイクロマウス研修(kora編)[23] STM32マイコンでシリアル通信
・C言語ゼミ