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 로 평균이 됩니다.

Three square-wave traces stacked vertically, each at the same frequency. The top wave is high for 25 % of each period and low for 75 %. The middle wave is high and low for half the period each. The bottom wave is high for 75 % and low for 25 %.

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을 저역 통과 필터에 통과시킵니다. 디바운싱 에서 스위치 디바운싱에 사용한 것과 동일한 저항-커패시터 조합입니다.

A PWM pin connects through a series resistor R to an output node. A capacitor C from that node to ground completes the low-pass filter; the smoothed voltage appears at V_out.

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 , C = 1 µFf_c = 1 / (2π × 1.6 × 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) 더 많은 리플을 감수하세요.