หรี่ไฟด้วย PWM แล้วทำไมค่าบางช่วงไม่ต่างกัน

เวลาทำแถบเลื่อนปรับแสง เราอาจเริ่มจากรับค่าบนหน้าจอแล้วส่งไปเป็น PWM ถ้าลากแล้วหลอดสว่างขึ้นก็ดูเหมือนงานเดินไปได้ดี จนกระทั่งสังเกตว่าบางช่วงลากตั้งไกลแต่แสงแทบไม่เปลี่ยน ขณะที่ช่วงมืดเปลี่ยนทีละนิดกลับเห็นเป็นขั้นชัด
อาการลักษณะนี้มีทั้งส่วนของการสร้างสัญญาณและส่วนของการรับรู้แสงครับ ก่อนเพิ่มความละเอียดหรือแก้เส้นโค้ง จึงควรแยกว่าตัวเลขผ่านแต่ละขั้นมาอย่างไร และ timer กำลังทำสิ่งที่เราขอได้จริงหรือเปล่า
สำหรับบอร์ดตระกูล ESP32 ที่ใช้ LEDC เราสามารถเริ่มจากความสัมพันธ์ระหว่างความถี่กับความละเอียด แล้วค่อยไล่จากค่าของแถบเลื่อนไปถึง duty ที่ส่งออก โดยยังไม่ต้องเดาว่าปัญหาทั้งหมดมาจากสายตาหรือมาจากชิปเพียงอย่างเดียว
ความถี่บอกจังหวะ ส่วน duty บอกสัดส่วน
PWM เป็นการสลับสัญญาณเป็นคาบ โดย duty cycle ใช้อธิบายสัดส่วนเวลาที่อยู่ในสถานะทำงานภายในคาบนั้น ส่วนความถี่บอกว่ามีคาบเกิดขึ้นเร็วเพียงใด สองค่าจึงตอบคำถามต่างกัน แม้จะต้องตั้งร่วมกันตอนสร้างสัญญาณ
การเพิ่ม duty ที่ความถี่เดิมทำให้สัดส่วนเวลาเปลี่ยน ส่วนการเพิ่มความถี่โดยรักษา duty ไว้ทำให้แต่ละคาบสั้นลง แต่สัดส่วนยังเดิม จึงไม่ควรใช้คำว่าปรับความถี่แทนการปรับความสว่างทุกกรณี เพราะวงจรขับและโหลดจะตอบสนองตามลักษณะของมันด้วย

ถ้าเป็น LED ที่มีวงจรขับเฉพาะ ควรตรวจวิธี dimming และช่วงสัญญาณที่วงจรนั้นรับได้ก่อน การสร้าง PWM จากชิปได้ไม่ได้แปลว่าต่อกับ LED หรือแถบไฟชนิดใดก็ได้ตรงๆ เพราะหน้าที่จ่ายกระแสและข้อจำกัดทางไฟฟ้ายังเป็นงานของวงจรด้านโหลด
ความละเอียดต้องแบ่งอยู่ในเวลาหนึ่งคาบ
timer ใช้แหล่งนาฬิกาและตัวนับสร้างคาบ จึงมีข้อจำกัดว่าจะแบ่งหนึ่งคาบเป็นระดับได้ละเอียดเพียงใดเมื่อเลือกความถี่หนึ่งไว้ เราจึงไม่สามารถเพิ่มทั้งความถี่และจำนวนระดับอย่างอิสระได้ทุกค่า
ความละเอียดที่ระบุเป็นบิตช่วยบอกจำนวนระดับเชิงตัวเลข เช่น 8 บิตมี 256 ระดับ ส่วน 10 บิตมี 1,024 ระดับ แต่ช่วง duty ที่ API อนุญาตและพฤติกรรมปลายช่วงต้องดูตามชิปกับ driver ที่ใช้ ไม่ควรเดาจากจำนวนบิตอย่างเดียวแล้วข้ามการตรวจผลตั้งค่า
ใน LEDC การตั้งความถี่กับความละเอียดที่ทำไม่ได้อาจคืนข้อผิดพลาด เราจึงควรตรวจผลการเรียกและเก็บค่าที่ใช้สำเร็จไว้ ไม่ปล่อยให้โปรแกรมทำต่อแล้วใช้ความรู้สึกจากแสงเป็นเครื่องตัดสินว่าการตั้งค่ารอบนั้นถูกนำไปใช้แล้ว
ถ้าหลายช่องใช้ timer ร่วมกัน การแก้ timer ก็อาจมีผลกับช่องอื่นด้วย จึงควรจัดรายการว่าช่องใดผูกกับ timer ไหน และงานใดต้องเปลี่ยนความถี่จริง เพื่อไม่ให้การปรับหลอดหนึ่งไปเปลี่ยนพฤติกรรมอีกหลอดโดยไม่ได้ตั้งใจ
ตัวเลขบนจออาจถูกบีบเหลือไม่กี่ระดับ
ก่อนกล่าวถึงการรับรู้แสง ลองตามเส้นทางค่าจาก UI ก่อน ถ้าแถบเลื่อนมีเพียงร้อยกว่าตำแหน่ง ต่อให้ปลายทางรองรับระดับมากกว่านั้นมาก เราก็ยังมีจำนวนค่าตั้งต้นจำกัดอยู่ การเพิ่มบิตจึงอาจไม่สร้างความต่างถ้าไม่ได้เปลี่ยนการแปลงค่าฝั่งต้นทาง
ปัญหาอาจอยู่ที่ชนิดตัวแปรหรือการหารจำนวนเต็มด้วย เช่น คำนวณสัดส่วนโดยหารก่อนคูณจนข้อมูลส่วนเศษหายไป ค่าหลายตำแหน่งจึงกลายเป็น duty เดียวกันได้ ควรพิมพ์ค่าจาก UI ค่าหลังแปลง และค่าที่ส่งเข้า driver ไว้เทียบกันระหว่างตรวจ

เมื่อเห็นเส้นทางนี้แล้ว เราจะรู้ว่าควรเพิ่มความละเอียดที่ส่วนใด ถ้าค่าถูกปัดตั้งแต่รับคำสั่ง การไปเพิ่มความละเอียดของ timer อย่างเดียวก็ยังแก้ไม่ถึงต้นเหตุ และถ้าค่าจากหลายแหล่งเข้ามาพร้อมกันก็ควรกำหนดว่าแหล่งใดเป็นเจ้าของค่าปัจจุบันให้ชัดด้วย
ระดับแสงที่มองเห็นไม่จำเป็นต้องเดินเท่าตัวเลข
แม้ duty จะเปลี่ยนเป็นขั้นสม่ำเสมอ ความรู้สึกสว่างที่คนเห็นอาจไม่ได้เปลี่ยนเป็นขั้นเท่ากัน ส่วนช่วงต่ำยังอาจมีข้อจำกัดของวงจรขับทำให้เกิดพฤติกรรมที่ต้องตรวจเฉพาะชุดอุปกรณ์
การใช้เส้นโค้งหรือ lookup table เพื่อแปลงค่าที่ผู้ใช้เลือกเป็น duty จึงเป็นอีกเรื่องหนึ่งหลังจากรู้ว่าการสร้างสัญญาณถูกต้องแล้ว วิธีแปลงควรถูกเลือกจากประสบการณ์ใช้งานที่ต้องการและตรวจบนโหลดจริง ไม่คัดตัวเลขจากหลอดคนละชนิดแล้วถือว่าให้ผลเหมือนกัน
ถ้าจะเปรียบเทียบหลายเส้นโค้ง ควรคงความถี่ วงจรขับ แหล่งจ่าย และสภาพแสงรอบตัวไว้ก่อน แล้วเก็บรายการค่าที่ทดสอบกับสิ่งที่สังเกตได้ แทนการเปลี่ยนหลายอย่างพร้อมกันจนตามไม่ได้ว่าปัจจัยใดช่วยให้ช่วงมืดปรับได้ละเอียดขึ้น
การถ่ายด้วยกล้องอาจทำให้เห็นลายหรือการกะพริบตามการตั้งค่ากล้องด้วย ภาพที่ได้จึงไม่ควรใช้ยืนยันพฤติกรรมทั้งหมดโดยไม่มีเงื่อนไขกำกับ หากต้องตรวจสัญญาณไฟฟ้าจริงก็ควรใช้เครื่องมือที่เหมาะกับสิ่งที่ต้องการวัด
เก็บการตั้งค่าที่ใช้จริงไว้กับเฟิร์มแวร์
เมื่อได้ชุดค่าที่เหมาะแล้ว ควรบันทึกรุ่นชิป framework ขา timer channel ความถี่ และความละเอียดไว้ด้วย เพราะตัวอย่างที่เรียก API ได้ในรุ่นหนึ่งอาจมีรายละเอียดต่างจากอีกรุ่น โดยเฉพาะตอนย้ายบอร์ดหรืออัปเดตไลบรารี
ส่วนเส้นโค้งปรับแสงก็ควรเป็นข้อมูลที่ระบุรุ่นได้ หากเปลี่ยนวิธีแปลงแล้วผู้ใช้รู้สึกว่าแถบเลื่อนเดิมให้แสงต่างไป เราจะได้ย้อนดูว่าพฤติกรรมเปลี่ยนจากตารางแปลงหรือจากการตั้ง timer และควรตรวจปลายช่วงกับการเปิดปิดโดยตรงให้ครบก่อนส่งงาน
การค่อยๆ เปลี่ยนค่าก็มีจังหวะของมัน
นอกจากระดับปลายทาง ลองตรวจว่าระหว่างลากแถบเลื่อนระบบส่งค่าถี่เพียงใด หากส่งทุกเหตุการณ์ผ่านเครือข่ายแล้วคำสั่งเก่ายังค้างอยู่ อุปกรณ์อาจไล่ทำค่าที่ผู้ใช้เลื่อนผ่านไปแล้ว จนดูเหมือนปรับไม่ลื่นทั้งที่ timer สร้างสัญญาณได้ปกติ การกำหนดอัตราส่งและเลือกใช้ค่าล่าสุดจึงเป็นส่วนหนึ่งของประสบการณ์ควบคุมด้วย
ส่วนการทำ fade อัตโนมัติควรแยกเวลาในการเปลี่ยนจากความละเอียดของ duty เพื่อให้ตรวจได้ว่าความไม่ต่อเนื่องมาจากจำนวนระดับหรือการอัปเดตเป็นช่วงๆ และต้องกำหนดด้วยว่าคำสั่งใหม่ระหว่าง fade จะหยุดหรือแทนค่ารอบเดิมอย่างไร
สรุป
เวลาปรับ PWM แล้วบางช่วงดูไม่ต่างกัน ให้แยกความถี่ ความละเอียด และเส้นทางแปลงค่าก่อน จากนั้นค่อยดูการตอบสนองของวงจรกับความรู้สึกสว่าง การตรวจค่าที่ driver รับจริงและเก็บเงื่อนไขของโหลดไว้ จะช่วยให้การปรับแสงมีเหตุผลตามได้ และไม่เพิ่มจำนวนบิตไปเรื่อยๆ โดยยังไม่รู้ว่าข้อมูลหายอยู่ตรงไหนครับ


