ADC กับ PWM ต่างกันอย่างไร? อ่าน Analog และควบคุม Output ด้วย Microcontroller.
อธิบาย ADC และ PWM สำหรับ ESP32/Arduino แบบไม่สับสนว่าอะไรคือ Analog Input อะไรคือ Pulse Output พร้อมข้อจำกัดเรื่อง Resolution, Noise, Sampling และการกรองสัญญาณ
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 ให้ได้

