ในการใช้งาน ADC ปกติแล้วจำเป็นจะต้องใช้ความละเอียดในการวัดค่าสัญญาณที่รับเข้ามา โดยเฉพาะบางงานที่ต้องการ วัดค่าที่ความละเอียดสูงมาก จำนวน bit ที่ใช้งานในการวัดค่า ADC มีส่วนสำคัญเพื่อแบ่งแรงดันที่เข้ามาเพื่อแสดงผลเป็นค่าความละเอียด เรามาดูการทำงาน และ ความหมายของ ค่าความละเอียด แบบ bit กัน
✨ ความละเอียด 10-bit ของ ADC คืออะไร?
- “10-bit” หมายถึงว่า ค่า Digital Output มี 2^10 = 1024 ระดับ
 - ค่าที่ได้จะอยู่ในช่วง 0 ถึง 1023 (ไม่ใช่ 1024 เพราะเริ่มนับจาก 0)
 
สูตรคำนวณ
Digital Output = (Vin / Vref) × 1023
- Vin = แรงดันที่ต้องการวัด (โวลต์)
 - Vref = แรงดันอ้างอิง ADC (โดยปกติคือ VDD เช่น 3.3V หรือ 5V)
 
ตัวอย่าง:
| Vin (โวลต์) | ถ้า Vref = 3.3V | Output (10-bit) | 
|---|---|---|
| 0V | (0/3.3)×1023 ≈ 0 | 0 | 
| 1.65V | (1.65/3.3)×1023 ≈ 511 | 511 | 
| 3.3V | (3.3/3.3)×1023 = 1023 | 1023 | 
🔥 วิธีใช้งานให้ได้ประสิทธิภาพสูงสุด
- รู้ค่า Vref ให้แม่นยำ
- ถ้าใช้ VDD เป็น Vref และ VDD ไม่นิ่ง → ค่า ADC ผันผวน
 - ทางที่ดีใช้ LDO regulator คุม VDD ให้นิ่ง (3.3V หรือ 5V)
 
 - ตั้งค่า ADC_SampleTime ให้เหมาะสม
- บน CH32V003: ใช้ 
ADC_SampleTime_xxCyclesเพื่อหน่วงเวลาการ sample นานพอ - ถ้าตั้งค่าสั้นไป: ค่าที่อ่านได้จะ noise เยอะ
 
 - บน CH32V003: ใช้ 
 - กรองสัญญาณ Analog ก่อนเข้า ADC
- ใช้ Low-Pass Filter (RC filter) หน้าขา ADC เพื่อกรอง noise high frequency
 - เช่น ใส่ R=1kΩ, C=100nF
 
 - อ่านค่า ADC หลายครั้งแล้วทำเฉลี่ย (Averaging)
- ช่วยลด noise และ jitter
 - เช่น อ่าน 8 ครั้ง เอาผลรวมแล้วหาร 8
 
 - รู้ความสัมพันธ์ 1 Step มีค่าเท่าไหร่
- สมการ: 
Step Voltage = Vref / 1023 - เช่น ถ้า Vref = 3.3V → 1 step ≈ 0.0032258V (ประมาณ 3.22mV/step)
 
 - สมการ: 
 
📌 ข้อจำกัดสำคัญของ ADC 10-bit บน CH32V003
| หมวด | รายละเอียด | ผลกระทบ | 
|---|---|---|
| ความละเอียด | 1024 steps | ละเอียดน้อยกว่าพวก 12-bit/16-bit | 
| ความเร็ว | Max ADC Clock ≈ 24MHz | ต้องตั้ง sample time ให้เหมาะ ไม่งั้นค่าผิดเพี้ยน | 
| Vref ผันผวน | ใช้ VDD เป็น Vref โดยตรง | ต้องทำให้ VDD เสถียร | 
| ความผิดพลาด (Error) | Offset, Gain error ประมาณ ±2LSB (ตาม datasheet) | มีเบี้ยวในบางช่วงค่าที่อ่านได้ | 
| การคาบเกี่ยว Noise | ไม่มี PGA (Programmable Gain Amplifier) ในตัว | ต้องจัดวงจรข้างนอกให้ดี | 
🎯 ตัวอย่างการคำนวณแบบจริงจัง
สมมติ:
- VDD = 3.3V (Vref = 3.3V)
 - ต้องวัดค่าแรงดัน Vin = 1.2V
 
คำนวณ ADC Output:
ADC_Value = (Vin / Vref) × 1023
           = (1.2 / 3.3) × 1023
           ≈ 372
ดังนั้นเมื่ออ่านค่า ADC ได้ประมาณ 372 แล้วเราค่อยนำไปคำนวณแรงดันย้อนกลับได้ด้วย:
Vin = (ADC_Value × Vref) / 1023
    ≈ (372 × 3.3) / 1023
    ≈ 1.2V
🚀 สรุปเข้าใจง่าย
- ADC 10-bit แบ่งแรงดัน Vref ออกเป็น 1024 ส่วนเท่า ๆ กัน
 - แต่ละ step มีค่าประมาณ 3.2mV (ถ้า Vref=3.3V)
 - เหมาะกับการวัดแรงดันแบบทั่ว ๆ ไป เช่น sensor, battery, potentiometer
 - ถ้า precision ต้องการสูงมาก (>10-bit) → ต้องหาทางเสถียรวงจร และอาจต้องเฉลี่ยหลายรอบ
 
✍️ เสริมให้อีกนิด: วิธีแปลง ADC อ่านเป็นโวลต์ด้วยโค้ด
float ADC_ReadVoltage(uint16_t adc_value, float vref)
{
    return ((float)adc_value * vref) / 1023.0f;
}
ตัวอย่างใช้
uint16_t adc_value = ADC1_Read();
float voltage = ADC_ReadVoltage(adc_value, 3.3f);
printf("Voltage = %.3f V\n", voltage);
