6강. PWM 생성하기
본 단행본은 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) 값을 변경해야 문제 없이 동작합니다. 이유는 잘 모르겠습니다..