- ADC คืออะไร (การแปลงอนาล็อกเป็นดิจิตอล)
- ADC ในไมโครคอนโทรลเลอร์ AVR Atmega16
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การตั้งค่า ADC control Registers ใน Atmega16
- การเขียนโปรแกรม Atmega16 สำหรับ ADC
คุณสมบัติทั่วไปอย่างหนึ่งที่ใช้ในแอพพลิเคชั่นฝังตัวเกือบทุกตัวคือโมดูล ADC (ตัวแปลงอนาล็อกเป็นดิจิตอล) เหล่านี้ แปลงอนาล็อกเป็นดิจิตอล สามารถอ่านแรงดันไฟฟ้าจากเซ็นเซอร์อนาล็อกเช่นเซ็นเซอร์อุณหภูมิ, เซ็นเซอร์เอียงเซ็นเซอร์ปัจจุบัน Flex เซ็นเซอร์ ฯลฯ ในการกวดวิชานี้เราจะเรียนรู้ ADC คืออะไรและวิธีการใช้ ADC ใน ATmega16 บทช่วยสอนนี้รวมถึงการเชื่อมต่อโพเทนชิออมิเตอร์ขนาดเล็กเข้ากับขา ADC ของ Atmega16 และ LED 8 ดวงใช้เพื่อแสดงแรงดันไฟฟ้าที่เปลี่ยนแปลงของค่าเอาต์พุต ADC ตามการเปลี่ยนแปลงของค่าอินพุต ADC
ก่อนหน้านี้เราได้อธิบาย ADC ในไมโครคอนโทรลเลอร์อื่น ๆ:
- วิธีใช้ ADC ใน ARM7 LPC2148 - การวัดแรงดันอนาล็อก
- วิธีใช้ ADC ใน STM32F103C8 - การวัดแรงดันอนาล็อก
- วิธีใช้ ADC ใน MSP430G2 - การวัดแรงดันอนาล็อก
- วิธีใช้ ADC ใน Arduino Uno
- การใช้โมดูล ADC ของไมโครคอนโทรลเลอร์ PIC กับ MPLAB และ XC8
ADC คืออะไร (การแปลงอนาล็อกเป็นดิจิตอล)
ADC ย่อมาจาก Analog to Digital Converter ในอุปกรณ์อิเล็กทรอนิกส์ ADC เป็นอุปกรณ์ที่แปลงสัญญาณแอนะล็อกเช่นกระแสและแรงดันเป็นรหัสดิจิทัล (รูปแบบไบนารี) ในโลกแห่งความเป็นจริงสัญญาณส่วนใหญ่เป็นแบบอะนาล็อกและไมโครคอนโทรลเลอร์หรือไมโครโปรเซสเซอร์เข้าใจภาษาไบนารีหรือดิจิทัล (0 หรือ 1) ดังนั้นเพื่อให้ไมโครคอนโทรลเลอร์เข้าใจสัญญาณแอนะล็อกเราต้องแปลงสัญญาณแอนะล็อกเหล่านี้ให้อยู่ในรูปดิจิทัล ADC ทำเพื่อเรา ADC มีหลายประเภทสำหรับการใช้งานที่แตกต่างกันADC ที่ได้รับความนิยมไม่กี่แห่ง ได้แก่ แฟลชการประมาณต่อเนื่องและซิกม่าเดลต้า
ประเภทที่ถูกที่สุดของ ADC คือการประมาณตามลำดับและในบทช่วยสอนนี้จะใช้ ADC แบบประมาณต่อเนื่อง ใน ADC ประเภทการประมาณต่อเนื่องจะมีการสร้างชุดรหัสดิจิทัลซึ่งแต่ละรหัสสอดคล้องกับระดับอะนาล็อกแก้ไขตามลำดับ ตัวนับภายในใช้เพื่อเปรียบเทียบกับสัญญาณอนาล็อกภายใต้การแปลง การสร้างจะหยุดลงเมื่อระดับอนาล็อกมีขนาดใหญ่กว่าสัญญาณอนาล็อก รหัสดิจิทัลสอดคล้องกับระดับอนาล็อกคือการแสดงสัญญาณดิจิตอลที่ต้องการของสัญญาณอนาล็อก นี่เป็นการจบคำอธิบายเล็กน้อยของเราเกี่ยวกับการประมาณต่อเนื่อง
หากคุณต้องการสำรวจ ADC ในเชิงลึกคุณสามารถดูบทแนะนำก่อนหน้าของเราเกี่ยวกับ ADC ADC มีจำหน่ายในรูปแบบของ IC และไมโครคอนโทรลเลอร์ยังมาพร้อมกับ ADC ในตัวในปัจจุบัน ในการกวดวิชานี้เราจะใช้ADC ของ inbuilt ATmega16 มาพูดคุยเกี่ยวกับ ADC ในตัวของ Atmega16
ADC ในไมโครคอนโทรลเลอร์ AVR Atmega16
Atmega16 มี ADC 10 บิตและ 8 แชนเนลในตัว 10 บิตสอดคล้องกับที่หากแรงดันไฟฟ้าอินพุตเป็น 0-5V จะถูกแบ่งออกเป็นค่า 10 บิตเช่น 1024 ระดับของค่าอนาล็อกแบบไม่ต่อเนื่อง (2 10 = 1024) ตอนนี้8-channelสอดคล้องกับ 8 ADC Pins เฉพาะบน Atmega16 ซึ่งแต่ละพินสามารถอ่านแรงดันอนาล็อกได้ Complete PortA (GPIO33-GPIO40) มีไว้สำหรับการทำงานของ ADC โดยค่าเริ่มต้นพิน PORTA เป็นพิน IO ทั่วไปหมายความว่าพินพอร์ตเป็นมัลติเพล็กซ์ ในการใช้พินเหล่านี้เป็นพิน ADC เราจะต้องกำหนดค่ารีจิสเตอร์เฉพาะสำหรับการควบคุม ADC นี่คือเหตุผลที่รีจิสเตอร์เรียกว่าการลงทะเบียนควบคุม ADC ให้เราพูดถึงวิธีการตั้งค่าการลงทะเบียนเหล่านี้เพื่อเริ่มทำงานของ ADC ในตัว
ADC Pins ใน Atmega16
ส่วนประกอบที่จำเป็น
- Atmega16 ไมโครคอนโทรลเลอร์ IC
- 16Mhz คริสตัลออสซิลเลเตอร์
- ตัวเก็บประจุ 100nF สองตัว
- ตัวเก็บประจุ 22pF สองตัว
- ปุ่มกด
- สายจัมเปอร์
- เขียงหั่นขนม
- USBASP v2.0
- LED (สีใดก็ได้)
แผนภูมิวงจรรวม
การตั้งค่า ADC control Registers ใน Atmega16
1. ลงทะเบียน ADMUX (ADC Multiplexer Selection Register) :
ADMUX Register ใช้สำหรับเลือกช่องสัญญาณ ADC และเลือกแรงดันไฟฟ้าอ้างอิง ภาพด้านล่างแสดงภาพรวมของการลงทะเบียน ADMUX คำอธิบายอธิบายไว้ด้านล่าง
- บิต 0-4:บิตการเลือกช่องสัญญาณ
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
เลือกช่อง ADC |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: ใช้เพื่อปรับผลลัพธ์ไปทางขวาหรือซ้าย
ADLAR |
คำอธิบาย |
0 |
ขวาปรับผลลัพธ์ |
1 |
ซ้ายปรับผลลัพธ์ |
- บิต 6-7: ใช้เพื่อเลือกแรงดันอ้างอิงสำหรับ ADC
REFS1 |
REFS0 |
การเลือกอ้างอิงแรงดันไฟฟ้า |
0 |
0 |
AREF, Vref ภายในปิดอยู่ |
0 |
1 |
AVcc พร้อมตัวเก็บประจุภายนอกที่ขา AREF |
1 |
0 |
ที่สงวนไว้ |
1 |
1 |
ภายใน 2.56 แรงดันอ้างอิงกับตัวเก็บประจุภายนอกที่ AREF Pin |
ตอนนี้เริ่มกำหนดค่าบิตรีจิสเตอร์เหล่านี้ในโปรแกรมเพื่อให้เราได้รับ Internal ADC อ่านและส่งออกไปยังพินทั้งหมดของ PORTC
การเขียนโปรแกรม Atmega16 สำหรับ ADC
โปรแกรมที่สมบูรณ์ได้รับด้านล่าง เบิร์นโปรแกรมใน Atmega16 โดยใช้ JTAG และ Atmel studio แล้วหมุนโพเทนชิออมิเตอร์เพื่อเปลี่ยนค่า ADC ในที่นี้รหัสจะอธิบายทีละบรรทัด
เริ่มต้นด้วยการสร้างหนึ่งฟังก์ชันเพื่ออ่านค่าที่แปลง ADC จากนั้นส่งค่าช่องเป็น 'chnl' ในฟังก์ชัน ADC_read
ADC_read int ที่ไม่ได้ลงชื่อ (char chnl ที่ไม่ได้ลงชื่อ)
ค่าช่องต้องอยู่ระหว่าง 0 ถึง 7 เนื่องจากเรามีช่อง ADC เพียง 8 ช่อง
chnl = chnl & 0b00000111;
ด้วยการเขียน '40' เช่น '01000000' ลงในทะเบียน ADMUX เราเลือก PORTA0 เป็น ADC0 ซึ่งจะเชื่อมต่ออินพุตอนาล็อกสำหรับการแปลงดิจิทัล
ADMUX = 0x40;
ตอนนี้ขั้นตอนนี้เกี่ยวข้องกับกระบวนการแปลง ADC โดยการเขียน ONE เป็น ADSC Bit ในการลงทะเบียน ADCSRA เราจะเริ่มการแปลง หลังจากนั้นรอให้บิต ADIF ส่งคืนค่าเมื่อการแปลงเสร็จสมบูรณ์ เราหยุดการแปลงโดยเขียน '1' ที่ ADIF Bit ในทะเบียน ADCSRA เมื่อการแปลงเสร็จสมบูรณ์แล้วให้ส่งคืนค่า ADC
ADCSRA - = (1 <
ที่นี่แรงดันอ้างอิง ADC ภายในถูกเลือกโดยการตั้งค่า REFS0 บิต หลังจากนั้นให้เปิดใช้งาน ADC และเลือก prescaler เป็น 128
ADMUX = (1 <
ตอนนี้บันทึกค่า ADC และส่งไปยัง PORTC ใน PORTC มีการเชื่อมต่อ LED 8 ดวงซึ่งจะแสดงเอาต์พุตดิจิตอลในรูปแบบ 8 บิต ตัวอย่างที่เราได้แสดงให้เห็นว่าแรงดันไฟฟ้าระหว่าง 0V ถึง 5V แตกต่างกันโดยใช้หม้อ 1K
ฉัน = ADC_read (0); PORTC = ฉัน;
Digital Multimeter ใช้เพื่อแสดงแรงดันไฟฟ้าอินพุตแบบอะนาล็อกใน ADC Pin และ 8 LED ใช้เพื่อแสดงค่า ADC 8 บิตที่สอดคล้องกัน เพียงแค่หมุนโพเทนชิออมิเตอร์และดูผลลัพธ์ที่สอดคล้องกันบนมัลติมิเตอร์เช่นเดียวกับไฟ LED เรืองแสง
รหัสที่สมบูรณ์และวิดีโอการทำงานได้รับด้านล่าง