Innehållsförteckning:

Introduktion till ADC i AVR Microcontroller - för nybörjare: 14 steg
Introduktion till ADC i AVR Microcontroller - för nybörjare: 14 steg

Video: Introduktion till ADC i AVR Microcontroller - för nybörjare: 14 steg

Video: Introduktion till ADC i AVR Microcontroller - för nybörjare: 14 steg
Video: LDmicro 1: Introduction (Microcontroller PLC Ladder Logic Programming with LDmicro) 2024, Juli
Anonim
Introduktion till ADC i AVR Microcontroller | för nybörjare
Introduktion till ADC i AVR Microcontroller | för nybörjare

I denna handledning kommer du att veta allt ADC i avr -mikrokontroller

Steg 1: Vad är en ADC?

En ADC, eller Analog to Digital Converter, tillåter en att konvertera en analog spänning till ett digitalt värde som kan användas av en mikrokontroller. Det finns många källor till analoga signaler som man kanske vill mäta. Det finns analoga sensorer som mäter temperatur, ljusintensitet, avstånd, position och kraft, för att bara nämna några.

Steg 2: Hur fungerar ADC i AVR-Microcontroller

AVR ADC tillåter AVR -mikrokontrollern att konvertera analoga spänningar till digitala värden med få eller inga externa delar. ATmega8 har en 10-bitars successiv approximation ADC. ATmega8 har 7 kanals ADC vid PortC. ADC: n har en separat analog matningsspänning, AVCC. AVCC får inte skilja sig mer än ± 0,3V från VCC. Spänningsreferensen kan kopplas externt från AREF -stiftet. AVCC används som spänningsreferens. ADC: n kan också ställas in för att köras kontinuerligt (frilöpningsläget) eller att endast göra en konvertering.

Steg 3: ADC -konverteringsformel

ADC -konverteringsformel
ADC -konverteringsformel

Där Vin är spänningen på den valda ingångsstiftet och Vref den valda spänningsreferensen

Steg 4: Hur konfigurerar jag ADC i ATmega8?

Hur konfigurerar jag ADC i ATmega8?
Hur konfigurerar jag ADC i ATmega8?

Följande register används för implementering av ADC i ATmega8

Val av ADC -multiplexer

Steg 5: ADLAR -urval

ADLAR -urval
ADLAR -urval
ADLAR -urval
ADLAR -urval

ADC vänsterjustera resultat ADLAR -biten påverkar presentationen av ADC -konverteringsresultatet i ADC -dataregistret. Skriv en till ADLAR till vänster justera resultatet. Annars är resultatet rättjusterat

När en ADC -konvertering är klar hittas resultatet i ADCH och ADCL När ADCL läses uppdateras inte ADC -dataregistret förrän ADCH läses. Följaktligen, om resultatet lämnas justerat och inte mer än 8-bitars precision krävs, är det tillräckligt att läsa ADCH. Annars måste ADCL läsas först, sedan ADCH. Analoga kanalvalsbitar Värdet på dessa bitar väljer vilka analoga ingångar som är anslutna till ADC.

Steg 6: Urval av ADCSRA

ADCSRA Urval
ADCSRA Urval
ADCSRA Urval
ADCSRA Urval

• Bit 7 - ADEN: ADC Aktivera Att skriva denna bit till en aktiverar ADC. Genom att skriva det till noll stängs ADC av

• Bit 6 - ADSC: ADC Start Conversion I Single Conversion mode, skriv denna bit till en för att starta varje konvertering. I Free Running -läge, skriv den här biten till en för att starta den första konverteringen.

• Bit 5 - ADFR: ADC Free Running Select När denna bit är inställd (en) fungerar ADC i Free Running -läge. I det här läget samlar och uppdaterar ADC dataregistren kontinuerligt. Om du rensar denna bit (noll) avslutas Free Running -läget.

• Bit 4 - ADIF: ADC Interrupt Flag Denna bit ställs in när en ADC -konvertering är klar och dataregistren uppdateras. ADC-konverteringens fullständiga avbrott körs om ADIE-biten och I-biten i SREG är inställda. ADIF rensas av hårdvara när motsvarande avbrottshanteringsvektor körs. Alternativt rensas ADIF genom att skriva en logisk till flaggan.

• Bit 3-ADIE: ADC Interrupt Enable När denna bit skrivs till en och I-bit i SREG är inställd, aktiveras ADC Conversion Complete Interrupt.

• Bit 2: 0 - ADPS2: 0: ADC Prescaler Välj bitar Enligt databladet måste denna prescalar ställas in så att ADC -ingångsfrekvensen ligger mellan 50 KHz och 200 KHz. ADC -klockan härleds från systemklockan med hjälp av ADPS2: 0 Dessa bitar bestämmer delningsfaktorn mellan XTAL -frekvensen och ingångsklockan till ADC.

Steg 7: Om du vill ta ADC -värde måste du ha lite arbete gjort som anges nedan

  • Ställ in ADC -värde
  • Konfigurera utgångs -LED -stift
  • Konfigurera ADC -maskinvara
  • Aktivera ADC
  • Starta analoga till digitala omvandlingar
  • WILE Forever

OM ADC -värde högre än inställt värde, Slå på LED ELSE Stäng av LED

Steg 8: Ange ADC -värde

Kod: uint8_t ADCValue = 128;

Steg 9: Konfigurera Output LED Pin

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

Steg 10: Konfigurera ADC -maskinvara

Konfigurera ADC -maskinvara

Detta görs genom att ställa in bitar i kontrollregistren för ADC. Låt oss först ställa in prescalaren för ADC. Enligt databladet måste denna prescalar ställas in så att ADC -ingångsfrekvensen ligger mellan 50 KHz och 200 KHz. ADC -klockan härleds från systemklockan. Med en systemfrekvens på 1 MHz resulterar en förkalkylator på 8 i en ADC -frekvens på 125 kHz. Förskalningen ställs in av ADPS -bitarna i ADCSRA -registret. Enligt databladet måste alla tre ADPS2: 0 -bitarna vara inställda på 011 för att få 8 -förkalkningsapparaten.

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

Låt oss sedan ställa in ADC -referensspänningen. Detta styrs av REFS -bitarna i ADMUX -registret. Följande anger referensspänningen till AVCC.

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

För att ställa in kanalen som passerar genom multiplexorn till ADC måste MUX -bitarna i ADMUX -registret ställas in i enlighet därmed. Eftersom vi använder ADC5 här

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

För att sätta ADC: n i frikörningsläge, ställ in den lämpliga ADFR-biten i ADCSRA-registret:

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

En sista inställningsändring kommer att göras för att göra läsning av ADC -värdet enklare. Även om ADC har en upplösning på 10 bitar, är denna mycket information ofta inte nödvändig. Detta 10 bitars värde är uppdelat på två 8 bitars register, ADCH och ADCL. Som standard finns de lägsta 8 bitarna av ADC -värdet i ADCL, där de två översta är de två lägsta bitarna i ADCH. Genom att ställa in ADLAR -biten i ADMUX -registret kan vi vänsterjustera ADC -värdet. Detta sätter de högsta 8 bitarna av mätningen i ADCH -registret, med resten i ADCL -registret. Om vi sedan läser ADCH -registret får vi ett 8 bitars värde som representerar vår 0 till 5 volt mätning som ett tal från 0 till 255. Vi gör i princip vår 10 bitars ADC -mätning till en 8 bitars. Här är koden för att ställa in ADLAR -biten:

Koda:

ADMUX | = (1 << ADLAR); Det slutför installationen av ADC -hårdvaran för detta exempel. Ytterligare två bitar måste ställas in innan ADC: n börjar ta mätningar.

Steg 11: Aktivera ADC

För att aktivera ADC, ställ in ADEN -biten i ADCSRA:

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

Steg 12: Starta analog till digital konvertering

För att starta ADC -mätningarna måste ADSC -biten i ADCSRA ställas in:

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

Vid denna tidpunkt skulle ADC börja kontinuerligt sampla spänningen som presenteras på ADC5. Koden till denna punkt skulle se ut så här:

Steg 13: WILE Forever

Det enda som återstår att göra är att testa ADC -värdet och ställa in lysdioderna för att visa en hög / låg indikation. Eftersom ADC -avläsningen i ADCH har ett maximivärde på 255 valdes ett testvärde på th för att avgöra om spänningen var hög eller låg. Ett enkelt IF/ELSE -uttalande i FOR -slingorna gör att vi kan slå på rätt LED:

Koda

om (ADCH> ADCValue)

{

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

}

annan

{

PORTB & = ~ (1 << PB0); // Stäng av lysdioden

}

Steg 14: I slutet Komplett kod är

Koda:

#omfatta

int main (void)

{

uint8_t ADCValue = 128;

DDRB | = (1 << PB0); // Ställ in LED1 som utgång

ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Ställ in ADC prescalar på 8 - // 125KHz samplingsfrekvens 1MHz

ADMUX | = (1 << REFS0); // Ställ in ADC -referens till AVCC

ADMUX | = (1 << ADLAR); // Vänsterjustera ADC -resultat för att möjliggöra enkel 8 -bitars avläsning

ADMUX & = 0xF0;

ADMUX | = 5; // MUX -värden måste ändras för att använda ADC0

ADCSRA | = (1 << ADFR); // Ställ in ADC på Free-Running Mode

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

ADCSRA | = (1 << ADSC); // Starta A2D -konverteringar medan (1) // Loop Forever

{

om (ADCH> ADCValue)

{

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

}

annan

{

PORTE & = ~ (1 << PB1); // Stäng av LED1

}

}

returnera 0;

}

Publicera först denna handledning Klicka här

Rekommenderad: