STM32 nucleoを使う (7) PWMによるLEDの調光


はじめに

STM32の汎用タイマーの使用例としてPWMをあげます。PWMはモーター制御や音源、調光などいろいろな用途で使われています。
汎用タイマのTIM2を使いLEDをPWMで点灯させます。

PWM

PWMはPulse Width Modulation:パルス幅変調の意味でパルス波のデューティを変化させて変調します。

タイマーでPWMを実現するには、まず周期を設定します。その周期の中でHの期間をコンペア値で設定します。

LEDの制御なので周期は1kHzとします。分解能は0.1%以上にしたいと思います。

LED設定

NUCLEO-F303REのユーザーLEDはTIM2が接続されています。

PA5端子をクリックしTM2_CH1を選択します。

TIM2設定

Pinout & Configurationを選択し、Timersを広げ、TIM2をクリックします。
Clock Sourceを"Internal Clock"に、Channel1を”PWM Generation CH1”にします。
ConfigurationのParameter Settingタブを選択します。
Prescalerは72にします。クロックソースは72MHzなので72分周すると1MHzになります。
Counter Periodは999にします。

コード

TIM7で10msのタイマー割り込みを発生させ、割り込み中でPWMのデューティを設定します。

割り込みハンドラー

タイマー割り込みで10回ごとにデューティ比を設定した配列の値を読み込み、コンペア値に変換し設定します。
コンペア値の設定は__HAL_TIM_SET_COMPARE()で行います。

/* USER CODE BEGIN PV */
uint16_t    pwmTbl[] ={
        0,20,40,60,80,100,80,60,40,20,
};
/* USER CODE END PV */

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

    static unsigned char count = 0;
    static unsigned char stage = 0;
    int tblSize = sizeof(pwmTbl)/sizeof(uint16_t);
    uint32_t width;

    if(htim == &htim7) {
        count++;
        if (count >= 10) {
            count = 0;
            stage++;
            if (stage >= tblSize) {
                stage = 0;
            }
            width = (999*pwmTbl[stage])/100;
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, width);
        }
    }
}
/* USER CODE END 0 */

main

メイン処理はタイマーの設定を行います。
HAL_TIM_PWM_START()でPWM動作を開始します。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM7_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim7);
  /* tim7 Start */
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  /* PWM Start*/
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

LEDの明るさが変わるはずです。

STM32の使い方を学習した内容をまとめています。内容に不備等ありましたら連絡お願いします。