3.14. PWM을 이용한 LED 디밍

PWM과 RC 필터로 아날로그 생성하기 페이지에서는 RC 저역 통과 필터를 사용하여 PWM 신호에서 DC 전압을 추출했습니다. LED의 경우에는 필터가 필요 없습니다 – 사람의 눈 자체가 평균을 내기 때문입니다.

LED를 약 60 Hz보다 빠르게 켜고 끄면, 시각 시스템은 개별 펄스를 분간하지 못하고 평균 광량과 같은 일정한 밝기로 인식합니다. 50 % 듀티 사이클은 대략 절반 밝기로, 25 %는 4분의 1로, 10 %는 어둡게 보입니다.

배선은 GPIO 출력의 정적 외부 LED와 동일합니다 – LED와 직렬로 연결된 전류 제한 저항을 전자공학 기초의 규칙을 사용하여 산정합니다. 달라지는 것은 소프트웨어뿐입니다: 핀이 일반 Pin.OUT 대신 PWM 출력으로 동작합니다.

3.14.1. 주파수 선택하기

LED 디밍의 경우 PWM 주파수는 눈의 깜박임 임계값만 넘으면 됩니다:

  • 약 60 Hz 아래에서는 눈이 펄스를 그대로 봅니다.

  • 약 200 Hz 아래에서는 주변시와 빠른 안구 운동이 여전히 깜박임을 드러낼 수 있습니다.

  • 1 kHz는 그 모든 것보다 충분히 높으며 전형적인 기본값입니다.

GPIO에 연결된 작은 LED에 대해 의미 있는 상한은 없습니다. 1 kHz에서 10 kHz까지의 어떤 값이든 눈에는 똑같이 보입니다.

3.14.2. 페이딩

페이드인/페이드아웃 루프는 각 단계에서 잠시 머무르며 듀티 사이클을 꺼짐에서 완전 켜짐까지 올렸다가 다시 내립니다:

import time
from machine import PWM, Pin

led = PWM(Pin("P7"), freq=1000, duty_u16=0)

while True:
    for d in range(0, 65535, 256):
        led.duty_u16(d)
        time.sleep_ms(5)
    for d in range(65535, 0, -256):
        led.duty_u16(d)
        time.sleep_ms(5)

1 kHz PWM과 5 ms 단계에서는 눈이 양방향으로 부드러운 페이드를 보며, 겉보기 밝기가 듀티 값을 따라갑니다.

겉보기 밝기는 듀티 사이클에 엄밀히 선형이 아닙니다 – 눈의 반응은 대략 제곱 또는 세제곱 법칙을 따릅니다 – 따라서 duty_u16의 선형 스윕은 밝기의 선형 스윕처럼 보이지 않습니다. 지각적으로 더 부드러운 페이드를 위해서는 듀티를 곡선으로 단계 변화시키십시오.

편리한 정수 전용 기법은 8비트 카운터를 단계적으로 증가시키고 그 제곱을 듀티 사이클로 사용하는 것입니다. 255 × 255 = 65025는 반올림 오차 내에서 풀 스케일이므로, 스윕이 전체 범위를 커버합니다:

import time
from machine import PWM, Pin

led = PWM(Pin("P7"), freq=1000, duty_u16=0)

while True:
    for step in range(256):
        led.duty_u16(step * step)   # 0..65025, roughly quadratic
        time.sleep_ms(5)
    for step in range(255, -1, -1):
        led.duty_u16(step * step)
        time.sleep_ms(5)

이제 페이드는 꺼짐에서 최대까지 겉보기 밝기가 대략 고르게 느껴집니다.