IC8ΛPΛCIRCUIT
/// MCU · 펌웨어

타이머 PWM 분주 계산기

MCU 타이머로 PWM 을 낼 때 정해야 하는 값은 셋이다. 클럭을 나누는 PSC, 한 주기를 세는 ARR, 켜져 있는 길이 CCR. 원하는 주파수와 듀티를 넣으면 세 값을 찾는다. 이름은 STM32 표기를 따랐고, 다른 MCU 도 원리는 같다.

예: 72M · 84M · 170M
예: 20k = 20 kHz
-
푸는 순서
    레지스터에 넣을 값 (예: TIM2 · 채널 1)

    다른 조합

    PSCARR실제 주파수오차듀티 한 칸
    카운터 CCR ARR 출력 한 주기 = (ARR+1) 칸
    엣지 정렬 PWM 모드 1: 카운터가 CCR 보다 작은 동안 출력이 켜진다. 듀티 = CCR / (ARR + 1).

    공식과 근거

    카운터 클럭 = fclk / (PSC + 1)  ·  엣지 정렬 f_PWM = fclk / ((PSC + 1)(ARR + 1))  ·  듀티 = CCR / (ARR + 1)
    센터 정렬 f_PWM = fclk / ((PSC + 1) × 2 × ARR)  ·  듀티 = CCR / ARR

    PSC 와 ARR 은 레지스터에 「실제 나누는 수 − 1」을 넣는다(0 이면 1로 나눈다). 같은 주파수라도 PSC 를 작게, ARR 을 크게 잡을수록 듀티를 잘게 조절할 수 있다(분해능 = log₂(ARR + 1) 비트).

    근거: STM32 각 시리즈 레퍼런스 매뉴얼의 범용 타이머(TIMx) 장 — 프리스케일러, 자동 재장전 레지스터, PWM 모드.

    흔한 실수

    타이머 클럭을 APB 클럭으로 착각 — 많은 STM32 에서 APB 프리스케일러가 1이 아니면 타이머 클럭은 APB 클럭의 2배다. 예) APB1 36 MHz 이면 TIM2 는 72 MHz. CubeMX 클럭 트리의 「APB Timer clocks」 값을 넣는다.
    PSC · ARR 에 −1 을 안 하기 — 1000 으로 나누고 싶으면 999 를 넣는다. 안 빼면 주파수가 조금씩(0.1% 등) 어긋나 오래 쌓이면 티가 난다.
    16비트 타이머에 큰 ARR — TIM2 · TIM5 처럼 32비트인 타이머도 있지만 대부분 16비트다. ARR 은 65535 를 넘을 수 없다.
    CCR 을 ARR + 1 이상으로 — 엣지 정렬에서 CCR ≥ ARR + 1 이면 계속 켜진 100% 출력이 된다. 0 이면 0%.

    자주 묻는 것

    모터 · LED 에 몇 kHz 를 쓰나

    LED 밝기는 깜빡임이 안 보이게 대략 1 kHz 이상, 모터는 소리가 들리지 않게 20 kHz 이상을 흔히 쓴다. 너무 높으면 스위칭 손실이 늘어난다.

    PSC 를 0 으로 두면 안 되나

    된다. 클럭을 그대로 쓰므로 분해능이 가장 크다. 다만 낮은 주파수에서는 ARR 이 65535 를 넘어 16비트 타이머로는 안 되므로 PSC 를 올린다. 계산기가 이 판단을 한다.

    관련 계산기