Cuprins:

Introducere în ADC în microcontrolerul AVR - pentru începători: 14 pași
Introducere în ADC în microcontrolerul AVR - pentru începători: 14 pași

Video: Introducere în ADC în microcontrolerul AVR - pentru începători: 14 pași

Video: Introducere în ADC în microcontrolerul AVR - pentru începători: 14 pași
Video: Tutoriale ATMega164 - 1. Introducere (pregătirea unui mediu de dezvoltare virtual) 2024, Noiembrie
Anonim
Introducere în ADC în microcontrolerul AVR | pentru incepatori
Introducere în ADC în microcontrolerul AVR | pentru incepatori

În acest tutorial veți ști totul ADC în microcontrolerul AVR

Pasul 1: Ce este un ADC?

Un ADC, sau convertor analog la digital, permite conversia unei tensiuni analogice la o valoare digitală care poate fi utilizată de un microcontroler. Există multe surse de semnale analogice pe care s-ar putea să le măsoare. Există senzori analogici disponibili care măsoară temperatura, intensitatea luminii, distanța, poziția și forța, doar pentru a numi câteva.

Pasul 2: Cum funcționează ADC în microcontrolerul AVR

AVR ADC permite microcontrolerului AVR să convertească tensiunile analogice în valori digitale, cu puține sau fără părți externe. ATmega8 are o aproximare succesivă de 10 biți ADC. ATmega8 are 7 canale ADC la PortC. ADC are un pin de tensiune de alimentare analogic separat, AVCC. AVCC nu trebuie să difere mai mult de ± 0,3V față de VCC.. Referința de tensiune poate fi decuplată extern la pinul AREF. AVCC este utilizat ca referință de tensiune. ADC poate fi setat să ruleze continuu (modul de rulare liberă) sau să facă o singură conversie.

Pasul 3: Formula de conversie ADC

Formula de conversie ADC
Formula de conversie ADC

Unde Vin este tensiunea pe pinul de intrare selectat și Vref referința de tensiune selectată

Pasul 4: Cum se configurează ADC în ATmega8?

Cum se configurează ADC în ATmega8?
Cum se configurează ADC în ATmega8?

Următoarele registre sunt utilizate pentru implementarea ADC în ATmega8

Selecție multiplexor ADC

Pasul 5: Selecție ADLAR

Selecție ADLAR
Selecție ADLAR
Selecție ADLAR
Selecție ADLAR

ADC Left Adjust Result Bitul ADLAR afectează prezentarea rezultatului conversiei ADC în Registrul de date ADC. Scrieți unul la ADLAR pentru a regla la stânga rezultatul. În caz contrar, rezultatul este corect ajustat

Când o conversie ADC este finalizată, rezultatul se găsește în ADCH și ADCL Când ADCL este citit, Registrul de date ADC nu este actualizat până când ADCH nu este citit. În consecință, dacă rezultatul este lăsat ajustat și nu este necesară o precizie mai mare de 8 biți, este suficient să citiți ADCH. În caz contrar, ADCL trebuie citit mai întâi, apoi ADCH. Biți de selecție a canalului analogic Valoarea acestor biți selectează ce intrări analogice sunt conectate la ADC.

Pasul 6: Selecția ADCSRA

Selecție ADCSRA
Selecție ADCSRA
Selecție ADCSRA
Selecție ADCSRA

• Bit 7 - ADEN: ADC Enable Scrierea acestui bit pe unul activează ADC. Scriindu-l la zero, ADC este oprit

• Bitul 6 - ADSC: ADC Start Conversion În modul Single Conversion, scrieți acest bit pe unul pentru a începe fiecare conversie. În modul Free Running, scrieți acest bit pe unul pentru a începe prima conversie.

• Bitul 5 - ADFR: ADC Free Running Select Când acest bit este setat (unul), ADC funcționează în modul Free Running. În acest mod, ADC eșantionează și actualizează continuu registrele de date. Ștergerea acestui bit (zero) va termina modul de rulare liberă.

• Bitul 4 - ADIF: Indicator de întrerupere ADC Acest bit este setat la finalizarea unei conversii ADC și la actualizarea registrelor de date. Întreruperea completă a conversiei ADC este executată dacă bitul ADIE și bitul I din SREG sunt setate. ADIF este eliminat de hardware atunci când execută întreruperea corespunzătoare Handling Vector. Alternativ, ADIF este eliminat scriind unul logic pe steag.

• Bitul 3 - ADIE: Activare întrerupere ADC Când acest bit este scris pe unul și bitul I din SREG este setat, întreruperea completă a conversiei ADC este activată.

• Biti 2: 0 - ADPS2: 0: Biti selectați de precalificatori ADC Conform fișei tehnice, acest prescalar trebuie setat astfel încât frecvența de intrare ADC să fie între 50 KHz și 200 KHz. Ceasul ADC este derivat din ceasul sistemului cu ajutorul ADPS2: 0 Acești biți determină factorul de divizare între frecvența XTAL și ceasul de intrare la ADC.

Pasul 7: Dacă doriți să luați valoare ADC, trebuie să aveți nevoie de unele lucrări care sunt enumerate mai jos

  • Setați valoarea ADC
  • Configurați pinul de ieșire LED
  • Configurați hardware ADC
  • Activați ADC
  • Porniți conversii analogice la digitale
  • CÂND În veci

Dacă valoarea ADC este mai mare decât valoarea setată, porniți LED-ul ELSE Dezactivați LED-ul

Pasul 8: Setați valoarea ADC

Cod: uint8_t ADCValue = 128;

Pasul 9: Configurați pinul de ieșire LED

Cod: DDRB | = (1 << PB1);

Pasul 10: Configurați hardware ADC

Configurați hardware ADC

Acest lucru se face prin setarea de biți în registrele de control pentru ADC. În primul rând, să setăm prescalar pentru ADC. Conform fișei tehnice, acest prescalar trebuie setat astfel încât frecvența de intrare ADC să fie între 50 KHz și 200 KHz. Ceasul ADC este derivat din ceasul sistemului. Cu o frecvență de sistem de 1 MHz, un prescaler de 8 va avea ca rezultat o frecvență ADC de 125 Khz. Prescalarea este setată de biții ADPS din registrul ADCSRA. Conform fișei tehnice, toți cei trei biți ADPS2: 0 trebuie să fie setați la 011 pentru a obține 8 prescaler.

Cod: ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Apoi, să setăm tensiunea de referință ADC. Aceasta este controlată de biții REFS din registrul ADMUX. Următorul setează tensiunea de referință la AVCC.

Cod: ADMUX | = (1 << REFS0);

Pentru a seta canalul trecut prin multiplexor la ADC, biții MUX din registrul ADMUX trebuie să fie setați corespunzător. Deoarece folosim ADC5 aici

Cod: ADMUX & = 0xF0; ADMUX | = 5;

Pentru a pune ADC în modul de rulare liberă, setați bitul ADFR numit în mod corespunzător în registrul ADCSRA:

Cod: ADCSRA | = (1 << ADFR);

O ultimă modificare a setărilor va fi făcută pentru a simplifica citirea valorii ADC. Deși ADC are o rezoluție de 10 biți, multe informații nu sunt deseori necesare. Această valoare de 10 biți este împărțită în două registre de 8 biți, ADCH și ADCL. În mod implicit, cei mai mici 8 biți ai valorii ADC se găsesc în ADCL, cei doi superiori fiind cei mai mici biți ADCH. Prin setarea bitului ADLAR în registrul ADMUX, putem alinia la stânga valoarea ADC. Aceasta plasează cei mai mari 8 biți de măsurare în registrul ADCH, iar restul în registrul ADCL. Dacă citim apoi registrul ADCH, obținem o valoare de 8 biți care reprezintă măsurarea de la 0 la 5 volți ca număr de la 0 la 255. Practic, transformăm măsurarea ADC de 10 biți într-una de 8 biți. Iată codul pentru a seta bitul ADLAR:

Cod:

ADMUX | = (1 << ADLAR); Aceasta finalizează configurarea hardware-ului ADC pentru acest exemplu. Trebuie setate încă două biți înainte ca ADC să înceapă să facă măsurători.

Pasul 11: Activați ADC

Pentru a activa ADC, setați bitul ADEN în ADCSRA:

Cod: ADCSRA | = (1 << ADEN);

Pasul 12: Porniți conversiile analogice la digitale

Pentru a începe măsurătorile ADC, bitul ADSC din ADCSRA trebuie setat:

Cod: ADCSRA | = (1 << ADSC);

În acest moment, ADC ar începe să probeze continuu tensiunea prezentată pe ADC5. Codul până în acest punct ar arăta astfel:

Pasul 13: WHILE Forever

Singurul lucru rămas de făcut este să testați valoarea ADC și să setați LED-urile să afișeze o indicație înaltă / scăzută. Deoarece citirea ADC în ADCH are o valoare maximă de 255, a fost aleasă o valoare de test pentru a determina dacă tensiunea a fost ridicată sau scăzută. O declarație simplă IF / ELSE din buclele FOR ne va permite să aprindem LED-ul corect:

Cod

dacă (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Porniți LED-ul

}

altceva

{

PORTB & = ~ (1 << PB0); // Opriți LED-ul

}

Pasul 14: la sfârșit Codul complet este

Cod:

#include

int main (nul)

{

uint8_t ADCValue = 128;

DDRB | = (1 << PB0); // Setați LED1 ca ieșire

ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Setați ADC prescalar la 8 - // 125KHz rata de eșantionare 1MHz

ADMUX | = (1 << REFS0); // Setați referința ADC la AVCC

ADMUX | = (1 << ADLAR); // Stânga reglați rezultatul ADC pentru a permite citirea ușoară pe 8 biți

ADMUX & = 0xF0;

ADMUX | = 5; // Valorile MUX trebuiau modificate pentru a utiliza ADC0

ADCSRA | = (1 << ADFR); // Setați ADC în modul Free-Running

ADCSRA | = (1 << ADEN); // Activați ADC

ADCSRA | = (1 << ADSC); // Începeți conversiile A2D în timp ce (1) // Buclați pentru totdeauna

{

dacă (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Porniți LED1

}

altceva

{

PORTE & = ~ (1 << PB1); // Opriți LED1

}

}

retur 0;

}

Mai întâi publicați acest tutorial Faceți clic aici

Recomandat: