ARTICLE

ADC กับ PWM ต่างกันอย่างไร? อ่าน Analog และควบคุม Output ด้วย Microcontroller.

อธิบาย ADC และ PWM สำหรับ ESP32/Arduino แบบไม่สับสนว่าอะไรคือ Analog Input อะไรคือ Pulse Output พร้อมข้อจำกัดเรื่อง Resolution, Noise, Sampling และการกรองสัญญาณ

IoTElectricalMakerโดย Thospaakเผยแพร่ 10 ต.ค. 2569อัปเดต 10 ต.ค. 2569

ADC กับ PWM มักถูกพูดรวมในหัวข้อ “Analog” แต่จริง ๆ ทำหน้าที่คนละแบบ

  • ADC ใช้อ่านแรงดัน Analog แล้วแปลงเป็นค่าดิจิทัล
  • PWM สร้าง pulse ดิจิทัลที่มี duty cycle เปลี่ยนได้ เพื่อควบคุมค่าเฉลี่ยหรือส่ง control signal

ADC คืออะไร

ADC ย่อมาจาก Analog-to-Digital Converter

ตัวอย่าง Sensor ให้แรงดัน:

0.8 V
1.4 V
2.1 V

MCU ไม่ได้ “เข้าใจ Volt” โดยตรง ADC จะเปลี่ยนแรงดันนั้นเป็น code เช่น:

Analog voltage
    ↓
ADC
    ↓
Digital count

Firmware จึงค่อยแปลง count เป็นหน่วยจริงตาม calibration/model ของ Sensor

Resolution คืออะไร

ถ้า ADC มี resolution N bit จะมีจำนวน code โดยประมาณ:

2^N

ตัวอย่าง 12-bit มี 4096 code

แต่ resolution ไม่เท่ากับ accuracy

ระบบอาจมี 12-bit code แต่ error จริงยังมาจาก:

  • reference voltage;
  • non-linearity;
  • noise;
  • source impedance;
  • calibration;
  • temperature;
  • PCB/layout

ADC อ่านได้ถึงกี่ Volt

ขึ้นกับ MCU และ attenuation/input circuitry

ห้ามเอาแรงดันจาก Sensor หรือ battery เข้าขา ADC โดยตรงเพียงเพราะอยากวัดค่า

ถ้าแรงดันเกิน input range อาจต้องมี:

  • voltage divider;
  • buffer;
  • amplifier;
  • protection;
  • isolation

และต้องคำนวณ impedance/error ของ front-end ด้วย

Voltage Divider ใช้กับ ADC อย่างไร

แนวคิดพื้นฐาน:

Vin
 |
R1
 |
 +---- ADC
 |
R2
 |
GND

Divider ลดแรงดันให้อยู่ในช่วงที่ ADC รับได้

แต่ resistor สูงเกินไปอาจกระทบ sampling และ noise ขณะที่ต่ำเกินไปเพิ่ม current draw

จึงไม่ควรใช้สูตร divider อย่างเดียวโดยไม่ดู ADC input requirement

Sampling คืออะไร

ADC อ่านค่าเป็นช่วงเวลา

ถ้า Sensor เปลี่ยนเร็วแต่ sample ช้า อาจพลาด behavior

ถ้า sample เร็วเกินโดยไม่มี filtering อาจเก็บ noise มากโดยไม่เพิ่มข้อมูลที่มีประโยชน์

งานจริงต้องเลือกระหว่าง:

  • sampling rate;
  • averaging;
  • low-pass filtering;
  • response time

ทำไมค่า ADC กระโดด

สาเหตุอาจเป็น:

  • power supply noise;
  • ground noise;
  • Wi-Fi/RF activity;
  • long wire;
  • sensor source impedance;
  • inductive load switching;
  • bad reference/layout

การแก้ด้วย average 100 samples อย่างเดียวอาจซ่อนปัญหาแต่ไม่แก้สาเหตุ

อ่านต่อ: Power Supply, Ground และ Noise ในระบบ Embedded

PWM คืออะไร

PWM ย่อมาจาก Pulse Width Modulation

สัญญาณยังเป็น HIGH/LOW แต่เปลี่ยนสัดส่วนเวลาที่ HIGH

ตัวอย่าง duty cycle:

25%  █░░░
50%  ██░░
75%  ███░

ถ้าความถี่เหมาะกับ load ระบบอาจเห็นผลเฉลี่ยต่างกัน

PWM ใช้ทำอะไร

ตัวอย่าง:

  • หรี่ LED;
  • ควบคุม Motor driver;
  • ควบคุม Fan บางชนิด;
  • Servo/control signal บาง protocol;
  • สร้างสัญญาณที่ผ่าน filter แล้วได้ค่าเฉลี่ย

แต่ PWM ไม่ได้แปลว่า MCU สร้างแรงดัน Analog ต่อเนื่องโดยตรง

PWM = Analog Output ไหม

ไม่ใช่ในความหมายเดียวกับ DAC

PWM คือ pulse digital

ถ้าต้องการแรงดัน Analog ที่เรียบ อาจใช้:

  • RC filter;
  • op-amp buffer;
  • external DAC;
  • MCU ที่มี DAC จริง

ขึ้นกับ accuracy, bandwidth และ load

ADC กับ PWM ต่างกันแบบสั้นที่สุด

ประเด็น ADC PWM
ทิศทางหลัก Input Output
สิ่งที่ทำ แปลง Analog → Digital สร้าง pulse duty cycle
ใช้กับ Sensor/measurement Driver/control
ประเด็นสำคัญ range, accuracy, noise frequency, duty, load/interface

ตัวอย่าง Smart Farm

Soil sensor analog
   ↓ ADC
ESP32
   ↓ decision
PWM / Digital command
   ↓ driver
Pump / valve interface

แต่ Sensor และ Pump ไม่ควรถูกต่อข้าม driver/protection layer

ตัวอย่าง Energy Monitoring

Current/voltage sensing front-end อาจสร้าง analog signal ให้ ADC อ่าน

การวัดพลังงานจริงต้องดูเพิ่มเติม:

  • waveform sampling;
  • calibration;
  • phase;
  • isolation;
  • safety category

งาน mains measurement ไม่ควรสร้างจาก divider/breadboard แบบทดลองแล้วถือว่าเป็น energy meter ที่ปลอดภัย

ESP32 ADC เหมือนกันทุกรุ่นไหม

ไม่เหมือนกัน

ESP32 family หลาย series มี ADC architecture/capability ต่างกัน ต้องดู datasheet และ technical reference ของ variant นั้น

หลีกเลี่ยงบทสรุปแบบ “ESP32 ADC = 0–4095 = 0–3.3 V เสมอ” เพราะ calibration/range/attenuation ไม่ได้ง่ายแบบนั้นทุกกรณี

สรุป

ADC คือทางรับข้อมูล Analog เข้า MCU ส่วน PWM คือวิธีส่ง pulse ออกเพื่อควบคุมระบบ

การใช้งานที่เชื่อถือได้ต้องเข้าใจ range, reference, noise, sampling, frequency และ driver interface ไม่ใช่เพียงเรียก function ใน library ให้ได้