สารบัญ:

บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR - สำหรับผู้เริ่มต้น: 14 ขั้นตอน
บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR - สำหรับผู้เริ่มต้น: 14 ขั้นตอน

วีดีโอ: บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR - สำหรับผู้เริ่มต้น: 14 ขั้นตอน

วีดีโอ: บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR - สำหรับผู้เริ่มต้น: 14 ขั้นตอน
วีดีโอ: EP1/1 บทที่1 เริ่มต้นใช้งานไมโครคอนโทรลเลอร์ Arduino 2024, พฤศจิกายน
Anonim
บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR | สำหรับผู้เริ่มต้น
บทนำสู่ ADC ในไมโครคอนโทรลเลอร์ AVR | สำหรับผู้เริ่มต้น

ในบทช่วยสอนนี้ คุณจะรู้ทุกอย่างเกี่ยวกับ ADC ในไมโครคอนโทรลเลอร์ avr

ขั้นตอนที่ 1: ADC คืออะไร?

ADC หรือตัวแปลงอนาล็อกเป็นดิจิตอลช่วยให้สามารถแปลงแรงดันไฟฟ้าแอนะล็อกเป็นค่าดิจิทัลที่ไมโครคอนโทรลเลอร์สามารถใช้ได้ มีแหล่งสัญญาณแอนะล็อกมากมายที่อาจต้องการวัด มีเซ็นเซอร์แบบแอนะล็อกที่สามารถวัดอุณหภูมิ ความเข้มแสง ระยะทาง ตำแหน่ง และแรงได้ เป็นต้น

ขั้นตอนที่ 2: ADC ทำงานอย่างไรใน AVR- ไมโครคอนโทรลเลอร์

AVR ADC ช่วยให้ไมโครคอนโทรลเลอร์ AVR สามารถแปลงแรงดันไฟฟ้าแอนะล็อกเป็นค่าดิจิตอลโดยมีชิ้นส่วนภายนอกเพียงเล็กน้อยหรือไม่มีเลย ATmega8 มี ADC ประมาณ 10 บิตต่อเนื่องกัน ATmega8 มี ADC 7 ช่องสัญญาณที่ PortC ADC มีพินการจ่ายแรงดันอนาล็อกแยกต่างหาก AVCC AVCC ต้องไม่แตกต่างจาก VCC มากกว่า ± 0.3V.. แรงดันอ้างอิงอาจถูกแยกจากภายนอกที่พิน AREF AVCC ใช้เป็นข้อมูลอ้างอิงแรงดันไฟฟ้า นอกจากนี้ยังสามารถตั้งค่า ADC ให้ทำงานอย่างต่อเนื่อง (โหมดรันฟรี) หรือทำการแปลงเพียงครั้งเดียว

ขั้นตอนที่ 3: สูตรการแปลง ADC

สูตรการแปลง ADC
สูตรการแปลง ADC

โดยที่ Vin คือแรงดันไฟฟ้าบนพินอินพุตที่เลือกและ Vref การอ้างอิงแรงดันไฟฟ้าที่เลือก

ขั้นตอนที่ 4: วิธีกำหนดค่า ADC ใน ATmega8

วิธีกำหนดค่า ADC ใน ATmega8
วิธีกำหนดค่า ADC ใน ATmega8

Registers ต่อไปนี้ใช้สำหรับการนำ ADC ไปใช้ใน ATmega8

การเลือก ADC Multiplexer

ขั้นตอนที่ 5: การเลือก ADLAR

การเลือก ADLAR
การเลือก ADLAR
การเลือก ADLAR
การเลือก ADLAR

ADC Left Adjust Result บิต ADLAR มีผลกับการนำเสนอของผลการแปลง ADC ใน ADC Data Register เขียนหนึ่งไปที่ ADLAR เพื่อปรับผลลัพธ์ทางซ้าย มิฉะนั้นผลลัพธ์จะถูกปรับให้เหมาะสม

เมื่อการแปลง ADC เสร็จสมบูรณ์ จะพบผลลัพธ์ใน ADCH และ ADCL เมื่ออ่าน ADCL แล้ว ADC Data Register จะไม่อัปเดตจนกว่าจะอ่าน ADCH ดังนั้น หากผลลัพธ์ถูกปรับทิ้งไว้และไม่ต้องการความแม่นยำมากกว่า 8 บิต ก็เพียงพอที่จะอ่าน ADCH มิฉะนั้น ต้องอ่าน ADCL ก่อน จากนั้นจึงอ่าน ADCH Analog Channel Selection Bits ค่าของบิตเหล่านี้จะเลือกอินพุตแบบอะนาล็อกที่เชื่อมต่อกับ ADC

ขั้นตอนที่ 6: การเลือก ADCSRA

การเลือก ADCRA
การเลือก ADCRA
การเลือก ADCRA
การเลือก ADCRA

• บิต 7 – ADEN: ADC เปิดใช้งานการเขียนบิตนี้เป็นหนึ่งเพื่อเปิดใช้งาน ADC โดยการเขียนให้เป็นศูนย์ ADC จะถูกปิด

• บิต 6 – ADSC: ADC เริ่มการแปลง ในโหมด Single Conversion เขียนบิตนี้เป็นหนึ่งเพื่อเริ่มการแปลงแต่ละครั้ง ในโหมด Free Running เขียนบิตนี้เป็นหนึ่งเพื่อเริ่มการแปลงครั้งแรก

• Bit 5 – ADFR: ADC Free Running Select เมื่อบิตนี้ถูกตั้งค่า (หนึ่ง) ADC จะทำงานในโหมด Free Running ในโหมดนี้ ADC จะสุ่มตัวอย่างและอัปเดต Data Registers อย่างต่อเนื่อง การล้างบิตนี้ (ศูนย์) จะเป็นการยุติโหมด Free Running

• บิต 4 – ADIF: ADC Interrupt Flag บิตนี้ถูกตั้งค่าเมื่อการแปลง ADC เสร็จสิ้นและรีจิสเตอร์ข้อมูลได้รับการอัพเดต ADC Conversion Complete Interrupt จะดำเนินการหากมีการตั้งค่าบิต ADIE และ I-bit ใน SREG ADIF ถูกล้างโดยฮาร์ดแวร์เมื่อดำเนินการขัดจังหวะ Handling Vector ที่สอดคล้องกัน อีกทางหนึ่ง ADIF จะถูกล้างโดยการเขียนตรรกะไปที่แฟล็ก

• Bit 3 – ADIE: ADC Interrupt Enable เมื่อบิตนี้ถูกเขียนเป็นหนึ่งและตั้งค่า I-bit ใน SREG แล้ว ADC Conversion Complete Interrupt จะเปิดใช้งาน

• บิต 2:0 – ADPS2:0: ADC Prescaler Select Bits ตามแผ่นข้อมูล จำเป็นต้องตั้งค่าพรีสเกลาร์นี้เพื่อให้ความถี่อินพุต ADC อยู่ระหว่าง 50 KHz ถึง 200 KHz นาฬิกา ADC ได้มาจากนาฬิกาของระบบด้วยความช่วยเหลือของ ADPS2:0 บิตเหล่านี้จะกำหนดปัจจัยการแบ่งระหว่างความถี่ XTAL และนาฬิกาอินพุตไปยัง ADC

ขั้นตอนที่ 7: หากคุณต้องการรับค่า ADC คุณต้องทำงานให้เสร็จตามรายการด้านล่าง

  • ตั้งค่า ADC
  • กำหนดค่าเอาต์พุต LED pin
  • กำหนดค่าฮาร์ดแวร์ ADC
  • เปิดใช้งาน ADC
  • เริ่มการแปลงแอนะล็อกเป็นดิจิทัล
  • ในขณะที่ตลอดไป

ถ้าค่า ADC สูงขึ้น ให้ตั้งค่า เปิด LED ELSE ปิด LED

ขั้นตอนที่ 8: ตั้งค่า ADC

รหัส: uint8_t ADCValue =128;

ขั้นตอนที่ 9: กำหนดค่าขาออก LED Pin

รหัส: DDRB|= (1 << PB1);

ขั้นตอนที่ 10: กำหนดค่าฮาร์ดแวร์ ADC

กำหนดค่าฮาร์ดแวร์ ADC

ทำได้ผ่านการตั้งค่าบิตในรีจิสเตอร์ควบคุมสำหรับ ADC อันดับแรก มาตั้งค่าพรีสเกลาร์สำหรับ ADC กันก่อน ตามแผ่นข้อมูล จำเป็นต้องตั้งค่าพรีสเกลาร์นี้เพื่อให้ความถี่อินพุต ADC อยู่ระหว่าง 50 KHz ถึง 200 KHz นาฬิกา ADC ได้มาจากนาฬิกาของระบบ ด้วยความถี่ของระบบ 1MHz พรีสเกลเลอร์ 8 จะส่งผลให้ความถี่ ADC 125 Khz การปรับสเกลล่วงหน้าถูกกำหนดโดยบิต ADPS ในการลงทะเบียน ADCSRA ตามแผ่นข้อมูล ADPS2:0 บิตทั้งสามต้องตั้งค่าเป็น 011 เพื่อรับ 8 prescaler

รหัส: ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ต่อไป มาตั้งค่าแรงดันอ้างอิง ADC สิ่งนี้ถูกควบคุมโดยบิต REFS ในการลงทะเบียน ADMUX ต่อไปนี้ตั้งค่าแรงดันอ้างอิงเป็น AVCC

รหัส: ADMUX |= (1 << REFS0);

ในการตั้งค่าช่องสัญญาณที่ส่งผ่านมัลติเพล็กเซอร์ไปยัง ADC จะต้องตั้งค่าบิต MUX ในการลงทะเบียน ADMUX ตามลำดับ เนื่องจากเราใช้ ADC5 ที่นี่

รหัส: ADMUX&=0xF0; ADMUX|=5;

ในการกำหนดให้ ADC เข้าสู่โหมดรันฟรี ให้ตั้งค่าบิต ADFR ที่ตั้งชื่ออย่างเหมาะสมในการลงทะเบียน ADCSRA:

รหัส: ADCSRA |= (1 << ADFR);

การเปลี่ยนแปลงการตั้งค่าครั้งสุดท้ายจะทำให้การอ่านค่า ADC ง่ายขึ้น แม้ว่า ADC จะมีความละเอียด 10 บิต แต่ข้อมูลจำนวนมากนี้มักไม่จำเป็น ค่า 10 บิตนี้แบ่งออกเป็นรีจิสเตอร์ 8 บิตสองตัวคือ ADCH และ ADCL โดยค่าเริ่มต้น ค่า ADC ที่ต่ำที่สุด 8 บิตจะพบใน ADCL โดยที่สองตัวบนจะเป็น ADCH สองบิตที่ต่ำที่สุด โดยการตั้งค่าบิต ADLAR ในการลงทะเบียน ADMUX เราสามารถจัดค่า ADC ให้ชิดซ้ายได้ สิ่งนี้ทำให้การวัดสูงสุด 8 บิตในการลงทะเบียน ADCH โดยที่เหลือในการลงทะเบียน ADCL หากเราอ่านการลงทะเบียน ADCH เราจะได้ค่า 8 บิตที่แทนการวัด 0 ถึง 5 โวลต์ของเราเป็นตัวเลขตั้งแต่ 0 ถึง 255 โดยพื้นฐานแล้ว เรากำลังเปลี่ยนการวัด ADC 10 บิตของเราเป็น 8 บิต นี่คือรหัสสำหรับตั้งค่าบิต ADLAR:

รหัส:

ADMUX |= (1 << ADLAR); ที่เสร็จสิ้นการตั้งค่าฮาร์ดแวร์ ADC สำหรับตัวอย่างนี้ ต้องตั้งค่าอีกสองบิตก่อนที่ ADC จะเริ่มทำการวัด

ขั้นตอนที่ 11: เปิดใช้งาน ADC

ในการเปิดใช้งาน ADC ให้ตั้งค่าบิต ADEN ใน ADCSRA:

รหัส: ADCSRA |= (1 << ADEN);

ขั้นตอนที่ 12: เริ่มการแปลงแอนะล็อกเป็นดิจิทัล

ในการเริ่มการวัด ADC จะต้องตั้งค่าบิต ADSC ใน ADCSRA:

รหัส: ADCSRA |= (1 << ADSC);

ณ จุดนี้ ADC จะเริ่มสุ่มตัวอย่างแรงดันไฟฟ้าที่แสดงบน ADC5 อย่างต่อเนื่อง รหัสถึงจุดนี้จะมีลักษณะดังนี้:

ขั้นตอนที่ 13: ในขณะที่ตลอดไป

สิ่งเดียวที่ต้องทำคือทดสอบค่า ADC และตั้งค่า LED ให้แสดงสถานะสูง/ต่ำ เนื่องจากการอ่านค่า ADC ใน ADCH มีค่าสูงสุด 255 ค่าทดสอบของ th จึงถูกเลือกเพื่อพิจารณาว่าแรงดันไฟฟ้าสูงหรือต่ำ คำสั่ง IF/ELSE อย่างง่ายใน FOR loops จะทำให้เราสามารถเปิดไฟ LED ที่ถูกต้องได้:

รหัส

ถ้า(ADCH >ADCValue)

{

PORTB |= (1 << PB0); // เปิด LED

}

อื่น

{

PORTB&= ~(1 << PB0); // ปิด LED

}

ขั้นตอนที่ 14: ในตอนท้าย กรอกรหัสให้สมบูรณ์

รหัส:

#รวม

int หลัก (เป็นโมฆะ)

{

uint8_t ADCValue =128;

DDRB |= (1 << PB0); // ตั้งค่า LED1 เป็นเอาต์พุต

ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ตั้งค่า ADC prescalar เป็น 8 - // อัตราตัวอย่าง 125KHz 1MHz

ADMUX |= (1 << REFS0); // ตั้งค่าอ้างอิง ADC เป็น AVCC

ADMUX |= (1 << ADLAR); // ปรับผล ADC ไปทางซ้ายเพื่อให้อ่าน 8 บิตได้ง่าย

ADMUX&=0xF0;

ADMUX|=5; // จำเป็นต้องเปลี่ยนค่า MUX เพื่อใช้ ADC0

ADCSRA |= (1 << ADFR); // ตั้งค่า ADC เป็นโหมดวิ่งฟรี

ADCSRA |= (1 << เอเดน); // เปิดใช้งาน ADC

ADCSRA |= (1 << ADSC); // เริ่มการแปลง A2D ในขณะที่ (1) // วนซ้ำตลอดไป

{

ถ้า (ADCH > ADCValue)

{

PORTB |= (1 << PB0); // เปิด LED1

}

อื่น

{

พอร์ต &= ~(1 << PB1); // ปิด LED1

}

}

กลับ 0;

}

เผยแพร่บทช่วยสอนนี้ก่อน คลิกที่นี่

แนะนำ: