กลับไปหน้ารวมไฟล์
read-duty-cycle-of-a-pwm-signal-using-visuino-arduino-81fdc0.md

โปรเจคนี้คือ โครงสร้างพื้นฐานสำหรับการวินิจฉัยสัญญาณความแม่นยำสูง ตัวจริงเสียงจริงเลยนะน้อง! ด้วยการใช้ 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: อุปกรณ์ที่ต้องเตรียม

โครงสร้างพื้นฐานฮาร์ดแวร์และระดับการวินิจฉัย

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

ขั้นตอนที่ 2: วงจร

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

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

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

ขั้นตอนที่ 4: ใน Visuino ให้เพิ่มและตั้งค่าอุปกรณ์ (Components)

ตรรกะทางเทคโนโลยีและการคำนวณแบบไดนามิก

ระบบนี้ได้ความแม่นยำระดับแล็บมาได้ด้วย กลยุทธ์การแปลงข้อมูล หลายอย่าง แทนที่จะมานั่งเขียนโค้ด C++ เป็นร้อยบรรทัด โปรเจคนี้ใช้ "คอมโพเนนต์" แบบเห็นภาพใน Visuino Logic Mesh เอา ง่ายดี งานไม่หนัก!

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

ตั้งค่าคอมโพเนนต์ทางคณิตศาสตร์:

  1. เลือก "DivideByValue1" และในหน้าต่าง Properties ให้เลือกที่ "Value" แล้วคลิกที่ไอคอนพิน (Pin Icon) และเลือก "Float SinkPin"
  2. เลือก "MultiplyByValue1" และในหน้าต่าง Properties ให้ตั้งค่า "Value" เป็น 100

ขั้นตอนที่ 5: ใน Visuino ให้เชื่อมต่อคอมโพเนนต์

การต่อสายวงจรนี้ใช้กลยุทธ์ Real-Time Math Pipeline และ Inverse Pulse-Metering ตามนี้เลยน้อง:

  1. ต่อขา Digital pin [2] ของ Arduino เข้ากับขา [In] ของ "MultiSource1"
  2. ต่อขา [0] ของ "MultiSource1" ไปที่ขา [In] ของ "PulseMeter1" (สำหรับวัดช่วงเวลา HIGH)
  3. ต่อขา [1] ของ "MultiSource1" ไปที่ขา [In] ของ "Inverter1"
  4. ต่อขา [Out] ของ "Inverter1" ไปที่ขา [In] ของ "PulseMeter2" (สำหรับวัดช่วงเวลา LOW)
  5. ต่อขา [Out] ของ "PulseMeter1" ไปที่ขา [In] ของ "UnsignedToAnalog1"
  6. ต่อขา [Out] ของ "PulseMeter2" ไปที่ขา [In] ของ "UnsignedToAnalog2"
  7. ต่อขา [Out] ของ "UnsignedToAnalog1" ไปที่ขา [In] ของ "MultiSource2"
  8. ต่อขา [0] ของ "MultiSource2" ไปที่ขา [0] ของ "Add1"
  9. ต่อขา [1] ของ "MultiSource2" ไปที่ขา [In] ของ "DivideByValue1"
  10. ต่อขา [Out] ของ "UnsignedToAnalog2" ไปที่ขา [1] ของ "Add1"
  11. ต่อขา [Out] ของ "Add1" ไปที่ขา [Value] ของ "DivideByValue1" (นี่คือการส่ง TotalDuration ไปเป็นตัวหาร)
  12. ต่อขา [Out] ของ "DivideByValue1" ไปที่ขา [In] ของ "MultiplyByValue1"
  13. ต่อขา [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 ได้เลย

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Visuino - Graphical Development Environment for Arduino"
author: "frtek"
category: "Lab Stuff"
components:
  - "1x PWM"
  - "1x Arduino UNO R3 - Made in italy"
  - "1x 10 jumper wires 150mm male"
description: "In this tutorial we are going to read the Duty Cycle of a PWM signal using Visuino. For a PWM source we are going to use a PWM generator connected to the Arduino interrupt digital pin [2],\n\nWe are going to measure the pulse width of the HIGH and LOW then use this formula\n\nTotalDuration = highDuration + lowDuration;\n\nDutyCycle = 100.0 * highDuration / totalDuration\n\nto get the Duty Cycle in percentage.\n\nWatch the video!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19J6bAZrF4QrflqY8kubrhOYENUNunJjoVa8ftW/6rqjMhd9wyavWLwrE6bJrpxSR3ASNS1OKEnNk+QyMkGq6ZAZLMbxPucvmD1fJXrxXHCoBPVLxq2UaM5oZUGn55jQa1Cczbnwgsm8w=="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/read-duty-cycle-of-a-pwm-signal-using-visuino-arduino-81fdc0_cover.jpg"
lang: "en"
likes: 0
passwordHash: "c8f8ad446d91f8c8fc10a8f3eb4f50667787d9997f3c17c164bfb8a3734994de"
price: 1499
seoDescription: "Learn how to read PWM signal Duty Cycle using Visuino and Arduino with step-by-step formulas and pulse width measurement."
tags:
  - "Environmental Sensing"
  - "Clocks"
title: "วัด Duty Cycle สัญญาณ PWM แบบตึงๆ ด้วย Visuino + Arduino"
tools: []
videoLinks:
  - "https://youtu.be/jpNemaUFeBA"
views: 1442