การใช้งานขาสัญญาณ Analog ของ Arduino (PWM)

ขาอนาล็อกใน Arduino: สัญญาณ พารามิเตอร์ และตัวอย่างใช้งาน

การใช้งานขา “สัญญาณอะนาล็อก” ใน Arduino (PWM) เป็นสัญญาณออก

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

พื้นฐานเกี่ยวกับขาอนาล็อกบนไมโครคอนโทรลเลอร์ตระกูล Arduino พารามิเตอร์สำคัญที่ต้องกำหนด

1) อนาล็อกอินพุต (ADC) คืออะไร

บอร์ด Arduino UNO ใช้ไมโครคอนโทรลเลอร์ ATmega328P ที่มีตัวแปลงสัญญาณอนาล็อกเป็นดิจิทัล (ADC) ความละเอียด 10 บิต ทำให้ค่าที่อ่านได้จาก analogRead() อยู่ในช่วง 0 – 1023 

ซึ่งสอดคล้องกับแรงดันอินพุตตั้งแต่ 0V ถึงแรงดันอ้างอิง (VREF) ของบอร์ด (โดยทั่วไปคือแรงดันทำงาน 5V บน UNO รุ่นคลาสสิก)

สูตรคำนวณแรงดันจากค่าอ่าน: V = reading * Vref / 1023.0

พินที่ใช้ได้

A0–A5 คือขาอนาล็อกอินพุตบน UNO และยังใช้งานเป็นดิจิทัล D14–D19 ได้เมื่อจำเป็น

แรงดันอ้างอิง (Analog Reference)

  • DEFAULT = Vcc ของบอร์ด (เช่น ~5V)
  • INTERNAL ≈ 1.1V (บน AVR บางรุ่น)
  • EXTERNAL ใช้แรงดันภายนอกที่ขา AREF (อย่าลืมตั้ง analogReference(EXTERNAL) ก่อนอ่านค่า)

ความเร็ว/อัตราสุ่ม

การแปลงหนึ่งครั้งใช้เวลาประมาณ 13 คล็อกของ ADC; ค่าปริยายทำให้ได้ราว ๆ 9–10 kSPS บน CPU 16MHz

อิมพีแดนซ์ของแหล่งสัญญาณ

แนะนำให้แหล่งสัญญาณมีอิมพีแดนซ์ ≤ 10 kΩ เพื่อให้ตัวเก็บตัวอย่างของ ADC ชาร์จได้เต็มในเวลาที่กำหนด

ตัวอย่างโค้ด: อ่านแรงดันที่ A0

// อ่านแรงดันอนาล็อกที่ A0 และพิมพ์เป็นโวลต์
const int pinAnalog = A0;
const float Vref = 5.0;         // หากใช้ analogReference(DEFAULT) บน UNO

void setup() {
  Serial.begin(9600);
  analogReference(DEFAULT);     // INTERNAL หรือ EXTERNAL ก็ได้ตามการใช้งาน
}

void loop() {
  int raw = analogRead(pinAnalog);           // 0..1023
  float voltage = raw * Vref / 1023.0;       // โวลต์ประมาณค่า
  Serial.print("ADC="); Serial.print(raw);
  Serial.print("  V="); Serial.println(voltage, 3);
  delay(200);
}

2) “อนาล็อกเอาต์พุต” ของ Arduino: PWM

Arduino UNO ไม่มี DAC จริง ๆ เอาต์พุตอนาล็อกจึงสร้างด้วยเทคนิค PWM (Pulse-Width Modulation) คือการสลับสัญญาณดิจิทัล ON/OFF ที่ความถี่คงที่ แล้วปรับ “สัดส่วนเวลาที่เป็น ON” (duty cycle) ให้ได้ค่าเฉลี่ยเทียบเท่าแรงดันอนาล็อก

ลักษณะสัญาณ PWM แสดงองค์ประกอบ

ขา PWM บน UNO

3, 5, 6, 9, 10, 11 (มีสัญลักษณ์ ~ บนบอร์ด)

ความถี่ PWM โดยปริยาย

  • ประมาณ 490 Hz: ขา 3, 9, 10, 11
  • ประมาณ 980 Hz: ขา 5, 6

ช่วงค่า

analogWrite(pin, value) โดย value = 0..255 (8 บิต) → 0%..100% duty cycle

แรงดันเฉลี่ยที่โหลดเห็น

Vavg ≈ duty × Vcc (เช่น duty 60% บน 5V → ~3V เฉลี่ย)

ตัวอย่างโค้ด: หรี่ไฟ LED ด้วย PWM

// ค่อยๆ เพิ่ม/ลดความสว่าง LED ที่ขา 9 (PWM)
const int ledPWM = 9;

void setup() {
  pinMode(ledPWM, OUTPUT);
}

void loop() {
  for (int v = 0; v <= 255; v++) {  // fade in
    analogWrite(ledPWM, v);
    delay(8);
  }
  for (int v = 255; v >= 0; v--) {  // fade out
    analogWrite(ledPWM, v);
    delay(8);
  }
}

3) เคล็ดลับการใช้งานให้แม่นยำ

  • ต้องกำหนด analogReference() ให้ตรงกับการต่อวงจรจริง (DEFAULT/INTERNAL/EXTERNAL)
  • ถ้าใช้ AREF ภายนอก ให้ตั้ง EXTERNAL ก่อนเรียก analogRead() และอย่าป้อนไฟเกินสเปก
  • หากแหล่งสัญญาณมีอิมพีแดนซ์สูง ควรใช้บัฟเฟอร์ (op-amp โหมดตามค่า) หรือใส่ตัวเก็บลัดริปเปิลตามคู่มือ
  • จำไว้ว่าค่า PWM = “ค่าเฉลี่ยเชิงเวลา” ถ้าต้องการแรงดัน DC เนียน ๆ ให้ผ่านตัวกรอง RC หรือใช้ DAC ภายนอก


แผงพิน Arduino Uno (มีระบุ A0–A5 และขา ~PWM เพื่อความสะดวกในการต่อใช้งาน)

1. พื้นฐานของ analogWrite() และ PWM 

• Arduino ไม่มี DAC (Digital-to-Analog Converter) ของจริง แต่ใช้ PWM คือการเปิด–ปิดสัญญาณดิจิทัลอย่างรวดเร็วเพื่อสร้างค่าเฉลี่ยที่เหมือนแรงดันอะนาล็อก 
• ฟังก์ชัน:  analogWrite(pin, value) 
• pin: ขาที่รองรับ PWM (มีเครื่องหมาย ~ เช่น 3, 5, 6, 9, 10, 11 บน UNO) 
• value: ค่าจาก 0 ถึง 255 — 0 เท่ากับ OFF (0%), 255 เท่ากับ ON ตลอด (100%)

2. รูปแบบสัญญาณ PWM
• Duty Cycle = (เวลาสตาร์ท = ON) / (เวลารวมรอบเล็ก) 
• ยกตัวอย่าง: ถ้า period = 2 ms และ ON = 1.2 ms → duty cycle = 60%
• ค่าเฉลี่ยแรงดัน = 5 V × duty cycle → เช่น 60% ≈ 3 V 
• Frequency: บน Arduino UNO ขาพื้นฐาน (3,6,9,10) อยู่ที่ราว 490 Hz และขา 5,6 ที่ประมาณ 980 Hz 

3. พารามิเตอร์ที่ต้องกำหนดในโค้ด 
• ต้องใช้ขาที่สนับสนุน PWM (~) และเซ็ตเป็น output ด้วย pinMode() ก่อนใช้งาน analogWrite()
• analogWrite() จะสร้างสัญญาณ PWM ด้วย duty cycle ตาม value และทำสัญญาณคงอยู่จนกว่าจะเปลี่ยนผ่านคำสั่งอีกครั้ง

4. การประยุกต์ใช้งาน 
• ควบคุมความสว่าง LED, ความเร็วมอเตอร์, หรือระดับเสียงเบส 
• หากต้องการแรงดันเฉลี่ยระหว่าง 0–5 V: averageVoltage = (value / 255) × 5V 
• การเพิ่ม–ลด v สุทธิแต่ละรอบ ทำให้ LED ค่อยๆ สว่างและหรี่ลงตามค่า PWM จริง ๆ โดยค่าเฉลี่ยแรงดันเปลี่ยนไล่ขึ้น/ลงพร้อมกัน 

สรุปสาระสำคัญ รายละเอียด ความหมายของ PWM การสลับ ON/OFF อย่างรวดเร็วเพื่อสร้างแรงดันเฉลี่ย analogWrite() ใช้กับขา PWM สร้างสัญญาณ PWM ตามค่าจาก 0–255 Duty Cycle & Frequency กำหนดปริมาณ ON และความถี่สัญญาณ PWM การใช้งานจริง ควบคุม LED, มอเตอร์, เสียง เป็นต้น



โพสต์ยอดนิยมจากบล็อกนี้

เฟต(FET)

คลาสต่างๆของวงจรขยายเสียง

การเปลี่ยนฐานของระบบเลข