디지털 출력의 켜짐 비율을 조절해 아날로그처럼 쓰는 기법 (Pulse Width Modulation).
원리
주기 T 안에서 High인 시간의 비율 = 듀티 사이클
듀티 25% ┌───┐___┌───┐___ 평균 전압 = VCC × 0.25
듀티 50% ┌───┐__ ┌───┐__ 평균 전압 = VCC × 0.50
듀티 75% ┌───┐_ ┌───┐_ 평균 전압 = VCC × 0.75
DAC 없이 아날로그 출력을 흉내낸다.
왜 평균이 통하는가 — 부하가 필터 역할
- LED — : 사람 눈의 잔상 (수백 Hz 이상이면 연속으로 보인다)
- 모터 — : 회전 관성 (전기적 시정수보다 기계적 반응이 느리다)
- 히터 — : 열 용량
- 스피커 — : 스피커 코일의 인덕턴스 + 공기
부하 자체가 저역 통과 필터로 동작해 평균값에 반응한다. 필요하면 RC 필터를 추가해 진짜 아날로그 전압을 만들 수도 있다(간이 DAC).
왜 선형 조절보다 나은가
-
저항으로 전압을 낮추는 방식
-
남는 전력이 열로 소모된다. 효율이 나쁘다
-
PWM
-
트랜지스터가 완전히 켜지거나 완전히 꺼진다
-
켜졌을 때는 전압 강하가 거의 0, 꺼졌을 때는 전류가 0
-
이론상 손실이 없다. 실제로도 90% 이상 효율
스위칭 방식이 선형 방식보다 효율적인 이유이며, SMPS 전원장치도 같은 원리다.
주파수 선택 — 용도마다 다르다
- LED 조광 — : 100Hz 이상 (깜빡임 방지). 카메라 촬영이면 1kHz 이상
- 낮으면 영상에 줄무늬가 생긴다
- DC 모터 — : 1~20kHz. 가청 주파수(20Hz~20kHz)를 피하면 조용하다
- 20kHz 이상이면 소음이 안 들린다
- 서보 모터 — : 50Hz 고정 (규격). 펄스 폭 1~2ms로 각도 제어
- 스위칭 전원 : 100kHz~수 MHz
- 히터 — : 1Hz 이하도 가능 (열 관성이 크다)
모터에서 가청 주파수를 쓰면 "삐-" 하는 소리가 난다. 20kHz 이상으로 올리면 사라지지만 스위칭 손실이 늘어난다.
분해능과 주파수의 트레이드오프
타이머 클럭 = 84MHz
-
주파수 20kHz 원하면 → ARR = 84MHz / 20kHz - 1 = 4199
-
분해능 4200단계 (약 12비트) ✓ 충분
-
주파수 1MHz 원하면 → ARR = 83
-
분해능 84단계 (약 6.4비트) ✗ 거칠다
주파수를 올리면 분해능이 떨어진다. 클럭이 정해져 있기 때문이다. 둘 다 필요하면 더 빠른 타이머 클럭이 필요하다.
서보 모터 제어 예
주기 20ms (50Hz), 펄스 폭으로 각도 결정 1.0ms → 0도 1.5ms → 90도 (중립) 2.0ms → 180도
타이머 클럭 84MHz, PSC = 83 → 1MHz (1μs 단위) ARR = 19999 → 20ms 주기
- CCR = 1500 — → 1.5ms 펄스 = 90도
PSC로 시간 단위를 만들고, ARR로 주기를, CCR로 폭을 정한다는 구조가 명확히 드러나는 예다.
데드타임 — 모터 드라이버에서 필수
- H-브리지의 상단·하단 스위치가 동시에 켜지면 → 전원 단락(shoot-through)
- 순간적으로 큰 전류 → 소자 파괴
한쪽을 끄고 다른 쪽을 켜기까지 짧은 지연(데드타임)을 둔다
sBreakDeadTimeConfig.DeadTime = 100; // 하드웨어가 자동 삽입
고급 타이머(TIM1, TIM8)가 상보 출력과 데드타임을 하드웨어로 제공한다. 소프트웨어로 만들면 지터 때문에 위험하다.
센터 얼라인 모드
에지 얼라인 : 카운터가 0→ARR 반복. 펄스가 한쪽에 몰린다 센터 얼라인 : 0→ARR→0 왕복. 펄스가 주기 중앙에 위치
- 3상 모터 제어에서 고조파가 줄어 진동·소음이 감소
BLDC·PMSM 모터 제어에서 표준적으로 쓴다.
실무 주의점
✅ 듀티 0%와 100%가 제대로 나오는지 확인 (CCR=0, CCR>ARR) ✅ 듀티 변경은 프리로드(ARPE/OCPE)를 켜서 주기 경계에서 반영
-
안 그러면 파형이 순간적으로 깨진다 ✅ 여러 채널의 위상을 맞추려면 같은 타이머 사용 ✅ 모터 정지 시 PWM을 끄는 것과 듀티 0은 다르다
-
(브레이크 여부가 달라진다)