- Ce este ADC (conversie analogică la digitală)
- ADC în microcontrolerul AVR Atmega16
- Componente necesare
- Diagrama circuitului
- Configurarea registrelor de control ADC în Atmega16
- Programare Atmega16 pentru ADC
O caracteristică comună care este utilizată în aproape fiecare aplicație încorporată este modulul ADC (convertor analogic digital). Acești convertoare analog-digitale pot citi tensiunea de la senzorii analogici, cum ar fi senzorul de temperatură, senzorul de înclinare, senzorul de curent, senzorul Flex etc. În acest tutorial vom afla ce este ADC și cum se utilizează ADC în Atmega16. Acest tutorial include conectarea unui potențiometru mic la pinul ADC al Atmega16 și 8 LED-uri sunt utilizate pentru a afișa tensiunea de schimbare a valorii de ieșire ADC în ceea ce privește modificarea valorii de intrare ADC.
Anterior am explicat ADC în alte microcontrolere:
- Cum se utilizează ADC în ARM7 LPC2148 - Măsurarea tensiunii analogice
- Cum se utilizează ADC în STM32F103C8 - Măsurarea tensiunii analogice
- Cum se utilizează ADC în MSP430G2 - Măsurarea tensiunii analogice
- Cum se utilizează ADC în Arduino Uno?
- Utilizarea modulului ADC al microcontrolerului PIC cu MPLAB și XC8
Ce este ADC (conversie analogică la digitală)
ADC înseamnă Convertor analog-digital. În electronică, un ADC este un dispozitiv care convertește un semnal analog ca curentul și tensiunea în cod digital (formă binară). În lumea reală, majoritatea semnalelor sunt analogice și orice microcontroler sau microprocesor înțelege limbajul binar sau digital (0 sau 1). Deci, pentru a face microcontrolerele să înțeleagă semnalele analogice, trebuie să convertim aceste semnale analogice în formă digitală. ADC face exact acest lucru pentru noi. Există multe tipuri de ADC disponibile pentru diferite aplicații. Puține ADC populare sunt flash, aproximare succesivă și sigma-delta.
Cel mai ieftin tip de ADC este Aproximarea succesivă și în acest tutorial se va utiliza ADC-aproximarea succesivă. Într-un tip de ADC-Aproximare Succesivă, sunt generate succesiv o serie de coduri digitale, fiecare corespunzând unui nivel analogic fix. Un contor intern este utilizat pentru a compara cu semnalul analogic în conversie. Generarea este oprită atunci când nivelul analogic devine doar mai mare decât semnalul analogic. Codul digital corespunde nivelului analogic este reprezentarea digitală dorită a semnalului analogic. Aceasta termină mica noastră explicație privind aproximarea succesivă.
Dacă doriți să explorați ADC în profunzime, puteți consulta tutorialul nostru anterior despre ADC. ADC-urile sunt disponibile sub formă de IC-uri și, de asemenea, microcontrolerele vin cu ADC încorporat în zilele noastre. În acest tutorial vom folosi ADC încorporat al Atmega16. Să discutăm despre ADC-ul încorporat al Atmega16.
ADC în microcontrolerul AVR Atmega16
Atmega16 are un ADC încorporat pe 10 biți și 8 canale. 10 biți corespund că, dacă tensiunea de intrare este 0-5V, atunci va fi împărțită în valoare de 10 biți, adică 1024 niveluri de valori analogice discrete (2 10 = 1024). Acum 8 canale corespund celor 8 pini ADC dedicati de pe Atmega16 unde fiecare pin poate citi tensiunea analogica. PortA complet (GPIO33-GPIO40) este dedicat pentru funcționarea ADC. În mod implicit, pinii PORTA sunt pinii IO generali, înseamnă că pinii portului sunt multiplexați. Pentru a utiliza acești pini ca pini ADC va trebui să configurăm anumite registre dedicate controlului ADC. Acesta este motivul pentru care registrele sunt cunoscute sub numele de registre de control ADC. Să discutăm despre cum să setăm aceste registre pentru a începe să funcționeze ADC-ul încorporat.
Pinii ADC în Atmega16
Componente necesare
- IC microcontroler Atmega16
- Oscilator de cristal de 16 MHz
- Două condensatoare 100nF
- Două condensatoare de 22pF
- Apasa butonul
- Sârme jumper
- Breadboard
- USBASP v2.0
- Led (orice culoare)
Diagrama circuitului
Configurarea registrelor de control ADC în Atmega16
1. Registrul ADMUX (Registrul de selecție a multiplexorului ADC) :
Registrul ADMUX este pentru selectarea canalului ADC și selectarea tensiunii de referință. Imaginea de mai jos prezintă prezentarea generală a registrului ADMUX. Descrierea este explicată mai jos.
- Bit 0-4: biți de selecție a canalului.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Canal ADC selectat |
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: este folosit pentru a ajusta rezultatul la dreapta sau la stânga.
ADLAR |
Descriere |
0 |
Reglați dreapta rezultatul |
1 |
Stânga reglați rezultatul |
- Bit 6-7: Sunt folosite pentru a selecta tensiunea de referință pentru ADC.
REFS1 |
REFS0 |
Selecție referință tensiune |
0 |
0 |
AREF, Vref intern dezactivat |
0 |
1 |
AVcc cu condensator extern la pinul AREF |
1 |
0 |
Rezervat |
1 |
1 |
Referință internă de tensiune 2,56 cu condensator extern la pinul AREF |
Acum începeți să configurați acești biți de registru în program, astfel încât să primim ADC intern citit și ieșit la Toți Pinii PORTC.
Programare Atmega16 pentru ADC
Programul complet este prezentat mai jos. Ardeți programul în Atmega16 folosind JTAG și Atmel studio și rotiți potențiometrul pentru a varia valoarea ADC. Aici, codul este explicat rând cu rând.
Începeți cu crearea unei funcții pentru a citi valoarea convertită ADC. Apoi treceți valoarea canalului ca „chnl” în funcția ADC_read .
unsigned int ADC_read (nesemnat chnl char)
Valorile canalelor trebuie să fie cuprinse între 0 și 7, deoarece avem doar 8 canale ADC.
chnl = chnl & 0b00000111;
Scriind „40”, adică „01000000” în registrul ADMUX, am selectat PORTA0 ca ADC0 unde intrarea analogică va fi conectată pentru conversie digitală.
ADMUX = 0x40;
Acum, acest pas implică procesul de conversie ADC, unde prin scrierea ONE în ADSC Bit în registrul ADCSRA începem conversia. După aceea, așteptați ca bitul ADIF să returneze valoarea când conversia este finalizată. Oprim conversia scriind „1” la ADIF Bit în registrul ADCSRA. Când conversia este finalizată, întoarceți valoarea ADC.
ADCSRA - = (1 <
Aici tensiunea de referință internă ADC este selectată prin setarea bitului REFS0. După aceea activați ADC și selectați prescalerul ca 128.
ADMUX = (1 <
Acum salvați valoarea ADC și trimiteți-o la PORTC. În PORTC, sunt conectate 8 LED-uri care vor afișa ieșirea digitală în format de 8 biți. Exemplul pe care l-am arătat variază tensiunea între 0V și 5V folosind un vas de 1K.
i = ADC_read (0); PORTC = i;
Multimetrul digital este utilizat pentru a afișa tensiunea de intrare analogică în pinul ADC și 8 LED-uri sunt utilizate pentru a afișa valoarea corespunzătoare de 8 biți a ieșirii ADC. Doar rotiți potențiometrul și vedeți rezultatul corespunzător pe multimetru, precum și pe LED-urile strălucitoare.
Codul complet și videoclipul de lucru sunt prezentate mai jos.