Develop Knowledge/STM32F4 by ChrisP

6강. PWM 생성하기

정수열 2023. 2. 2. 23:40

본 단행본은 inflearn에 있는 ChrisP 강사님의 "HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌"를 정리한 글입니다.

 

강좌 바로 보기 >> https://www.inflearn.com/course/stm32f4/dashboard

 

[무료] HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌 - 인프런 | 강의

고성능 마이크로컨트롤러인 STM32F 시리즈를 처음 접하는 분들이 쉽게 시작할 수 있도록 무료 컴파일러 TrueSTUDIO 및 코드자동생성 프로그램 CubeMX 설치부터 칩 기능의 개념설명, 소스코드작성(HAL

www.inflearn.com

 

- PWM 이란

강의에서 자세히 설명하므로, 여기서는 간단하게만 집고 넘어가겠습니다.

PWM은 타이머를 사용하는데, 한가지 개념이 추가됩니다.

Capture Compare Register가 추가되는데, 타이머 클럭이 이 부분을 만나면 신호가 반전되는 역할을 합니다.

 

PWM은 타이머마다 만들 수 있는 개수가 다릅니다.

Channels 항목이 하나의 타이머에서 만들 수 있는 PWM 신호 개수입니다.

예를 들어, TIM1의 Channels=4 인데, 이 말은 TIM1에서 PWM 신호를 4개를 만들어 낼 수 있다는 의미입니다.

 

- 회로도

없음

- CubeMX 설정

1. Pinout & Configuration

PD12, PD13, PD14 -> TIM4_CH1, TIM4_CH2, TIM4_CH3

PC6, PB5, PB0 -> TIM3_CH1, TIM3_CH2, TIM3_CH3

 

TIM4 -> Channel 1,2,3 -> PWM Generation CH 1,2,3

TIM3 -> Channel 1,2,3 -> PWM Generation CH 1,2,3

 

TIM4에서는... 100Hz의 PWM 신호를 만든다.

Prescaler = 20-1

Counter Period = 41000-1

PWM Generation Channel 1 -> Pulse = 21000-1

PWM Generation Channel 2 -> Pulse = 10500-1

PWM Generation Channel 3 -> Pulse = 5250-1

여기서 Pulse는 Capture Compare Register 역할을 합니다. 따라서 각각 펄스폭이 50%, 25%, 12.5%가 됩니다.

 

TIM3에서는... 200Hz의 PWM 신호를 만든다.

Prescaler = 10-1

Counter Period = 41000-1

PWM Generation Channel 1 -> Pulse = 21000-1

PWM Generation Channel 2 -> Pulse = 10500-1

PWM Generation Channel 3 -> Pulse = 5250-1

 

- 코드 생성

// PWM 시작
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);

uint16_t ccr = 0;
while (1)
{
	  // PWM 바꾸기
	  //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, ccr); // 방법 1
	  TIM4->CCR1 = ccr; // 방법 2
	  ccr += 1000;
	  if(ccr > TIM4->ARR) ccr = 0;
	  HAL_Delay(50);
}

 

+) 참고로, 부저 같이 펄스 폭을 변경해야 하는 일이 생긴다면, ARR를 변경하지 말고 PSC(prescaler) 값을 변경해야 문제 없이 동작합니다. 이유는 잘 모르겠습니다..