Innholdsfortegnelse:

Introduksjon til ADC i AVR -mikrokontroller - for nybegynnere: 14 trinn
Introduksjon til ADC i AVR -mikrokontroller - for nybegynnere: 14 trinn

Video: Introduksjon til ADC i AVR -mikrokontroller - for nybegynnere: 14 trinn

Video: Introduksjon til ADC i AVR -mikrokontroller - for nybegynnere: 14 trinn
Video: Аналогово-цифрофой преобразователь АЦП | Программирование микроконтроллеров AVR 2024, November
Anonim
Introduksjon til ADC i AVR -mikrokontroller | for nybegynnere
Introduksjon til ADC i AVR -mikrokontroller | for nybegynnere

I denne opplæringen vil du vite alt ADC i avr mikrokontroller

Trinn 1: Hva er en ADC?

En ADC, eller Analog to Digital Converter, lar en konvertere en analog spenning til en digital verdi som kan brukes av en mikrokontroller. Det er mange kilder til analoge signaler som man kanskje vil måle. Det er analoge sensorer tilgjengelig som måler temperatur, lysintensitet, avstand, posisjon og kraft, for bare å nevne noen.

Trinn 2: Hvordan fungerer ADC i AVR-mikrokontroller

AVR ADC lar AVR -mikrokontrolleren konvertere analoge spenninger til digitale verdier med få eller ingen eksterne deler. ATmega8 har en 10-biters påfølgende tilnærming ADC. ATmega8 har 7 kanals ADC på PortC. ADC har en egen analog forsyningsspenning, AVCC. AVCC må ikke avvike mer enn ± 0,3V fra VCC.. Spenningsreferansen kan kobles eksternt fra AREF -pinnen. AVCC brukes som spenningsreferanse. ADC kan også settes til å kjøre kontinuerlig (friløpsmodus) eller til bare å gjøre én konvertering.

Trinn 3: ADC -konverteringsformel

ADC -konverteringsformel
ADC -konverteringsformel

Hvor Vin er spenningen på den valgte inngangspinnen og Vref den valgte spenningsreferansen

Trinn 4: Hvordan konfigurere ADC i ATmega8?

Hvordan konfigurere ADC i ATmega8?
Hvordan konfigurere ADC i ATmega8?

Følgende registre brukes for implementering av ADC i ATmega8

ADC Multiplexer -valg

Trinn 5: ADLAR -utvalg

ADLAR -valg
ADLAR -valg
ADLAR -valg
ADLAR -valg

ADC venstre justere resultat ADLAR -biten påvirker presentasjonen av ADC -konverteringsresultatet i ADC -dataregisteret. Skriv en til ADLAR for å justere resultatet til venstre. Ellers er resultatet riktig justert

Når en ADC -konvertering er fullført, blir resultatet funnet i ADCH og ADCL Når ADCL leses, oppdateres ikke ADC -dataregisteret før ADCH er lest. Følgelig, hvis resultatet blir justert og det ikke kreves mer enn 8-bits presisjon, er det tilstrekkelig å lese ADCH. Ellers må ADCL leses først, deretter ADCH. Analog Channel Selection Bits Verdien av disse bitene velger hvilke analoge innganger som er koblet til ADC.

Trinn 6: ADCSRA -valg

ADCSRA -utvalg
ADCSRA -utvalg
ADCSRA -utvalg
ADCSRA -utvalg

• Bit 7 - ADEN: ADC Enable Skriving av denne biten til en aktiverer ADC. Ved å skrive det til null, blir ADC slått av

• Bit 6 - ADSC: ADC Start Conversion I Single Conversion -modus, skriv denne biten til en for å starte hver konvertering. I Free Running -modus skriver du denne biten til en for å starte den første konverteringen.

• Bit 5 - ADFR: ADC Free Running Velg Når denne biten er satt (en), fungerer ADC i Free Running -modus. I denne modusen prøver og oppdaterer ADC dataregistrene kontinuerlig. Hvis du sletter denne biten (null), avsluttes Free Running -modus.

• Bit 4 - ADIF: ADC Interrupt Flag Denne biten angis når en ADC -konvertering er fullført og dataregistrene oppdateres. ADC-konverteringen fullført avbrudd utføres hvis ADIE-biten og I-biten i SREG er angitt. ADIF slettes av maskinvare når den tilsvarende avbruddshåndteringsvektoren utføres. Alternativt blir ADIF slettet ved å skrive en logisk til flagget.

• Bit 3-ADIE: ADC Interrupt Enable Når denne biten skrives til en og I-biten i SREG er satt, blir ADC-konverteringen fullført avbrudd aktivert.

• Bits 2: 0 - ADPS2: 0: ADC Prescaler Select Bits I henhold til databladet må denne prescalaren settes slik at ADC -inngangsfrekvensen er mellom 50 KHz og 200 KHz. ADC -klokken er avledet fra systemklokken ved hjelp av ADPS2: 0 Disse bitene bestemmer delingsfaktoren mellom XTAL -frekvensen og inngangsklokken til ADC.

Trinn 7: Hvis du vil ta ADC -verdi, må du ha litt arbeid som er oppført nedenfor

  • Angi ADC -verdi
  • Konfigurer LED -utgang for utgang
  • Konfigurer ADC -maskinvare
  • Aktiver ADC
  • Start analog til digital konvertering
  • MENS FOR alltid

HVIS ADC -verdi høyere enn angitt verdi, Slå på LED ELLER Slå av LED

Trinn 8: Angi ADC -verdi

Kode: uint8_t ADCValue = 128;

Trinn 9: Konfigurer Output LED Pin

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

Trinn 10: Konfigurer ADC -maskinvare

Konfigurer ADC -maskinvare

Dette gjøres gjennom å sette biter i kontrollregistrene for ADC. La oss først sette prescalaren for ADC. I henhold til databladet må denne prescalaren settes slik at ADC -inngangsfrekvensen er mellom 50 KHz og 200 KHz. ADC -klokken er avledet fra systemklokken. Med en systemfrekvens på 1 MHz vil en forhåndsskaler på 8 resultere i en ADC -frekvens på 125 kHz. Forskalingen settes av ADPS -bitene i ADCSRA -registeret. I henhold til databladet må alle tre ADPS2: 0 -bitene settes til 011 for å få den 8 forhåndskalkulatoren.

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

La oss deretter sette ADC -referansespenningen. Dette styres av REFS -bitene i ADMUX -registeret. Følgende setter referansespenningen til AVCC.

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

For å sette kanalen som sendes gjennom multiplexeren til ADC, må MUX -bitene i ADMUX -registeret stilles inn tilsvarende. Siden vi bruker ADC5 her

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

For å sette ADC i friløpsmodus, sett den passende ADFR-biten i ADCSRA-registeret:

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

En siste innstilling endres for å gjøre det enklere å lese ADC -verdien. Selv om ADC har en oppløsning på 10 bits, er denne mye informasjonen ofte ikke nødvendig. Denne 10 -bitersverdien er delt over to 8 -biters registre, ADCH og ADCL. Som standard finnes de laveste 8 bitene av ADC -verdien i ADCL, med de to øverste som de to laveste bitene i ADCH. Ved å sette ADLAR -biten i ADMUX -registeret, kan vi venstrejustere ADC -verdien. Dette setter de høyeste 8 bitene av målingen i ADCH -registeret, med resten i ADCL -registeret. Hvis vi deretter leser ADCH -registret, får vi en 8 -bits verdi som representerer vår 0 til 5 volt måling som et tall fra 0 til 255. Vi gjør i utgangspunktet vår 10 -biters ADC -måling til en 8 -bits. Her er koden for å sette ADLAR -biten:

Kode:

ADMUX | = (1 << ADLAR); Det fullfører oppsettet av ADC -maskinvaren for dette eksemplet. Ytterligere to biter må settes før ADC begynner å ta målinger.

Trinn 11: Aktiver ADC

For å aktivere ADC, sett ADEN -biten i ADCSRA:

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

Trinn 12: Start analog til digital konvertering

For å starte ADC -målingene må ADSC -biten i ADCSRA settes:

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

På dette tidspunktet ville ADC begynne å kontinuerlig sampler spenningen som presenteres på ADC5. Koden til dette punktet vil se slik ut:

Trinn 13: WHILE Forever

Det eneste du trenger å gjøre er å teste ADC -verdien og sette lysdiodene til å vise en høy / lav indikasjon. Siden ADC -avlesningen i ADCH har en maksimalverdi på 255, ble en testverdi på th valgt for å avgjøre om spenningen var høy eller lav. En enkel IF/ELSE -setning i FOR -løkkene vil tillate oss å slå på riktig LED:

Kode

hvis (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Slå på LED

}

ellers

{

PORTB & = ~ (1 << PB0); // Slå av LED

}

Trinn 14: På slutten Komplett kode er

Kode:

#inkludere

int main (ugyldig)

{

uint8_t ADCValue = 128;

DDRB | = (1 << PB0); // Still LED1 som utgang

ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Sett ADC prescalar til 8 - // 125KHz samplingsfrekvens 1MHz

ADMUX | = (1 << REFS0); // Sett ADC -referanse til AVCC

ADMUX | = (1 << ADLAR); // Venstre juster ADC -resultat for å tillate enkel 8 -bits lesing

ADMUX & = 0xF0;

ADMUX | = 5; // MUX -verdier måtte endres for å bruke ADC0

ADCSRA | = (1 << ADFR); // Sett ADC til Free-Running Mode

ADCSRA | = (1 << ADEN); // Aktiver ADC

ADCSRA | = (1 << ADSC); // Start A2D -konverteringer mens (1) // Loop Forever

{

hvis (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Slå på LED1

}

ellers

{

PORTE & = ~ (1 << PB1); // Slå av LED1

}

}

retur 0;

}

Publiser først denne opplæringen Klikk her

Anbefalt: