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

หรี่ไฟด้วย PWM แล้วทำไมค่าบางช่วงไม่ต่างกัน - Image 1
03/09/2025•Admin Team•
ESP32IoTTutorial

เวลาทำแถบเลื่อนปรับแสง เราอาจเริ่มจากรับค่าบนหน้าจอแล้วส่งไปเป็น PWM ถ้าลากแล้วหลอดสว่างขึ้นก็ดูเหมือนงานเดินไปได้ดี จนกระทั่งสังเกตว่าบางช่วงลากตั้งไกลแต่แสงแทบไม่เปลี่ยน ขณะที่ช่วงมืดเปลี่ยนทีละนิดกลับเห็นเป็นขั้นชัด

อาการลักษณะนี้มีทั้งส่วนของการสร้างสัญญาณและส่วนของการรับรู้แสงครับ ก่อนเพิ่มความละเอียดหรือแก้เส้นโค้ง จึงควรแยกว่าตัวเลขผ่านแต่ละขั้นมาอย่างไร และ timer กำลังทำสิ่งที่เราขอได้จริงหรือเปล่า

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

ความถี่บอกจังหวะ ส่วน duty บอกสัดส่วน

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

การเพิ่ม duty ที่ความถี่เดิมทำให้สัดส่วนเวลาเปลี่ยน ส่วนการเพิ่มความถี่โดยรักษา duty ไว้ทำให้แต่ละคาบสั้นลง แต่สัดส่วนยังเดิม จึงไม่ควรใช้คำว่าปรับความถี่แทนการปรับความสว่างทุกกรณี เพราะวงจรขับและโหลดจะตอบสนองตามลักษณะของมันด้วย

รูปคลื่น PWM เชิงแนวคิดที่มีสัดส่วน duty เท่ากันแต่คาบต่างกัน ไม่ใช่ภาพวัดจากเครื่องมือ

ถ้าเป็น LED ที่มีวงจรขับเฉพาะ ควรตรวจวิธี dimming และช่วงสัญญาณที่วงจรนั้นรับได้ก่อน การสร้าง PWM จากชิปได้ไม่ได้แปลว่าต่อกับ LED หรือแถบไฟชนิดใดก็ได้ตรงๆ เพราะหน้าที่จ่ายกระแสและข้อจำกัดทางไฟฟ้ายังเป็นงานของวงจรด้านโหลด

ความละเอียดต้องแบ่งอยู่ในเวลาหนึ่งคาบ

timer ใช้แหล่งนาฬิกาและตัวนับสร้างคาบ จึงมีข้อจำกัดว่าจะแบ่งหนึ่งคาบเป็นระดับได้ละเอียดเพียงใดเมื่อเลือกความถี่หนึ่งไว้ เราจึงไม่สามารถเพิ่มทั้งความถี่และจำนวนระดับอย่างอิสระได้ทุกค่า

ความละเอียดที่ระบุเป็นบิตช่วยบอกจำนวนระดับเชิงตัวเลข เช่น 8 บิตมี 256 ระดับ ส่วน 10 บิตมี 1,024 ระดับ แต่ช่วง duty ที่ API อนุญาตและพฤติกรรมปลายช่วงต้องดูตามชิปกับ driver ที่ใช้ ไม่ควรเดาจากจำนวนบิตอย่างเดียวแล้วข้ามการตรวจผลตั้งค่า

ใน LEDC การตั้งความถี่กับความละเอียดที่ทำไม่ได้อาจคืนข้อผิดพลาด เราจึงควรตรวจผลการเรียกและเก็บค่าที่ใช้สำเร็จไว้ ไม่ปล่อยให้โปรแกรมทำต่อแล้วใช้ความรู้สึกจากแสงเป็นเครื่องตัดสินว่าการตั้งค่ารอบนั้นถูกนำไปใช้แล้ว

ถ้าหลายช่องใช้ timer ร่วมกัน การแก้ timer ก็อาจมีผลกับช่องอื่นด้วย จึงควรจัดรายการว่าช่องใดผูกกับ timer ไหน และงานใดต้องเปลี่ยนความถี่จริง เพื่อไม่ให้การปรับหลอดหนึ่งไปเปลี่ยนพฤติกรรมอีกหลอดโดยไม่ได้ตั้งใจ

ตัวเลขบนจออาจถูกบีบเหลือไม่กี่ระดับ

ก่อนกล่าวถึงการรับรู้แสง ลองตามเส้นทางค่าจาก UI ก่อน ถ้าแถบเลื่อนมีเพียงร้อยกว่าตำแหน่ง ต่อให้ปลายทางรองรับระดับมากกว่านั้นมาก เราก็ยังมีจำนวนค่าตั้งต้นจำกัดอยู่ การเพิ่มบิตจึงอาจไม่สร้างความต่างถ้าไม่ได้เปลี่ยนการแปลงค่าฝั่งต้นทาง

ปัญหาอาจอยู่ที่ชนิดตัวแปรหรือการหารจำนวนเต็มด้วย เช่น คำนวณสัดส่วนโดยหารก่อนคูณจนข้อมูลส่วนเศษหายไป ค่าหลายตำแหน่งจึงกลายเป็น duty เดียวกันได้ ควรพิมพ์ค่าจาก UI ค่าหลังแปลง และค่าที่ส่งเข้า driver ไว้เทียบกันระหว่างตรวจ

เส้นทางค่าจากแถบเลื่อนผ่านการแปลงและปัดเศษไปยัง LEDC แล้วถึงโหลด ช่วยแยกจุดที่ความละเอียดหายไป

เมื่อเห็นเส้นทางนี้แล้ว เราจะรู้ว่าควรเพิ่มความละเอียดที่ส่วนใด ถ้าค่าถูกปัดตั้งแต่รับคำสั่ง การไปเพิ่มความละเอียดของ timer อย่างเดียวก็ยังแก้ไม่ถึงต้นเหตุ และถ้าค่าจากหลายแหล่งเข้ามาพร้อมกันก็ควรกำหนดว่าแหล่งใดเป็นเจ้าของค่าปัจจุบันให้ชัดด้วย

ระดับแสงที่มองเห็นไม่จำเป็นต้องเดินเท่าตัวเลข

แม้ duty จะเปลี่ยนเป็นขั้นสม่ำเสมอ ความรู้สึกสว่างที่คนเห็นอาจไม่ได้เปลี่ยนเป็นขั้นเท่ากัน ส่วนช่วงต่ำยังอาจมีข้อจำกัดของวงจรขับทำให้เกิดพฤติกรรมที่ต้องตรวจเฉพาะชุดอุปกรณ์

การใช้เส้นโค้งหรือ lookup table เพื่อแปลงค่าที่ผู้ใช้เลือกเป็น duty จึงเป็นอีกเรื่องหนึ่งหลังจากรู้ว่าการสร้างสัญญาณถูกต้องแล้ว วิธีแปลงควรถูกเลือกจากประสบการณ์ใช้งานที่ต้องการและตรวจบนโหลดจริง ไม่คัดตัวเลขจากหลอดคนละชนิดแล้วถือว่าให้ผลเหมือนกัน

ถ้าจะเปรียบเทียบหลายเส้นโค้ง ควรคงความถี่ วงจรขับ แหล่งจ่าย และสภาพแสงรอบตัวไว้ก่อน แล้วเก็บรายการค่าที่ทดสอบกับสิ่งที่สังเกตได้ แทนการเปลี่ยนหลายอย่างพร้อมกันจนตามไม่ได้ว่าปัจจัยใดช่วยให้ช่วงมืดปรับได้ละเอียดขึ้น

การถ่ายด้วยกล้องอาจทำให้เห็นลายหรือการกะพริบตามการตั้งค่ากล้องด้วย ภาพที่ได้จึงไม่ควรใช้ยืนยันพฤติกรรมทั้งหมดโดยไม่มีเงื่อนไขกำกับ หากต้องตรวจสัญญาณไฟฟ้าจริงก็ควรใช้เครื่องมือที่เหมาะกับสิ่งที่ต้องการวัด

เก็บการตั้งค่าที่ใช้จริงไว้กับเฟิร์มแวร์

เมื่อได้ชุดค่าที่เหมาะแล้ว ควรบันทึกรุ่นชิป framework ขา timer channel ความถี่ และความละเอียดไว้ด้วย เพราะตัวอย่างที่เรียก API ได้ในรุ่นหนึ่งอาจมีรายละเอียดต่างจากอีกรุ่น โดยเฉพาะตอนย้ายบอร์ดหรืออัปเดตไลบรารี

ส่วนเส้นโค้งปรับแสงก็ควรเป็นข้อมูลที่ระบุรุ่นได้ หากเปลี่ยนวิธีแปลงแล้วผู้ใช้รู้สึกว่าแถบเลื่อนเดิมให้แสงต่างไป เราจะได้ย้อนดูว่าพฤติกรรมเปลี่ยนจากตารางแปลงหรือจากการตั้ง timer และควรตรวจปลายช่วงกับการเปิดปิดโดยตรงให้ครบก่อนส่งงาน

การค่อยๆ เปลี่ยนค่าก็มีจังหวะของมัน

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

ส่วนการทำ fade อัตโนมัติควรแยกเวลาในการเปลี่ยนจากความละเอียดของ duty เพื่อให้ตรวจได้ว่าความไม่ต่อเนื่องมาจากจำนวนระดับหรือการอัปเดตเป็นช่วงๆ และต้องกำหนดด้วยว่าคำสั่งใหม่ระหว่าง fade จะหยุดหรือแทนค่ารอบเดิมอย่างไร

สรุป

เวลาปรับ PWM แล้วบางช่วงดูไม่ต่างกัน ให้แยกความถี่ ความละเอียด และเส้นทางแปลงค่าก่อน จากนั้นค่อยดูการตอบสนองของวงจรกับความรู้สึกสว่าง การตรวจค่าที่ driver รับจริงและเก็บเงื่อนไขของโหลดไว้ จะช่วยให้การปรับแสงมีเหตุผลตามได้ และไม่เพิ่มจำนวนบิตไปเรื่อยๆ โดยยังไม่รู้ว่าข้อมูลหายอยู่ตรงไหนครับ

Command Eng Logo
CMD yourNgineers
เลขประจำตัวผู้เสียภาษี0805564000814
บทความ
ติดต่อบริษัท คอมมานด์ เอ็นจ์ จำกัด
81/36 เพอร์เฟค พาร์คบางนาตำบลบางเสาธง อำเภอบางเสาธงจังหวัดสมุทรปราการ 10570
team@commandeng.in.th+66 89 393 5191
Facebook Page | Command EngLine | Command Eng Official
© Copyright 2022-2026 Command Eng Co., Ltd.v1.0.4 · 0d556ab · 2026-11-03 15:23