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

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 %.

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 ผ่านฟิลเตอร์ผ่านต่ำ -- การรวมกันของตัวต้านทานและตัวเก็บประจุเดียวกับที่ใช้สำหรับการขจัดการกระเด้งของสวิตช์ใน การดีเบาวน์ซิง

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.

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 , C = 1 µF -- ให้ f_c = 1 / (2π × 1.6 × 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 เล็กลง) และยอมรับริปเปิลที่มากขึ้น