タイマー( タイマー割り込みでLチカを試す/PWMを試す )

 

※ インターバルタイマー

ProjectName:"20201228TimerTest"

インターバルタイマーとは:一定の時間が経過するごとにそのことを知らせる機器や仕組みのこと。

 

TIM2

Clock Source "Internal Clock"

NVIC Setting >> TIM2 global interrupt > Enabled

 

Prescaler : 999 (= 1000 (n+1))            "Prescaler":供給されるクロックを指定値で分割

Counter Period: 16000                                  "Counter Period":設定値までカウント

 

=> TIM2に供給されるクロックを(1000)で割った周期で、16000カウントしたら割り込みかかる。

=> 32MHz ÷ 1000 ÷ 16000 => 2Hz => 500msec毎に割り込み

 

 

TIM2, 3, 4, 5, 6, 7APB1 ?

TIM1, 8APB2 ?

 

 

 <コーデイング>

 

 インターバルタイマの場合に割り込みが発生すると実行される関数

 HAL_TIM_PeriodElapsedCallback

main.cファイルへ追加する。

 今回はTIM2を有効化したが,他のインターバルタイマを利用した場合にも利用した場合にも同じ関数が呼び出される。

 そのため呼び出された際にインスタンスから条件分岐する。

 LEDTIM2の割り込みで変化させている。

 

/* USER CODE BEGIN PFP */

void HAL_TIM_PeriodElapsedCallback( TIM_HandleTypeDef *htim ) {

    if( htim->Instance == TIM2 ) {

        // TIM2 Task

        HAL_GPIO_TogglePin( LD2_GPIO_Port, LD2_Pin );

    }

    // else if( htim->Instance == TIM3 ) {

        // TIM3 Task

    // }

}

/* USER CODE END PFP */

 

 インターバルタイマを開始する場合は割り込み開始関数HAL_TIM_Base_Start_ITを開始する。

 

/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start_IT( &htim2 );

// HAL_TIM_Base_Stop_IT( &htim2 );

/* USER CODE END 2 */

 

 逆にインターバルタイマを停止する場合は割り込み停止関数HAL_TIM_Base_Stop_ITで停止させます。

 

 書き込み後は,LEDがちチカチカするハズ。

 

※ アウトプットコンペア(特にPWM:Pulse Width Modulation

 

 PWMはアウトプットコンペアを利用する。

 今回はタイマ2をアウトプットコンペアとして利用する場合である。

 

              Pinout TAB >> ClockSource >> Internal Clock

              Channel1 >> PWM Generation CH1

 

              PA5をクリックして,TIM2_CH1を選択する.

 

              Counter Periodの設定でPWMの分解能が決まる。

                            "Prescaler""Counter Period"の設定値で決まる。

 

              Prescaler >> 63

              Counter Period >> 999

 

              この設定によって,64Mhz/((63+1)*999+1)=1kHz周期のPWMが作れているはず.

 

              Duty比の分解能を1024段階

 

              ※ アウトプットコンペアの場合"NVIC Settings"タブの割り込み設定は不要

 

15kHz以下の場合は,モータやスイッチング素子から可聴音が発生する。

20kHz以上が好ましい。

100kHzなど周波数が高い場合,モータなどの逆起電力等によるノイズ増加やスイッチング素子が応答できない場合がある。

 

 

 TIM2, 3, 4, 5, 6, 7 APB1?

 TIM1, 8 APB2?

 

 

 <コーディング>

  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start( &htim2, TIM_CHANNEL_1 );

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, 50 );

    HAL_Delay( 1000 );

    __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, 500 );

    HAL_Delay( 1000 );

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

                                                                      ( 注 )__HAL***のアンダースコアは2個ある

 

                                                        LEDが1秒間隔で明暗を繰り返す様子を見ることができる