3.13. การสร้างสัญญาณแอนะล็อกด้วย PWM และฟิลเตอร์ RC¶
ADC อ่านแรงดันบนพิน ในทางกลับกัน -- การสร้างแรงดันกลางระหว่าง 0 V และ Vcc บนพิน -- ทำได้ยากกว่า เพราะเอาต์พุต GPIO รู้จักแค่การขับที่รางทั้งสอง วิธีทดแทนมาตรฐานคือการสลับพินระหว่างรางเร็วพอที่ แรงดันเฉลี่ย คือสิ่งที่ต้องการ
3.13.1. การมอดูเลตความกว้างพัลส์¶
สัญญาณ PWM (Pulse-Width Modulated) คือคลื่นสี่เหลี่ยมที่ความถี่คงที่ โดยเวลาสูง -- เศษส่วนของแต่ละรอบที่อยู่ที่ Vcc แทนที่จะเป็นกราวด์ -- กำหนดด้วยซอฟต์แวร์ เศษส่วนนั้นคือ ดิวตีไซเคิล แรงดันเฉลี่ยของคลื่นคือดิวตีไซเคิลคูณ Vcc:
V_avg = duty × Vcc
ดิวตีไซเคิล 25% เฉลี่ยได้ Vcc / 4 ดิวตีไซเคิล 50% ได้ Vcc / 2 ดิวตีไซเคิล 75% ได้ 3 × Vcc / 4
PWM ที่ดิวตีไซเคิล 25%, 50% และ 75% แรงดันเฉลี่ยตามดิวตีไซเคิล¶
ความถี่กำหนดเมื่อกำหนดค่า 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)
นั่นจะเริ่มคลื่นสี่เหลี่ยม 20 kHz ที่ดิวตี 50% บน P7 สองเมธอดเปลี่ยนเอาต์พุตแบบไดนามิก:
pwm.duty_u16(16384) # change to 25 % (16384 / 65535)
pwm.freq(5_000) # change to 5 kHz
duty_u16() รับจำนวนเต็มไม่มีเครื่องหมาย 16 บิตโดยแมป 0 เป็น "ต่ำตลอดเวลา" และ 65535 เป็น "สูงตลอดเวลา" freq() กำหนดความถี่พาหะในหน่วยเฮิรตซ์
Note
ช่อง PWM ทุกช่องบนตัวจับเวลาฮาร์ดแวร์เดียวกันใช้ความถี่ร่วมกัน การเรียก freq() บนช่องหนึ่งจะเปลี่ยนทุกช่องอื่นที่ติดอยู่กับตัวจับเวลานั้น ใช้ช่องของตัวจับเวลาต่างกันเมื่อเอาต์พุตต้องทำงานที่ความถี่ต่างกัน
เรียก deinit() เพื่อปลดปล่อยช่องตัวจับเวลาเมื่อไม่ต้องการเอาต์พุตอีกต่อไป
3.13.3. การเฉลี่ยด้วยฟิลเตอร์ผ่านต่ำ RC¶
PWM ดิบไม่ใช่แรงดันราบเรียบ มันคือคลื่นสี่เหลี่ยมที่ค่าเฉลี่ยเป็นสิ่งที่ต้องการ ในการดึงค่าเฉลี่ยนั้น ให้ส่ง PWM ผ่านฟิลเตอร์ผ่านต่ำ -- การรวมกันของตัวต้านทานและตัวเก็บประจุเดียวกับที่ใช้สำหรับการขจัดการกระเด้งของสวิตช์ใน การดีเบาวน์ซิง
PWM ผ่านฟิลเตอร์ผ่านต่ำ RC: ตัวเก็บประจุเฉลี่ยคลื่นสี่เหลี่ยมเป็นแรงดัน DC ตามสัดส่วนดิวตีไซเคิล¶
ความถี่ตัดของฟิลเตอร์ -- ขอบเขตระหว่างความถี่ที่ผ่านได้และที่ถูกบล็อก -- กำหนดโดยผลคูณ RC เดียวกันที่ให้ค่าคงที่เวลาสำหรับวงจรขจัดการกระเด้ง:
f_c = 1 / (2π × R × C)
เพื่อให้ฟิลเตอร์ดึงแรงดัน DC สะอาดจากอินพุต PWM ความถี่ตัดต้องต่ำกว่าความถี่ 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 ลงเหลือประมาณ Vcc / 200 ของริปเปิลที่เหลือที่ V_out -- ประมาณ 16 mV ที่ 3.3 V
หมายเหตุปฏิบัติสองประการ:
อิมพีแดนซ์เอาต์พุตของฟิลเตอร์ประมาณ
Rโหลดดาวน์สตรีมใดที่ดึงกระแสจะทำให้Rและโหลดกลายเป็นตัวแบ่งที่ดึงV_outต่ำกว่าค่าเฉลี่ยในอุดมคติ เหมือนกับตัวแบ่งในหน้า การอ่านค่าแอนะล็อกด้วย ADC ต่อพิน ADC หรือบัฟเฟอร์อิมพีแดนซ์สูง ไม่ใช่โหลดที่ดูดกระแสมิลลิแอมป์ตัวเก็บประจุใช้เวลาประมาณ
5 × R × C ≈ 8 msในการเสถียรเมื่อดิวตีไซเคิลเปลี่ยนแปลงV_outล้าหลังการตั้งดิวตีเท่านั้น สำหรับเซ็ตพอยต์ที่ต้องอัปเดตเร็วกว่า ให้เพิ่มความถี่ตัด (RหรือCเล็กลง) และยอมรับริปเปิลที่มากขึ้น