PWM出力
出力ピンのHighとLowの比率で実現するPWM出力である。
今回はSTM32CubeMX その3-タイマ1比較出力(アウトプットコンペア)で作ったSTM32CubeMXのファイルを再設定して利用し、タイマ1の4つの出力ピンをじんわりと点灯消灯させてみる。
STM32CubeMXの変更箇所
別名保存
STM32CubeMX その3-タイマ1比較出力(アウトプットコンペア)で作ったSTM32CubeMXのファイルを一旦読み込んで別名保存しなおす。
クロック設定はそのまま使えるということだ。
Pinoutの再設定
タイマ1の4つの出力ピンをPWMで利用できるように、TIM1の各ピンをPWM Generation CHxにする。
TIM1の詳細設定
ここで改めてPWMのタイミングである。
この表を見ながら以下のように設定した。
PWMの周期はLEDがチラチラしなければよいので、72MHzのクロックを7200分割(7200-1)にし自動再ロードレジスタを100(100-1)にした。自動再ロードレジスタを100(100-1)にしたのでLEDを100階調で変化させることができる。
各ピンのPWMのモードだがドキュメントを読んだがmode1とmode2の違いがよく分からなかった。とりあえずPWM mode1とした。
各ピンのpulse値でPWMの割合が決まるのだが、今回はプログラムで変更するので、ここもとりあえず0に設定した。
以上である。
プログラム生成
初期コードを生成である。これにてSTM32CubeMXの作業は終わりである。
コードを追加
今回はPWMをスタートさせるコードと、変化させるコードを追加した。
まずはスタートさせるコード。/* USER CODE BEGIN 2 */と/* USER CODE END 2 */の間に以下のコードを追加した。
/* USER CODE BEGIN 2 */ if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } /* USER CODE END 2 */
そして変化させるコードの追加は2ケ所。
まず /* USER CODE BEGIN 1 */と /* USER CODE END 1 */の間に
/* USER CODE BEGIN 1 */ int pwm; /* USER CODE END 1 */
そして /* USER CODE BEGIN 3 */と /* USER CODE END 3 */の間に
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ for(pwm = 0; pwm < 100; pwm++) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm); HAL_Delay(10); } for(pwm = 99; pwm >= 0; pwm--) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm); HAL_Delay(10); } for(pwm = 0; pwm < 100; pwm++) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,pwm); HAL_Delay(10); } for(pwm = 99; pwm >= 0; pwm--) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,pwm); HAL_Delay(10); } for(pwm = 0; pwm < 100; pwm++) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,pwm); HAL_Delay(10); } for(pwm = 99; pwm >= 0; pwm--) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,pwm); HAL_Delay(10); } for(pwm = 0; pwm < 100; pwm++) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,pwm); HAL_Delay(10); } for(pwm = 99; pwm >= 0; pwm--) { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,pwm); HAL_Delay(10); } } /* USER CODE END 3 */
これで4つのLEDが順送りにじんわりと点灯消灯するようになる。
__HAL_TIM_SetCompare関数はコンベアレジスタ(STM32CubeMXならpulse値)を再設定する関数である。
STM32は動作中に再設定しても問題なく動作する。
参考資料
データシート関係
今となっては日本語マニュアル等をどこで入手したかわからないので、当方手持ちのPDFファイルをアップロード公開した。最新版があるならそちらを参考してください。
"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
"STM32F103xx日本語リファレンスマニュアル"をダウンロード
"STM32F100x データシート"をダウンロード
"STM32CubeMXのユーザスマニュアル"をダウンロード
"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード
プログラム関係
- STM32CubeMXの入手はSTマイクロのSTM32CubeMXのページから
- MDK-ARMのダウンロードはKeilのページから