Indholdsfortegnelse:

Introduktion til ADC i AVR Microcontroller - for begyndere: 14 trin
Introduktion til ADC i AVR Microcontroller - for begyndere: 14 trin

Video: Introduktion til ADC i AVR Microcontroller - for begyndere: 14 trin

Video: Introduktion til ADC i AVR Microcontroller - for begyndere: 14 trin
Video: Microcontroller AVR Lesson 9 ADC analog to digital converter + LCD تحويل اشارة انالوج متغيرة لديجيتل 2024, November
Anonim
Introduktion til ADC i AVR Microcontroller | for begyndere
Introduktion til ADC i AVR Microcontroller | for begyndere

I denne vejledning vil du vide alt ADC i avr mikrokontroller

Trin 1: Hvad er en ADC?

En ADC eller Analog to Digital Converter tillader en at konvertere en analog spænding til en digital værdi, der kan bruges af en mikrokontroller. Der er mange kilder til analoge signaler, som man måske vil måle. Der findes analoge sensorer, der måler temperatur, lysintensitet, afstand, position og kraft, for blot at nævne nogle få.

Trin 2: Hvordan fungerer ADC i AVR-Microcontroller

AVR ADC tillader AVR -mikrokontrolleren at konvertere analoge spændinger til digitale værdier med få eller ingen eksterne dele. ATmega8 har en 10-bit successiv tilnærmelse ADC. ATmega8 har 7 kanals ADC på PortC. ADC har en separat analog forsyningsspændingsstift, AVCC. AVCC må ikke afvige mere end ± 0,3V fra VCC.. Spændingsreferencen kan frakobles eksternt ved AREF -stiften. AVCC bruges som spændingsreference. ADC'en kan også indstilles til at køre kontinuerligt (fritgående tilstand) eller kun udføre en konvertering.

Trin 3: ADC -konverteringsformel

ADC -konverteringsformel
ADC -konverteringsformel

Hvor Vin er spændingen på den valgte indgangsstift og Vref den valgte spændingsreference

Trin 4: Sådan konfigureres ADC i ATmega8?

Sådan konfigureres ADC i ATmega8?
Sådan konfigureres ADC i ATmega8?

Følgende registre bruges til implementering af ADC i ATmega8

Valg af ADC -multiplexer

Trin 5: ADLAR -valg

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

ADC Venstre Juster resultat ADLAR -bit påvirker præsentationen af ADC -konverteringsresultatet i ADC -dataregistret. Skriv en til ADLAR til venstre for at justere resultatet. Ellers er resultatet korrekt justeret

Når en ADC -konvertering er fuldført, findes resultatet i ADCH og ADCL Når ADCL læses, opdateres ADC -dataregistret ikke, før ADCH er læst. Hvis resultatet efterlades justeret, og der ikke kræves mere end 8-bit præcision, er det derfor tilstrækkeligt at aflæse ADCH. Ellers skal ADCL først læses, derefter ADCH. Analoge kanalvalgsværdier Værdien af disse bits vælger, hvilke analoge indgange der er forbundet til ADC.

Trin 6: Valg af ADCSRA

ADCSRA -valg
ADCSRA -valg
ADCSRA -valg
ADCSRA -valg

• Bit 7 - ADEN: ADC Aktivering Ved at skrive denne bit til én aktiveres ADC. Ved at skrive det til nul, deaktiveres ADC

• Bit 6 - ADSC: ADC Start Conversion I Single Conversion mode, skriv denne bit til en for at starte hver konvertering. I tilstanden Frit løb, skriv denne bit til en for at starte den første konvertering.

• Bit 5 - ADFR: ADC Free Running Vælg Når denne bit er indstillet (en), fungerer ADC i Free Running mode. I denne tilstand prøver og opdaterer ADC løbende dataregistrene. Sletning af denne bit (nul) vil afslutte gratis driftstilstand.

• Bit 4 - ADIF: ADC Interrupt Flag Denne bit indstilles, når en ADC -konvertering er fuldført, og dataregistrene opdateres. ADC-konverteringen fuldført afbrydelse udføres, hvis ADIE-bit og I-bit i SREG er indstillet. ADIF ryddes af hardware, når den tilsvarende afbrydelseshåndteringsvektor udføres. Alternativt ryddes ADIF ved at skrive en logisk til flaget.

• Bit 3-ADIE: ADC Interrupt Enable Når denne bit skrives til en og I-bit i SREG er indstillet, aktiveres ADC Conversion Complete Interrupt.

• Bits 2: 0 - ADPS2: 0: ADC Prescaler Vælg bits I henhold til databladet skal denne prækalar indstilles, så ADC -inputfrekvensen er mellem 50 KHz og 200 KHz. ADC -uret er afledt af systemuret ved hjælp af ADPS2: 0 Disse bits bestemmer divisionsfaktoren mellem XTAL -frekvensen og input -uret til ADC'en.

Trin 7: Hvis du vil tage ADC -værdi, skal du have noget arbejde udført, der er angivet nedenfor

  • Indstil ADC -værdi
  • Konfigurer output LED -pin
  • Konfigurer ADC -hardware
  • Aktiver ADC
  • Start analog til digital konvertering
  • MENS for altid

HVIS ADC -værdi højere end Indstil værdi, Tænd LED ELSE Sluk LED

Trin 8: Indstil ADC -værdi

Kode: uint8_t ADCValue = 128;

Trin 9: Konfigurer Output LED Pin

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

Trin 10: Konfigurer ADC -hardware

Konfigurer ADC -hardware

Dette gøres ved at indstille bits i kontrolregistrene for ADC. Lad os først indstille prescalaren for ADC. Ifølge databladet skal denne prækalar indstilles, så ADC -indgangsfrekvensen er mellem 50 KHz og 200 KHz. ADC -uret er afledt af systemuret. Med en systemfrekvens på 1MHz resulterer en forkalkaler på 8 i en ADC -frekvens på 125 Khz. Forskalingen indstilles af ADPS -bitene i ADCSRA -registret. Ifølge databladet skal alle tre ADPS2: 0 bits indstilles til 011 for at få den 8 forkalkningsmaskine.

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

Lad os derefter indstille ADC -referencespændingen. Dette styres af REFS -bitene i ADMUX -registret. Følgende sætter referencespændingen til AVCC.

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

For at indstille kanalen, der føres gennem multiplexeren til ADC, skal MUX -bitene i ADMUX -registret indstilles i overensstemmelse hermed. Da vi bruger ADC5 her

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

For at sætte ADC'en i fritgående tilstand skal du indstille den passende navngivne ADFR-bit i ADCSRA-registret:

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

En sidste ændring af indstillinger foretages for at gøre læsning af ADC -værdien lettere. Selvom ADC har en opløsning på 10 bit, er denne mange information ofte ikke nødvendig. Denne 10 bit værdi er delt på to 8 bit registre, ADCH og ADCL. Som standard findes de laveste 8 bit af ADC -værdien i ADCL, hvor de to øverste er de laveste to bits i ADCH. Ved at indstille ADLAR -bit i ADMUX -registret kan vi venstrejustere ADC -værdien. Dette placerer de højeste 8 bit af målingen i ADCH -registret, med resten i ADCL -registret. Hvis vi derefter læser ADCH -registret, får vi en 8 bit værdi, der repræsenterer vores 0 til 5 volt måling som et tal fra 0 til 255. Vi gør i bund og grund vores 10 bit ADC måling til en 8 bit en. Her er koden til at indstille ADLAR -bit:

Kode:

ADMUX | = (1 << ADLAR); Det fuldender opsætningen af ADC -hardware til dette eksempel. Yderligere to bits skal indstilles, før ADC'en begynder at tage målinger.

Trin 11: Aktiver ADC

For at aktivere ADC skal du indstille ADEN -bit i ADCSRA:

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

Trin 12: Start analog til digital konvertering

For at starte ADC -målingerne skal ADSC -bit i ADCSRA indstilles:

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

På dette tidspunkt ville ADC begynde løbende at sampler spændingen, der blev præsenteret på ADC5. Koden til dette punkt ville se sådan ud:

Trin 13: WHILE Forever

Det eneste, der er tilbage at gøre, er at teste ADC -værdien og indstille lysdioderne til at vise en høj / lav indikation. Da ADC -aflæsningen i ADCH har en maksimalværdi på 255, blev en testværdi på th valgt for at bestemme, om spændingen var høj eller lav. En simpel IF/ELSE -sætning i FOR -loops giver os mulighed for at tænde den korrekte LED:

Kode

hvis (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Tænd LED

}

andet

{

PORTB & = ~ (1 << PB0); // Sluk LED

}

Trin 14: I slutningen Komplet kode er

Kode:

#omfatte

int main (tomrum)

{

uint8_t ADCValue = 128;

DDRB | = (1 << PB0); // Indstil LED1 som output

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

ADMUX | = (1 << REFS0); // Indstil ADC -reference til AVCC

ADMUX | = (1 << ADLAR); // Venstre juster ADC -resultat for at tillade let 8 bit læsning

ADMUX & = 0xF0;

ADMUX | = 5; // MUX -værdier skulle ændres for at bruge ADC0

ADCSRA | = (1 << ADFR); // Indstil 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); // Tænd for LED1

}

andet

{

PORTE & = ~ (1 << PB1); // Sluk for LED1

}

}

returnere 0;

}

Udgiv først denne vejledning Klik her

Anbefalede: