PWM: pin yang hanya bisa nyala atau mati, memalsukan nilai di antaranya
Atau lihat semua pelajaran.
- 465komponen di meja kerja
- 43board sedang berjalan
- 1.00xwaktu nyata, di semua board
Pin output digital hanya punya dua keadaan. Pin itu tidak bisa diam di 2.5 V untuk membuat LED setengah terang. Pulse-width modulation mendapatkan efek yang sama dengan cara lain: nyalakan dan matikan pin cukup cepat, lalu atur berapa lama dari setiap siklus pin itu menyala, maka apa pun di hilirnya yang tidak bisa bereaksi secepat pergantian itu hanya melihat rata-ratanya, yang berperilaku seperti tegangan di antara yang sungguhan.
Rangkaian di atas adalah program fade bawaan Arduino Uno, berjalan sungguhan. analogWrite() di pin 9 memasang timer 1 ke PWM phase-correct 8-bit dengan prescaler 64, yang hasilnya 16 MHz dibagi 64 kali 510, sekitar 490 Hz. Angka itu bukan tebakan; itulah yang benar-benar dihasilkan hardware timer di prescaler dan mode itu, dan setelah diatur, timer menahan duty cycle-nya sendiri. Sketch hanya mengubah register compare, tiga puluh kali per detik, melangkah melalui tabel 64 entri berbentuk satu siklus (1 - kosinus) dibagi 2, yang membuat cahayanya terlihat seperti bernapas, bukan naik dalam garis lurus: mata membaca kecerahan kira-kira secara logaritmik, jadi kenaikan linear terlihat terburu-buru di bagian atasnya.
Itulah PWM hardware: begitu timer diatur, CPU bebas mengerjakan hal lain di antara pembaruan, dan gelombang di pin tidak pernah terganggu walaupun sketch sedang sibuk sebentar. PWM software, cadangan untuk pin yang tidak punya timer di belakangnya, membuat CPU membalik pin itu sendiri sesuai jadwal, yang memakan waktu CPU sebanding dengan frekuensinya dan bisa bergetar (jitter) kalau ada hal lain yang butuh prosesor di saat yang salah.
Yang kamu lihat di LED juga bukan pergantian nyala-mati sesaatnya. Probe LED di Mokxi adalah rata-rata singkat dari kecerahannya sendiri, dengan konstanta waktu mendekati 8 milidetik, sekitar rentang waktu yang dibutuhkan mata untuk merespons perubahan. Di 490 Hz, setiap siklus PWM sekitar 2 milidetik, jauh lebih cepat daripada yang bisa diikuti rata-rata itu, jadi LED melaporkan duty cycle-nya dengan selisih beberapa persen saja, bukan berkedip sekali per siklus. Itu bukan trik tampilan pengganti efek buram; itu perataan yang sama dengan yang dilakukan retina sungguhan, dihitung dengan cara yang sama.
Buka rangkaiannya dan lihat "napasnya" masuk ke iramanya. Perbandingan yang layak dicoba berikutnya ada di ESP32-C3, yang punya napas yang sama dengan dua cara: fade menjalankannya secara bit-bang di software, dan pwmfade menyerahkannya ke LEDC, pengendali PWM milik chip itu sendiri, di pin mana pun, bukan hanya di enam pin tertentu. Keduanya ada di halaman simulator board.
Rakit versi nyatanya
Buka editor, ubah sebuah nilai, dan lihat angkanya ikut berubah. Tidak ada yang perlu dipasang, dan tidak perlu akun.