ในการใช้งาน 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);