STM32 타이머 클럭과 PWM 분주
PWM 이 원하는 주파수로 안 나올 때 원인은 대개 둘이다. 타이머에 실제로 들어가는 클럭을 잘못 알았거나, 분주값에 −1 을 빠뜨렸거나. 클럭이 들어오는 길부터 레지스터 값까지 한 장에 정리했다.
타이머 클럭은 어디서 오나
STM32 의 범용 타이머는 APB 버스 클럭을 받는다. 그런데 대부분의 시리즈에서 APB 프리스케일러가 1이 아니면 타이머 쪽에는 그 두 배가 들어간다. 예를 들어 시스템 72 MHz · APB1 ÷2(36 MHz) 이면 APB1 에 붙은 TIM2~TIM4 는 72 MHz 로 돈다. STM32CubeMX 클럭 설정 화면의 「APB Timer clocks」 칸이 실제 값이니, 계산에는 그 값을 넣는다. (일부 시리즈는 규칙이 다르니 레퍼런스 매뉴얼의 RCC 장을 확인한다.)
나누고 세고 비교한다
타이머는 들어온 클럭을 PSC 로 먼저 나누고, 나뉜 클럭으로 0부터 ARR 까지 센 뒤 다시 0으로 돌아간다. 한 바퀴가 PWM 한 주기다. 세는 동안 카운터가 CCR 보다 작으면 출력을 켜 두는 것이 PWM 모드 1 이다.
값 넣어 보기
다른 조합
| PSC | ARR | 실제 주파수 | 오차 | 듀티 한 칸 |
|---|
공식과 근거
PSC 와 ARR 은 레지스터에 「실제 나누는 수 − 1」을 넣는다(0 이면 1로 나눈다). 같은 주파수라도 PSC 를 작게, ARR 을 크게 잡을수록 듀티를 잘게 조절할 수 있다(분해능 = log₂(ARR + 1) 비트).
근거: STM32 각 시리즈 레퍼런스 매뉴얼의 범용 타이머(TIMx) 장 — 프리스케일러, 자동 재장전 레지스터, PWM 모드.
흔한 실수
자주 묻는 것
모터 · LED 에 몇 kHz 를 쓰나
LED 밝기는 깜빡임이 안 보이게 대략 1 kHz 이상, 모터는 소리가 들리지 않게 20 kHz 이상을 흔히 쓴다. 너무 높으면 스위칭 손실이 늘어난다.
PSC 를 0 으로 두면 안 되나
된다. 클럭을 그대로 쓰므로 분해능이 가장 크다. 다만 낮은 주파수에서는 ARR 이 65535 를 넘어 16비트 타이머로는 안 되므로 PSC 를 올린다. 위 상자가 이 판단을 한다.