โปรเจคนี้คือ โครงสร้างพื้นฐานสำหรับการวินิจฉัยสัญญาณความแม่นยำสูง ตัวจริงเสียงจริงเลยนะน้อง! ด้วยการใช้ Visuino Graphical Environment เราจะได้เลี่ยงโค้ดจัดการอินเตอร์รัปต์ที่โคตรจะซับซ้อน แล้วมาสร้าง Digital PWM Analyzer ที่แม่นยำระดับเทพแทน ระบบนี้จะวัดความสัมพันธ์ทางเวลาระหว่างสถานะ "เปิด" กับ "ปิด" ของสัญญาณได้อย่างแม่นยำ ให้ความถูกต้องถึง 0.1% ในการคำนวณ Duty Cycle ซึ่งเป็นตัวชี้วัดสำคัญสำหรับการควบคุมมอเตอร์ หรี่ไฟ LED และการทดสอบแหล่งจ่ายไฟเลยทีเดียว
ภาพรวมการวิเคราะห์สัญญาณและสถาปัตยกรรมพัลส์
เจ้า PWM Duty Cycle Monitor ตัวนี้ทำงานผ่านวงจรชีวิตแบบ Temporal-Differential-to-Percentage ที่ออกแบบมาเฉพาะเลย ระบบใช้ Pulse Meters สองตัวที่ทำงานขนานกันอิสระ โดยแยกสัญญาณอินพุตเดี่ยว (จาก Arduino พิน 2) เพื่อวัดระยะเวลาของพัลส์ "HIGH" และผ่านทางอินเวอร์เตอร์ฮาร์ดแวร์/ซอฟต์แวร์เพื่อวัดพัลส์ "LOW" สูตรสถาปัตยกรรมหลักคือ:
TotalDuration = HighDuration + LowDuration
DutyCycle% = (HighDuration / TotalDuration) * 100
ข้อมูลนี้จะถูกคำนวณแบบเรียลไทม์บน Arduino Uno แล้วส่งสตรีมไปยังเทอร์มินัลซีเรียลความเร็วสูงเพื่อแสดงผล
ขั้นตอนที่ 1: อุปกรณ์ที่ต้องเตรียม




โครงสร้างพื้นฐานฮาร์ดแวร์และระดับการวินิจฉัย
- Arduino UNO หรือ Arduino Mega (หรือบอร์ดอื่นๆ): ตัว "เครื่องยนต์รับสัญญาณดิจิทัล" ใช้ไทเมอร์ภายในที่แม่นยำ (Timer1/Timer2) เพื่อจับเวลาขอบสัญญาณขาขึ้นและขาลงของสัญญาณ PWM ที่เข้ามาผ่านดิจิทัลพินที่รองรับอินเตอร์รัปต์ (พิน 2)
- แหล่งกำเนิดสัญญาณ PWM อย่าง XY-LPWM: ตัว "แหล่งอ้างอิง" โมดูลนี้ให้คลื่น PWM ที่ปรับค่าได้และเสถียร จาก 1Hz ถึง 150kHz ช่วยให้เราสามารถตรวจสอบความแม่นยำของ Arduino ได้หลายย่านความถี่
- โปรแกรม Visuino: สภาพแวดล้อมการเขียนโปรแกรมแบบภาพที่ใช้โฮสต์เมชลอจิกทั้งหมด
- สายจัมเปอร์
ขั้นตอนที่ 2: วงจร

- ต่อ Arduino พิน [5V] ไปที่ PWM Module พิน [VIN+]
- ต่อ Arduino พิน [GND] ไปที่ PWM Module พิน [VIN-]
- ต่อ PWM Module พิน [PWM] ไปที่ Arduino ดิจิทัลพิน [2]
- ต่อ PWM Module พิน [GND] ไปที่ Arduino พิน [GND]

ขั้นตอนที่ 3: เปิด Visuino และเลือกบอร์ดประเภท Arduino UNO


เปิด Visuino ตามที่เห็นในภาพแรก คลิกที่ปุ่ม "Tools" บนคอมโพเนนต์ Arduino (ภาพที่ 1) ใน Visuino เมื่อไดอะล็อกปรากฏขึ้น ให้เลือก "Arduino UNO" ตามที่แสดงในภาพที่ 2
ขั้นตอนที่ 4: ใน Visuino ให้เพิ่มและตั้งค่าอุปกรณ์ (Components)










ตรรกะทางเทคโนโลยีและการคำนวณแบบไดนามิก
ระบบนี้ได้ความแม่นยำระดับแล็บมาได้ด้วย กลยุทธ์การแปลงข้อมูล หลายอย่าง แทนที่จะมานั่งเขียนโค้ด C++ เป็นร้อยบรรทัด โปรเจคนี้ใช้ "คอมโพเนนต์" แบบเห็นภาพใน Visuino Logic Mesh เอา ง่ายดี งานไม่หนัก!
- เพิ่มคอมโพเนนต์ "Digital Multi Source": ใช้คูณสัญญาณอินพุทเพื่อประมวลผลแบบขนาน (Parallel Processing) ไว้แบ่งงาน
- เพิ่มคอมโพเนนต์ "Digital (Boolean) Inverter (Not)": ใช้พลิกตรรกะ (Flip Logic) สำหรับการวัดความกว้างพัลส์ "LOW" ตัวนี้ห้ามช็อตนะ!
- เพิ่มคอมโพเนนต์ "Pulse Meter(Measure Period)" จำนวน 2 ตัว: สองตัวนี้จะทำงานคู่ขนานกันเพื่อวัดความกว้างของพัลส์ "HIGH" และ "LOW" แยกกัน
- เพิ่มคอมโพเนนต์ "Unsigned To Analog": ใช้แปลงค่าความกว้างพัลส์ดิบ (หน่วยไมโครวินาที) ให้เป็นเลขทศนิยม 32 บิต ป้องกันปัญหา "Integer Overflow" เวลาเจอสัญญาณคาบยาวๆ
- เพิ่มคอมโพเนนต์ "Analog Multi Source"
- เพิ่มคอมโพเนนต์ "Add Analog"
- เพิ่มคอมโพเนนต์ "Divide Analog By Value": ทำหน้าที่เหมือนท่อส่งข้อมูลทางคณิตศาสตร์ในฮาร์ดแวร์ สำหรับการหาร ซึ่งเป็นแกนหลักของสูตร
- เพิ่มคอมโพเนนต์ "Multiply Analog By Value": ใช้คูณผลลัพธ์ด้วย 100 เพื่อให้ได้ค่าเปอร์เซ็นต์
ตั้งค่าคอมโพเนนต์ทางคณิตศาสตร์:
- เลือก "DivideByValue1" และในหน้าต่าง Properties ให้เลือกที่ "Value" แล้วคลิกที่ไอคอนพิน (Pin Icon) และเลือก "Float SinkPin"
- เลือก "MultiplyByValue1" และในหน้าต่าง Properties ให้ตั้งค่า "Value" เป็น 100
ขั้นตอนที่ 5: ใน Visuino ให้เชื่อมต่อคอมโพเนนต์



การต่อสายวงจรนี้ใช้กลยุทธ์ Real-Time Math Pipeline และ Inverse Pulse-Metering ตามนี้เลยน้อง:
- ต่อขา Digital pin [2] ของ Arduino เข้ากับขา [In] ของ "MultiSource1"
- ต่อขา [0] ของ "MultiSource1" ไปที่ขา [In] ของ "PulseMeter1" (สำหรับวัดช่วงเวลา HIGH)
- ต่อขา [1] ของ "MultiSource1" ไปที่ขา [In] ของ "Inverter1"
- ต่อขา [Out] ของ "Inverter1" ไปที่ขา [In] ของ "PulseMeter2" (สำหรับวัดช่วงเวลา LOW)
- ต่อขา [Out] ของ "PulseMeter1" ไปที่ขา [In] ของ "UnsignedToAnalog1"
- ต่อขา [Out] ของ "PulseMeter2" ไปที่ขา [In] ของ "UnsignedToAnalog2"
- ต่อขา [Out] ของ "UnsignedToAnalog1" ไปที่ขา [In] ของ "MultiSource2"
- ต่อขา [0] ของ "MultiSource2" ไปที่ขา [0] ของ "Add1"
- ต่อขา [1] ของ "MultiSource2" ไปที่ขา [In] ของ "DivideByValue1"
- ต่อขา [Out] ของ "UnsignedToAnalog2" ไปที่ขา [1] ของ "Add1"
- ต่อขา [Out] ของ "Add1" ไปที่ขา [Value] ของ "DivideByValue1" (นี่คือการส่ง TotalDuration ไปเป็นตัวหาร)
- ต่อขา [Out] ของ "DivideByValue1" ไปที่ขา [In] ของ "MultiplyByValue1"
- ต่อขา [Out] ของ "MultiplyByValue1" ไปที่ขา [In] ของ Arduino Serial (เจ้า Serial Status Handshake นี้แหละที่จะส่งค่าอ่านดิจิทัลสดๆ ให้เรา)
ขั้นตอนที่ 6: สูตรคำนวณ Duty Cycle ฉบับเข้าใจง่าย
เราจะไปวัดความกว้างพัลส์ของสัญญาณ HIGH กับ LOW แล้วเอามาคำนวณด้วยสูตรนี้

TotalDuration = highDuration + lowDuration;
DutyCycle = 100.0 * highDuration / totalDuration
เพื่อให้ได้ค่า Duty Cycle เป็นเปอร์เซ็นต์
ในแผนผังวงจรจะเห็นว่าเราแยกพัลส์ดิจิทัลด้วย "MultiSource1" สัญญาณแรกเราส่งตรงไปที่ "PulseMeter1" เพื่อหาคาบเวลาตอนเป็น HIGH ส่วนสัญญาณที่สองเราดันมันกลับหัวด้วย "Inverter1" แล้วส่งไปที่ "PulseMeter2" เพื่อหาคาบเวลาตอนเป็น LOW จากนั้นเราแปลงคาบเวลาทั้งสองเป็นค่าแอนะล็อกแล้วเอามารวมกันด้วย "Add1" เพื่อหาความยาวรวมทั้งหมด ต่อด้วย "DivideByValue1" เพื่อหารคาบเวลา HIGH ด้วยผลรวมของทั้งสองคาบ และสุดท้ายคูณทั้งหมดด้วย 100 โดยใช้ "MultiplyByValue1" เรียบร้อย!
ขั้นตอนที่ 7: Generate, Compile และ Upload โค้ดลง Arduino

ใน Visuino ให้คลิกที่แท็บ "Build" ด้านล่าง ตรวจสอบให้แน่ใจว่าเลือกพอร์ตถูกต้อง แล้วคลิกปุ่ม "Compile/Build and Upload" ได้เลย
ขั้นตอนที่ 8: ถึงเวลาเล่นของ!

เมื่อจ่ายไฟให้ Arduino แล้วคลิก Connect ในแท็บ "Serial" น้องจะเห็นค่า Duty Cycle ของสัญญาณ PWM ขาเข้า แสดงผลแบบเรียลไทม์ อัพเดทภายใน 1-2 มิลลิวินาทีหลังจากสัญญาณเปลี่ยน ห้ามช็อตนะตัวนี้!
ทำไมโปรเจคนี้ถึงสำคัญนักหนา
การเชี่ยวชาญเรื่อง การวิเคราะห์สัญญาณแบบโมดูลาร์และการพัฒนาแบบ Low-Code เป็นทักษะขั้นเทพที่ ช่างระบบอัตโนมัติในอุตสาหกรรมและนักออกแบบวงจร ต้องมีติดตัวไว้! มันสอนให้น้องรู้วิธีสร้างต้นแบบเครื่องมือวินิจฉัยที่ซับซ้อนได้เร็วปรื๋อ โดยไม่ต้องมัวไปติดกับดักเรื่องการจัดการหน่วยความจำระดับต่ำ (Low-Level Memory Management) อีกต่อไป
อย่าคิดว่าแค่อ่านค่า PWM ได้ก็จบ! หลักการเดียวกันนี้ ถูกเอาไปใช้ในงานระดับโปรอย่าง การปรับแต่ง ECU ในรถยนต์, การตรวจสอบประสิทธิภาพอินเวอร์เตอร์โซลาร์เซลล์, และ การตรวจจับสัญญาณชีวภาพทางการแพทย์ เลยนะ
การสร้างโปรเจคนี้สำเร็จ แปลว่าน้องสามารถจัดการกับสตรีมข้อมูลความถี่สูง (High-Frequency Data Streams) และส่งมอบผลงานระดับมืออาชีพ สไตล์วิศวกรตัวจริง โดยใช้สแต็กการเขียนโปรแกรมแบบ Visual Programming สมัยใหม่ได้แล้ว! จัดไปวัยรุ่น!
ยินดีด้วยน้อง! น้องก็ทำโปรเจคนี้กับ Visuino สำเร็จแล้ว แนบไฟล์โปรเจค Visuino ที่พี่สร้างไว้สำหรับบทสอนนี้ให้น้องด้วย น้องสามารถดาวน์โหลดไปเปิดใน Visuino ได้เลย