3.14. Peredupan LED dengan PWM

Halaman Menghasilkan sinyal analog dengan PWM dan filter RC menggunakan filter low-pass RC untuk mengekstrak tegangan DC dari sinyal PWM. Untuk LED, filter tidak diperlukan -- mata manusia sendiri yang melakukan perataan.

Ketika LED dinyalakan dan dimatikan lebih cepat dari sekitar 60 Hz, sistem penglihatan berhenti memisahkan pulsa individual dan merasakan kecerahan stabil yang sama dengan rata-rata keluaran cahaya. Duty cycle 50 % terasa seperti kira-kira setengah kecerahan; 25 % seperempat; 10 % redup.

Pemasangan kabelnya sama seperti untuk LED eksternal statis di Output GPIO -- resistor pembatas arus secara seri dengan LED, yang ditentukan menggunakan aturan dari Dasar-dasar elektronika. Perubahannya hanya pada perangkat lunak: pin berjalan sebagai output PWM alih-alih Pin.OUT biasa.

3.14.1. Memilih frekuensi

Untuk peredupan LED, frekuensi PWM hanya perlu melewati ambang batas fliker mata:

  • Di bawah ~60 Hz mata langsung melihat pulsa.

  • Di bawah ~200 Hz penglihatan perifer dan gerakan mata cepat masih dapat menampakkan fliker.

  • 1 kHz sudah jauh di atas semua itu dan merupakan default yang umum.

Tidak ada batas atas yang berarti untuk LED kecil pada GPIO; apa pun dari 1 kHz hingga 10 kHz terasa sama untuk mata.

3.14.2. Pemudaran

Loop fade-in / fade-out menyapu duty cycle dari mati ke penuh hidup dan kembali, sebentar berhenti di setiap langkah:

import time
from machine import PWM, Pin

led = PWM(Pin("P7"), freq=1000, duty_u16=0)

while True:
    for d in range(0, 65535, 256):
        led.duty_u16(d)
        time.sleep_ms(5)
    for d in range(65535, 0, -256):
        led.duty_u16(d)
        time.sleep_ms(5)

Pada PWM 1 kHz dan langkah 5 ms, mata melihat pemudaran yang mulus di kedua arah, dengan kecerahan yang tampak mengikuti nilai duty.

Kecerahan yang dirasakan tidak sepenuhnya linier terhadap duty cycle -- respons mata mengikuti kira-kira hukum kuadrat atau kubik -- sehingga sapuan linier duty_u16 tidak terlihat seperti sapuan linier kecerahan. Untuk pemudaran yang lebih mulus secara perseptual, naiki duty pada sebuah kurva.

Trik bilangan bulat yang mudah adalah dengan menaikkan counter 8-bit dan menggunakan kuadratnya sebagai duty cycle. 255 × 255 = 65025 berada dalam pembulatan skala penuh, sehingga sapuan mencakup seluruh rentang:

import time
from machine import PWM, Pin

led = PWM(Pin("P7"), freq=1000, duty_u16=0)

while True:
    for step in range(256):
        led.duty_u16(step * step)   # 0..65025, roughly quadratic
        time.sleep_ms(5)
    for step in range(255, -1, -1):
        led.duty_u16(step * step)
        time.sleep_ms(5)

Pemudaran kini terasa kira-kira merata dalam kecerahan yang tampak dari mati hingga penuh.