3.13. Menghasilkan sinyal analog dengan PWM dan filter RC

ADC membaca tegangan pada sebuah pin. Kebalikannya -- menghasilkan tegangan menengah antara 0 V dan Vcc pada pin -- lebih sulit, karena keluaran GPIO hanya tahu cara mengemudikan kedua relnya. Pengganti standarnya adalah mengalihkan pin antara rel cukup cepat sehingga tegangan rata-rata adalah yang diinginkan.

3.13.1. Modulasi lebar pulsa

Sinyal yang dimodulasi lebar pulsa (PWM) adalah gelombang kotak pada frekuensi tetap dengan waktu tinggi -- fraksi dari setiap siklus yang dihabiskan di Vcc alih-alih ground -- yang diatur dalam perangkat lunak. Fraksi tersebut adalah siklus kerja (duty cycle). Tegangan rata-rata bentuk gelombang adalah siklus kerja dikalikan Vcc:

V_avg = duty × Vcc

Siklus kerja 25% menghasilkan rata-rata Vcc / 4; siklus kerja 50% menghasilkan Vcc / 2; siklus kerja 75% menghasilkan 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 pada siklus kerja 25%, 50%, dan 75%. Tegangan rata-rata mengikuti siklus kerja.

Frekuensi diatur saat PWM dikonfigurasi; siklus kerja adalah yang diubah perangkat lunak secara langsung. Kelas machine.PWM membungkus saluran timer perangkat keras yang menghasilkan bentuk gelombang tanpa bantuan CPU -- setelah dikonfigurasi, sinyal berlanjut pada frekuensi dan siklus kerja yang dipilih hingga diubah.

3.13.2. Kelas machine.PWM

Buatlah instans PWM dengan pin serta frekuensi dan duty awal:

from machine import PWM, Pin

pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)

Perintah tersebut memulai gelombang kotak 20 kHz pada duty 50% di P7. Dua metode mengubah keluaran secara langsung:

pwm.duty_u16(16384)   # change to 25 % (16384 / 65535)
pwm.freq(5_000)       # change to 5 kHz

duty_u16() menerima bilangan bulat 16-bit tak bertanda yang memetakan 0 ke "selalu rendah" dan 65535 ke "selalu tinggi". freq() mengatur frekuensi pembawa dalam hertz.

Catatan

Setiap saluran PWM pada timer perangkat keras yang sama berbagi frekuensinya. Memanggil freq() pada satu saluran mengubah setiap saluran lain yang terhubung ke timer tersebut. Gunakan saluran dari timer yang berbeda bila keluaran harus berjalan pada frekuensi yang berbeda.

Panggil deinit() untuk melepaskan saluran timer saat keluaran tidak lagi diperlukan.

3.13.3. Meratakan dengan filter low-pass RC

PWM mentah bukanlah tegangan yang halus; itu adalah gelombang kotak yang rata-ratanya adalah yang kita inginkan. Untuk mengekstrak rata-rata tersebut, lewatkan PWM melalui filter low-pass -- kombinasi resistor-dan-kapasitor yang sama yang digunakan untuk debouncing sakelar di Debouncing.

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 melalui filter low-pass RC: kapasitor meratakan gelombang kotak menjadi tegangan DC yang proporsional dengan siklus kerja.

Frekuensi cutoff filter -- batas antara frekuensi yang diloloskan dan yang diblokir -- ditentukan oleh perkalian RC yang sama yang memberikan konstanta waktu untuk sirkuit debounce:

f_c = 1 / (2π × R × C)

Agar filter mengekstrak tegangan DC yang bersih dari masukan PWM, frekuensi cutoff harus jauh lebih rendah dari frekuensi PWM itu sendiri. Komponen DC (frekuensi 0) melewatinya tanpa perubahan; harmonik fundamental PWM (pada frekuensi PWM) dilemahkan sekitar f_c / f_PWM. Rasio 1 / 200 memangkas riak sisa pada keluaran menjadi sekitar 0.5 % dari ayunan masukan.

Titik awal yang masuk akal untuk setpoint yang berubah lambat:

  • Frekuensi PWM f_PWM = 20 kHz -- jauh di atas audio, dan mudah dibangkitkan timer secara bersih.

  • Nilai filter R = 1.6 , C = 1 µF -- memberikan f_c = 1 / (2π × 1.6 × 1 µF) 100 Hz.

Penekanan 200× pada pembawa mengurangi ayunan penuh PWM menjadi sekitar Vcc / 200 dari riak sisa di V_out -- sekitar 16 mV pada 3,3 V.

Dua catatan praktis:

  • Impedansi keluaran filter adalah sekitar R. Beban hilir yang menarik arus mengubah R dan beban tersebut menjadi pembagi yang menarik V_out di bawah rata-rata ideal, persis seperti pembagi di halaman Membaca sinyal analog dengan ADC. Sambungkan ke pin ADC atau buffer berimpedansi tinggi, bukan beban yang menyerap miliampere.

  • Kapasitor membutuhkan waktu sekitar 5 × R × C 8 ms untuk menstabilkan saat siklus kerja berubah; V_out tertinggal dari pengaturan duty sebesar itu. Untuk setpoint yang perlu diperbarui lebih cepat, naikkan cutoff (R atau C yang lebih kecil) dan terima lebih banyak riak.