3.13. Tạo tín hiệu analog bằng PWM và bộ lọc RC¶
ADC đọc điện áp trên một chân (pin). Điều ngược lại -- tạo ra điện áp trung gian giữa 0 V và Vcc trên một chân -- khó hơn, vì đầu ra GPIO chỉ biết cách lái hai cực của nó. Giải pháp thay thế tiêu chuẩn là chuyển mạch chân giữa các cực đủ nhanh để điện áp trung bình là thứ bạn quan tâm.
3.13.1. Điều chế độ rộng xung¶
Tín hiệu điều chế độ rộng xung (PWM) là sóng vuông ở tần số cố định có thời gian ở mức cao -- phần của mỗi chu kỳ ở Vcc thay vì đất -- được đặt bằng phần mềm. Phần đó là chu kỳ nhiệm vụ (duty cycle). Điện áp trung bình của dạng sóng là chu kỳ nhiệm vụ nhân với Vcc:
V_avg = duty × Vcc
Chu kỳ nhiệm vụ 25% tương đương điện áp trung bình Vcc / 4; chu kỳ 50% tương đương Vcc / 2; chu kỳ 75% tương đương 3 × Vcc / 4.
PWM ở chu kỳ nhiệm vụ 25%, 50% và 75%. Điện áp trung bình bám theo chu kỳ nhiệm vụ.¶
Tần số được đặt khi PWM được cấu hình; chu kỳ nhiệm vụ là thứ phần mềm thay đổi khi đang chạy. Lớp machine.PWM bọc một kênh bộ định thời phần cứng tạo ra dạng sóng mà không cần CPU -- một khi được cấu hình, tín hiệu tiếp tục ở tần số và chu kỳ nhiệm vụ đã chọn cho đến khi thay đổi.
3.13.2. Lớp machine.PWM¶
Khởi tạo một thực thể PWM với chân (pin) và tần số, chu kỳ ban đầu:
from machine import PWM, Pin
pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)
Điều đó bắt đầu sóng vuông 20 kHz ở chu kỳ 50% trên P7. Hai phương thức thay đổi đầu ra khi đang chạy:
pwm.duty_u16(16384) # change to 25 % (16384 / 65535)
pwm.freq(5_000) # change to 5 kHz
duty_u16() nhận một số nguyên không dấu 16 bit ánh xạ 0 đến "luôn thấp" và 65535 đến "luôn cao". freq() đặt tần số sóng mang tính bằng hertz.
Ghi chú
Mỗi kênh PWM trên cùng một bộ định thời phần cứng chia sẻ tần số của nó. Gọi freq() trên một kênh sẽ thay đổi mọi kênh khác gắn với bộ định thời đó. Sử dụng các kênh của các bộ định thời khác nhau khi các đầu ra phải chạy ở các tần số khác nhau.
Gọi deinit() để giải phóng kênh bộ định thời khi đầu ra không còn cần thiết.
3.13.3. Lấy trung bình bằng bộ lọc thông thấp RC¶
PWM thô không phải là điện áp mượt mà; nó là sóng vuông có giá trị trung bình là thứ chúng ta muốn. Để trích xuất giá trị trung bình đó, đưa PWM qua bộ lọc thông thấp -- cùng tổ hợp điện trở và tụ điện được dùng để khử rung công tắc trong Khử rung (Debouncing).
PWM qua bộ lọc thông thấp RC: tụ điện lấy trung bình sóng vuông thành điện áp DC tỉ lệ với chu kỳ nhiệm vụ.¶
Tần số cắt của bộ lọc -- ranh giới giữa các tần số nó cho qua và những tần số nó chặn -- được đặt bởi cùng tích RC cho hằng số thời gian của mạch khử rung:
f_c = 1 / (2π × R × C)
Để bộ lọc trích xuất điện áp DC sạch từ đầu vào PWM, tần số cắt phải thấp hơn nhiều so với chính tần số PWM. Thành phần DC (tần số 0) đi qua không thay đổi; sóng hài cơ bản của PWM (ở tần số PWM) bị suy giảm khoảng f_c / f_PWM. Tỉ số 1 / 200 cắt nhiễu gợn còn lại ở đầu ra xuống khoảng 0.5 % của biên độ đầu vào.
Điểm khởi đầu hợp lý cho điểm đặt thay đổi chậm:
Tần số PWM
f_PWM = 20 kHz-- cao hơn nhiều so với âm thanh, và bộ định thời dễ dàng tạo ra sạch sẽ.Giá trị bộ lọc
R = 1.6 kΩ,C = 1 µF-- chof_c = 1 / (2π × 1.6 kΩ × 1 µF) ≈ 100 Hz.
Mức triệt tiêu 200× ở tần số sóng mang giảm toàn bộ biên độ PWM xuống còn khoảng Vcc / 200 gợn còn lại ở V_out -- khoảng 16 mV ở 3,3 V.
Hai lưu ý thực tế:
Trở kháng đầu ra của bộ lọc là khoảng
R. Bất kỳ tải phía hạ lưu nào lấy dòng điện sẽ biếnRvà tải thành một bộ chia kéoV_outxuống dưới giá trị trung bình lý tưởng, giống hệt như bộ chia trên trang Đọc tín hiệu analog bằng ADC. Cấp cho chân ADC hoặc bộ đệm trở kháng cao, không phải tải tiêu thụ miliampe.Tụ điện mất khoảng
5 × R × C ≈ 8 msđể ổn định khi chu kỳ nhiệm vụ thay đổi;V_outtrễ so với cài đặt chu kỳ bấy nhiêu. Đối với điểm đặt cần cập nhật nhanh hơn, tăng tần số cắt (giảmRhoặcC) và chấp nhận nhiễu gợn nhiều hơn.