STM32 시리즈 PWM 이론 학습하기 - Nucleo-G071RB
안녕하세요.
PWM에 대해서 알아보고 Nucleo-G071RB 평가보드에 있는 LED를 이용해서 실습해 보겠습니다.
1. PWM 이란
PWM(펄스폭 변조, Pulse Width Modulation)은 마이크로컨트롤러에서 가장 널리 사용되는 신호 생성 기법 중 하나로, 신호의 주파수는 일정하게 유지하면서 듀티 사이클(Duty Cycle)을 조절하여 출력 전력을 조절하는 방식입니다.
2. PWM 기본 개념
1) PWM 요소
PWM 신호는 일정한 주기를 가지며, HIGH 상태와 LOW 상태가 반복됩니다. 여기서 중요한 두 가지 요소는 다음과 같습니다
주파수 (Frequency, f): PWM 신호가 1초에 반복되는 횟수입니다. 다르게 말하면, 1초에 파형이 몇 개 나오는가? 1초에 1개 파형이 나온다면, 1Hz가 되고, 1000개 가 나타나면 1000Hz(1kHz)가 됩니다.
듀티 사이클 (Duty Cycle, D): HIGH 상태가 전체 주기에서 차지하는 비율(%)입니다.
듀티 사이클이 0%이면 항상 LOW, 100%이면 항상 HIGH입니다. 예를 들어, 듀티 사이클이 50%이면 HIGH와 LOW가 동일한 시간입니다.
2) PWM 듀티 사이클 공식
듀티 사이클(D) 혹은 듀티비(Duty ratio)는 아래와 같은 관계식을 가집니다
D(%) = (HIGH 시간 / 주기) × 100
예시)
PWM 주파수가 1kHz이고, HIGH 시간이 0.4ms 경우,
주기(T) = 1 / 1000 = 1ms
듀티(%) = (0.4 / 1) × 100 = 40%
반대로, HIGH 시간을 구한다면 1ms × 40% = 0.4ms
LOW 시간은 1ms - 0.4ms = 0.6ms 가 됩니다.
이 경우, PWM 파형은 0.4ms 동안 HIGH, 0.6ms 동안 LOW를 유지하며 반복됩니다.
3) PWM 신호란?
일정한 주기의 디지털 신호의 출력이 HIGH인 시간과 LOW인 시간의 비율을 조절해서 아날로그 효과를 내는 방법입니다.
3. PWM 출력 모드
STM32 등 계열 등은 타이머를 사용해서 PWM 신호를 출력하는 기능이 있습니다. 주기(주파수)가 일정하고 한 주기 안에서 HIGH/LOW 신호 비율로 Timer를 이용해서 파형을 만듭니다.
일정주기로 카운터를 증가하다가 비교 레지스터 값과 같아지면 HIGH, LOW가 변하게 됩니다.
1) 타이머 선택
타이머 내부에 카운터를 가지고 있으며 카운터에 맞게 각 타이머마다 해상도와 타입, DMA 지원여부 등 다를 수 있습니다. 사용할 타이머 성능이 맞는지 확인한 후 사용해야 합니다.
2) TIMER 입력 클럭 확인
PWM을 파형을 만들기 위해서는 클럭에 대해 알고 있어야 합니다. 특히 TIMER에 입력되는 클럭 확인이 필요합니다.
APB(Advanced Peripheral Bus) 프리스케일러 분할 비율이 1로 설정된 경우 PCLK(주변 장치 클록) 주파수에서 실행됩니다. APB 프리스케일러 분할 비율이 1이 아닌 경우 PCLK 주파수의 두 배에서 실행됩니다. 가지고 있는 STM32 시리즈마다 다를 수 있습니다. Datasheet 확인이 필요합니다.
<STM32G071 reference 참고>
STM32IDE의 RCC에서 보면 아래와 같이 설정할 수 있습니다. G071시리즈는 최대 64 MHz이며, 다른 시리즈는 클럭이 다르게 보일 수 있습니다.
3) 주기값 분해능 설정
한 주기에 대해서 몇 단계로 나눠서 사용할 것인가 설정하는 것입니다.
Reference manual에 있는 예를 들면 ARR레지스터 값을 8로 했을 때 실제적으로 0부터 시작하기 때문에 총 9번 카운트해야 1주기가 완성됩니다. 그래서 ARR값을 ARR +1 표기로 표현하기도 합니다. 카운터 값 : 0->1->2->... 8-> 다시 0으로 리셋)
4) PWM 주파수 설정
입력 주파수를 분주해서 사용할 수 있습니다. (주파수를 낮게 설정 가능)
분주값(PSC) +1로 입력주파수로 나눠 원하는 주파수를 만들 수 있습니다.
예를 들어 입력 주파수(타이머 클럭) = 64 MHz, PSC = 63이라고 한다면 분주 후 타이머 클럭은 64,000,000 / (63+1) = 1,000,000 = 1 MHz가 됩니다.
다시 위에서 본 ARR 레지스터에 999를 넣어 주면 1,000,000 / (999+1) = 1,000 = 1kHz(1ms)의 PWM 신호를 생성할 수 있습니다.
위의 PWM 주파수 내용을 공식으로 하면 아래와 같이 됩니다.
5) PWM Mode
Output Compare(출력 모드)의 PWM 모드 설정을 보면
mode1은 CNT 값이 듀티 사이클 값(CCR) 보다 작으면 활성화(active, HIGH) 그렇지 않으면 비활성화(inactive, LOW)됩니다. mode2는 반대로 동작합니다. 즉, 출력 반전 신호로 사용할 수 있습니다.
TIMxARR(Auto-Reload Register) : PWM 주기의 길이를 결정하는 값입니다. 이 값이 클수록 PWM 신호의 주기가 길어지고, 주파수가 낮아집니다. ARR=999로 설정하면 1 MHz의 타이머 클럭을 1000단계로 나누어 1kHz의 PWM 주파수를 얻을 수 있습니다.
TIMx_CCR(Capture/Compare Register) : 듀티 사이클을 조절하는 역할을 합니다. CCR 값이 높을수록 PWM 신호의 HIGH 상태가 길어집니다. 예를 들어, ARR=999이고 Mode가 1일 때, CCR=600으로 설정하면 한 주기의 약 60% 동안 HIGH, 40% LOW 인 듀티 사이클이 생성됩니다.
감사합니다.
<참고 자료>
1. 임베디드 컨트롤러 기초 8차시 - STEP 교육과정
2. Pulse-width modulation
https://en.wikipedia.org/wiki/Pulse-width_modulation
3. STM32C0316-DK 펌웨어 강좌 #9 - PWM (LED 제어)
https://www.youtube.com/watch?v=ClBVhLuPaS0