ในการใช้งาน 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.3VOutput (10-bit)
0V(0/3.3)×1023 ≈ 00
1.65V(1.65/3.3)×1023 ≈ 511511
3.3V(3.3/3.3)×1023 = 10231023

🔥 วิธีใช้งานให้ได้ประสิทธิภาพสูงสุด

  1. รู้ค่า Vref ให้แม่นยำ
    • ถ้าใช้ VDD เป็น Vref และ VDD ไม่นิ่ง → ค่า ADC ผันผวน
    • ทางที่ดีใช้ LDO regulator คุม VDD ให้นิ่ง (3.3V หรือ 5V)
  2. ตั้งค่า ADC_SampleTime ให้เหมาะสม
    • บน CH32V003: ใช้ ADC_SampleTime_xxCycles เพื่อหน่วงเวลาการ sample นานพอ
    • ถ้าตั้งค่าสั้นไป: ค่าที่อ่านได้จะ noise เยอะ
  3. กรองสัญญาณ Analog ก่อนเข้า ADC
    • ใช้ Low-Pass Filter (RC filter) หน้าขา ADC เพื่อกรอง noise high frequency
    • เช่น ใส่ R=1kΩ, C=100nF
  4. อ่านค่า ADC หลายครั้งแล้วทำเฉลี่ย (Averaging)
    • ช่วยลด noise และ jitter
    • เช่น อ่าน 8 ครั้ง เอาผลรวมแล้วหาร 8
  5. รู้ความสัมพันธ์ 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);