PWM出力

出力ピンのHighとLowの比率で実現するPWM出力である。

今回はSTM32CubeMX その3-タイマ1比較出力(アウトプットコンペア)で作ったSTM32CubeMXのファイルを再設定して利用し、タイマ1の4つの出力ピンをじんわりと点灯消灯させてみる。

STM32CubeMXの変更箇所

別名保存

STM32CubeMX その3-タイマ1比較出力(アウトプットコンペア)で作ったSTM32CubeMXのファイルを一旦読み込んで別名保存しなおす。

別名で保存

別名で保存


クロック設定はそのまま使えるということだ。

Pinoutの再設定

タイマ1の4つの出力ピンをPWMで利用できるように、TIM1の各ピンをPWM Generation CHxにする。

Pinoutの再設定

Pinoutの再設定

TIM1の詳細設定

ここで改めてPWMのタイミングである。

比較出力とPWMのタイミング

比較出力とPWMのタイミング

この表を見ながら以下のように設定した。

TIM1の設定

TIM1の設定

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 日本語リファレンスマニュアル"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
STM32F103xx日本語リファレンスマニュアル"STM32F103xx日本語リファレンスマニュアル"をダウンロード
STM32F100x データシート"STM32F100x データシート"をダウンロード
STM32CubeMXのユーザスマニュアル"STM32CubeMXのユーザスマニュアル"をダウンロード
STM32F1xxx HALドライバ・ユーザマニュアル"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード

プログラム関係