STM32/이론

STM32 PWM TIMER 알아보기

원원 2023. 12. 31. 13:38

안녕하세요. 오늘은 STM32 PWM TIMER에 대해 알아보겠습니다.
PWM은 Pulse width modulation의 줄임말이고 디지털신호를 아날로그신호를 사용하는걸 의미합니다.
DC모터의 제어나 LED 밝기조절할때 사용합니다.

이 글에서는 PWM을 사용하여 주파수값에 따라서 LED밝기가 어떻게 변하는지 알아보겠습니다

 

 


먼저 PWM을 사용하기위해 클럭을 설정해줍니다

데이터시트 RCC쪽에서 어떤 타이머가 어떤 버스를 사용하는지 확인 가능합니다
이 글에서는 TIM1,2를 사용할거고 사용할 클럭은 48MHz로 설정했습니다


48MHz를 분주하기위해서 prescale이라는걸 사용합니다.
Period를 설정해기위해 auto-reload register를 설정합니다.
100을 설정했다고하면 CNT값이 0->1->2->3...->99->100->0이런식으로 됩니다

TIM1과 TIM2를 설정했습니다.
TIM1은 prescale 48이고 arr은 100입니다 (설정은 1씩 작게해야합니다)
48000000/48 = 1000000Hz
1000000/100 = 10000Hz
이므로 1/10000 = 0.0001s (100us) 마다 주기적인 파형이 찍히게 됩니다

TIM2는 prescale 48000이고 arr은 100입니다  (설정은 1씩 작게해야합니다)
48000000/48000 = 1000Hz
1000/100 = 10Hz
이므로 1/10 = 0.1s (100ms) 마다 주기적인 파형이 찍히게 됩니다


코드제너레이터를하면 기본적인 설정은 해주고 HAL_TIM_PWM_Start를 사용하여 타이머를 시작해야합니다.
CCR1레지스터는 듀티비 설정과 비슷한 레지스터입니다. ARR을 100으로 설정했으므로 CCR1을 50으로 설정하면 듀티비는 50%가 됩니다.

  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    htim1.Instance->CCR1 = 50;
    htim2.Instance->CCR1 = 50;


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

타이머1의 출력파형입니다. 듀티비가 50%이고 Freq가 10kHz가 찍혔습니다

타이머2의 출력파형입니다. 듀티비가 50%이고 Freq가 10Hz가 찍혔습니다.

이제 두 곳의 PWM출력포트에 LED를 연결해서 밝기를 보겠습니다

왼쪽은 타이머1이고 오른쪽은 타이머2입니다. 실제로 보면 타이머1은 약간 어둡게 보이고 타이머2는 빠른속도로 점멸하는거처럼 보입니다. 빠른속도로 점멸하는것처럼 보이지않기위해 freq를 120Hz이상 설정해야한다고합니다.



이제 CCR1값을 0~100까지 변화시키면서 LED의 밝기를 조절해보겠습니다

  /* USER CODE BEGIN 2 */
  int i=0;
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    htim1.Instance->CCR1 = i;
    htim2.Instance->CCR1 = i;

    HAL_Delay(10);
    i++;
    if(i>100)
      i=0;

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }