3.14. تعتيم LED باستخدام PWM¶
استخدمت صفحة توليد إشارة تماثلية باستخدام PWM ومرشح RC مرشح تمرير منخفض من نوع RC لاستخلاص جهد تيار مستمر من إشارة PWM. أما بالنسبة لمصباح LED فلا حاجة إلى المرشح -- إذ تقوم العين البشرية نفسها بحساب المتوسط.
عندما يُشغَّل مصباح LED ويُطفأ بوتيرة أسرع من نحو 60 Hz، يتوقف الجهاز البصري عن تمييز النبضات المنفردة ويدرك سطوعاً ثابتاً يساوي متوسط الخرج الضوئي. تُقرأ دورة تشغيل بنسبة 50 % على أنها نصف السطوع تقريباً؛ و25 % على أنها الربع؛ و10 % على أنها خافتة.
التوصيل هو نفسه كما في مصباح LED خارجي ثابت في خرج GPIO -- مقاومة محدِّدة للتيار على التسلسل مع المصباح، يُحدَّد حجمها باستخدام القواعد الواردة في أساسيات الإلكترونيات. والتغيير لا يكون إلا في البرنامج: إذ يعمل الدبوس بوصفه خرج PWM بدلاً من Pin.OUT العادي.
3.14.1. اختيار التردد¶
بالنسبة لتعتيم LED، لا يتعين على تردد PWM سوى تجاوز عتبة الوميض لدى العين:
تحت ~60 Hz تقريباً ترى العين النبضات مباشرةً.
تحت ~200 Hz تقريباً، لا يزال بإمكان الرؤية المحيطية والحركة السريعة للعين أن تكشف الوميض.
يقع 1 kHz فوق كل ذلك بأريحية وهو القيمة الافتراضية النموذجية.
ليس هناك حد أعلى ذو أهمية لمصباح LED صغير على GPIO؛ فأي قيمة من 1 kHz إلى 10 kHz تبدو متماثلة للعين.
3.14.2. التلاشي¶
تمسح حلقة الظهور التدريجي / الاختفاء التدريجي دورة التشغيل من الإطفاء إلى التشغيل الكامل والعودة، مع التوقف لبرهة عند كل خطوة:
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)
عند PWM بتردد 1 kHz وخطوات بمقدار 5 ms ترى العين تلاشياً سلساً في كلا الاتجاهين، مع تتبع السطوع الظاهري لقيمة دورة التشغيل.
السطوع المُدرَك ليس خطياً تماماً مع دورة التشغيل -- إذ تتبع استجابة العين قانوناً تربيعياً أو تكعيبياً تقريباً -- لذا فإن مسحاً خطياً لـ duty_u16 لا يبدو كمسح خطي للسطوع. وللحصول على تلاشٍ أكثر سلاسة إدراكياً، خطِّ دورة التشغيل على منحنى.
ثمة حيلة عملية تعتمد على الأعداد الصحيحة فقط، وهي زيادة عدّاد بطول 8 بتات واستخدام مربعه كدورة تشغيل. إن 255 × 255 = 65025 يقع ضمن حدود التقريب لكامل المقياس، فيغطي المسح المدى كله:
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)
يبدو التلاشي الآن متساوياً تقريباً في السطوع الظاهري من الإطفاء إلى الكامل.