ADC Principles

มีหลายเทคนิคที่ถูกนำมาใช้ในการแปลงสัญญาณอนาล็อก เพื่อเป็นข้อมูลค่าดิจิตอล ที่นิยมกันตัวอย่างเช่น successive approximation conversion, parallel-encoded conversion (หรือ flash conversion), delta-sigma processing และ pulse-code modulation (PCM) เป็นต้น
ซึ่งหนึ่งในเทคนิคที่ถูกใช้มากที่สุดคือ วิธีการประมาณค่าต่อเนื่อง (successive approximation conversion) โดยเทคนิคนี้จะทำการแปลงแต่ละบิตของผลลัพธ์แบบไบนารีจะถูกค้นหา หนึ่งบิตต่อครั้ง—เริ่มจาก MSB bit ซึ่งวิธีนี้จะทำการแปลงที่ค่อนข้างเร็ว (ในช่วงเวลาประมาณ 10 ถึง 300 μs) ด้วยจำนวนวงจรที่จำกัด ดังตัวอย่างรูปข้างล่าง เป็นการแปลงค่าประมาณต่อเนื่องขนาด 8-bit แบบง่าย

ใน PSoCᵀᴹ ไมโครคอลโทรเลอร์ จะมีตัว ADC เป็นส่วนประกอบฮาร์ดแวร์ที่สามารถอ่านแรงดันจากขาอนาล็อก (โหมดแบบเดี่ยว - single ended mode) หรือคู่ขาอนาล็อก (โหมดเชิงเส้น - differential mode) แล้วแปลงเป็นค่าดิจิตอลที่ PSoCᵀᴹ ไมโครคอลโทรเลอร์ สามารถตีความได้ โดยในโหมดแบบเดี่ยว ADC จะอ่านแรงดันที่ขาอนาล็อกที่ระบุเมื่อเทียบกับดินหรือค่าอ้างอิงอื่นๆ ในขณะที่ ในโหมดเชิงเส้น ADC จะอ่านแรงดันระหว่างขาอนาล็อกสองขาที่ระบุ จำนวนบิตในผลลัพธ์ที่ ADC สร้างขึ้นจะกำหนดความละเอียดของ ADC ตัวอย่างเช่น ผลลัพธ์ที่ 12-bit ADC สามารถสร้างขึ้นจะอยู่ในช่วง
0 → 2¹²
=0 → 4096
สำหรับการวัดในโหมดแบบเดี่ยว-2¹¹ → 2¹¹
=-2048 → +2048
สำหรับการวัดในโหมดแบบเชิงเส้น
ในช่วงแรงดันอินพุตของ PSoCᵀᴹ ADC สามารถปรับค่าได้และแตกต่างกันตามอุปกรณ์ โดยทั่วไปแรงดันที่สามารถวัดได้คือ 0 → 2*Vref
สำหรับการวัดแบบเดี่ยวและ Vx ± Vref
สำหรับการวัดแบบเชิงเส้น โดยที่ Vref เป็นแรงดันอ้างอิงที่สร้างขึ้นในชิป และ Vx เป็นอินพุตลบ สำหรับการวัดแบบเชิงเส้น
ผลลัพธ์ที่ ADC สร้างขึ้นมีหน่วยว่า "counts" โดยแต่ละ "count" แทนส่วนหนึ่งของช่วงแรงดันอินพุตทั้งหมด
ตัวอย่างเช่น
ถ้าช่วงอินพุตคือ ±5V (ทั้งหมด 10V) และ ADC มีความละเอียด 12 บิต (12-bit หรือ 2¹²) ดังนั้นแต่ละ count จะเท่ากับ
หรือเท่ากับ
PSoCᵀᴹ devices มี ADC อยู่สองแบบคือ
Successive Approximation Register (SAR)
Sigma-Delta or Delta-Sigma
ในการเขียนโปรแกรมสำหรับบอร์ด PSoC6 จะมีการเรียกใช้ฟังก์ชัน cyhal_adc_init เพื่อกำหนดการทำงานเริ่มต้นให้กับ PSoCᵀᴹ ADC ผ่านตัวแปร obj
ของ ADC object, ตัวแปร pin ของ
input pin และตัวแปร clk
ของ clock
นอกจากนั้นจะเรียกใช้ฟังก์ชัน cyhal_adc_channel_init_diff เพื่อกำหนดจำนวนช่องสัญญาณที่จะรับเข้ามา (channel) และฟังก์ชัน cyhal_adc_read สำหรับการอ่านผลลัพธ์จากการแปลงสัญญาณอนาล็อกเป็นดิจิตอลต่อไป
cy_rslt_t rslt;
cyhal_adc_t adc_obj;
cyhal_adc_channel_t adc_chan_0_obj;
// ADC conversion result.
int32_t adc_out;
// Initialize ADC. The ADC block which can connect to pin ADC_VPLUS1 is selected
rslt = cyhal_adc_init(&adc_obj, ADC_VPLUS1, NULL);
// Initialize ADC channel, allocate channel number 0 to pin ADC_VPLUS1 as this is the first
// channel initialized
const cyhal_adc_channel_config_t channel_config =
{ .enable_averaging = false, .min_acquisition_ns = 220, .enabled = true };
rslt = cyhal_adc_channel_init_diff(&adc_chan_0_obj, &adc_obj, ADC_VPLUS1, CYHAL_ADC_VNEG,
&channel_config);
// Read the ADC conversion result for corresponding ADC channel. Repeat as necessary.
adc_out = cyhal_adc_read(&adc_chan_0_obj);
// Release ADC and channel objects when no longer needed
cyhal_adc_channel_free(&adc_chan_0_obj);
cyhal_adc_free(&adc_obj);
รายละเอียดเพิ่มเติมทางเทคนิค
Last updated
Was this helpful?