3.13. PWM과 RC 필터로 아날로그 생성하기¶
ADC는 핀의 전압을 읽습니다. 반대로 핀에서 0V와 Vcc 사이의 중간 전압을 만들어내는 것은 더 어렵습니다. GPIO 출력은 두 레일을 구동하는 방법만 알기 때문입니다. 이를 대체하는 표준적인 방법은 평균 전압이 원하는 값이 되도록 핀을 레일 사이에서 충분히 빠르게 전환하는 것입니다.
3.13.1. 펄스 폭 변조¶
펄스 폭 변조(PWM) 신호는 고정된 주파수의 구형파로, 그 하이 타임(각 주기 중 접지 대신 Vcc에 머무는 비율)이 소프트웨어로 설정됩니다. 그 비율이 듀티 사이클입니다. 파형의 평균 전압은 듀티 사이클에 Vcc를 곱한 값입니다:
V_avg = duty × Vcc
25% 듀티 사이클은 Vcc / 4 로, 50% 듀티 사이클은 Vcc / 2 로, 75% 듀티 사이클은 3 × Vcc / 4 로 평균이 됩니다.
25%, 50%, 75% 듀티 사이클의 PWM. 평균 전압은 듀티 사이클을 따라갑니다.¶
주파수는 PWM이 구성될 때 설정되며, 듀티 사이클은 소프트웨어가 실시간으로 변경하는 값입니다. machine.PWM 클래스는 CPU의 도움 없이 파형을 생성하는 하드웨어 타이머 채널을 감쌉니다. 일단 구성되면 변경될 때까지 신호가 선택된 주파수와 듀티 사이클로 계속됩니다.
3.13.2. machine.PWM 클래스¶
핀과 초기 주파수 및 듀티로 PWM 인스턴스를 생성합니다:
from machine import PWM, Pin
pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)
이는 P7 에서 50% 듀티의 20kHz 구형파를 시작합니다. 두 가지 메서드로 출력을 실시간으로 변경합니다:
pwm.duty_u16(16384) # change to 25 % (16384 / 65535)
pwm.freq(5_000) # change to 5 kHz
duty_u16() 는 부호 없는 16비트 정수를 받아 0 을 “항상 로우”에, 65535 를 “항상 하이”에 매핑합니다. freq() 는 반송파 주파수를 헤르츠 단위로 설정합니다.
참고
같은 하드웨어 타이머에 속한 모든 PWM 채널은 주파수를 공유합니다. 한 채널에서 freq() 를 호출하면 그 타이머에 연결된 다른 모든 채널이 변경됩니다. 출력이 서로 다른 주파수로 동작해야 한다면 서로 다른 타이머의 채널을 사용하세요.
출력이 더 이상 필요하지 않을 때 타이머 채널을 해제하려면 deinit() 를 호출하세요.
3.13.3. RC 저역 통과 필터로 평균 내기¶
원시 PWM은 부드러운 전압이 아니라, 평균이 우리가 원하는 값인 구형파입니다. 그 평균을 추출하려면 PWM을 저역 통과 필터에 통과시킵니다. 디바운싱 에서 스위치 디바운싱에 사용한 것과 동일한 저항-커패시터 조합입니다.
RC 저역 통과 필터를 통과한 PWM: 커패시터가 구형파를 듀티 사이클에 비례하는 DC 전압으로 평균화합니다.¶
필터의 차단 주파수, 즉 통과시키는 주파수와 차단하는 주파수의 경계는 디바운스 회로의 시정수를 결정했던 것과 동일한 RC 곱에 의해 설정됩니다:
f_c = 1 / (2π × R × C)
필터가 PWM 입력에서 깨끗한 DC 전압을 추출하려면, 차단 주파수가 PWM 주파수 자체보다 훨씬 낮아야 합니다. DC 성분(주파수 0)은 변하지 않고 통과하고, PWM의 기본 고조파(PWM 주파수에서)는 대략 f_c / f_PWM 만큼 감쇠됩니다. 1 / 200 의 비율은 출력의 잔류 리플을 입력 진폭의 약 0.5 % 로 줄입니다.
느리게 변하는 설정값에 대한 합리적인 시작점:
PWM 주파수
f_PWM = 20 kHz로, 가청 영역보다 충분히 높고 타이머가 깔끔하게 생성하기 쉽습니다.필터 값
R = 1.6 kΩ,C = 1 µF는f_c = 1 / (2π × 1.6 kΩ × 1 µF) ≈ 100 Hz를 줍니다.
반송파에서의 200배 억제는 PWM의 전체 진폭을 V_out 에서 약 Vcc / 200 의 잔류 리플로 줄입니다. 3.3V에서 약 16mV입니다.
두 가지 실용적인 참고 사항:
필터의 출력 임피던스는 대략
R입니다. 전류를 끌어가는 하류 부하는R과 그 부하를 분배기로 만들어V_out을 이상적인 평균 아래로 끌어내립니다. ADC로 아날로그 읽기 페이지의 분배기와 정확히 같습니다. 밀리암페어를 흡수하는 부하가 아니라 ADC 핀이나 고임피던스 버퍼에 연결하세요.듀티 사이클이 변할 때 커패시터가 안정되는 데 약
5 × R × C ≈ 8 ms가 걸립니다.V_out은 그만큼 듀티 설정보다 지연됩니다. 더 빠르게 갱신되어야 하는 설정값에는 차단 주파수를 높이고(더 작은R또는C) 더 많은 리플을 감수하세요.