- Hva er ADC (analog til digital konvertering)
- ADC i AVR Microcontroller Atmega16
- Komponenter kreves
- Kretsdiagram
- Sette opp ADC-kontrollregistre i Atmega16
- Programmering Atmega16 for ADC
En vanlig funksjon som brukes i nesten alle innebygde applikasjoner er ADC-modulen (Analog til Digital Converter). Disse analoge til digitale omformerne kan lese spenning fra analoge sensorer som temperaturføler, vippesensor, strømføler, fleksføler etc. I denne opplæringen vil vi lære hva som er ADC og hvordan du bruker ADC i Atmega16. Denne opplæringen inkluderer å koble et lite potensiometer til ADC-pinnen på Atmega16 og 8 LED-er brukes til å vise den skiftende spenningen på ADC-utgangsverdien med hensyn til endring i ADC-inngangsverdien.
Tidligere forklarte vi ADC i andre mikrokontrollere:
- Hvordan bruke ADC i ARM7 LPC2148 - Måling av analog spenning
- Hvordan bruke ADC i STM32F103C8 - Måling av analog spenning
- Hvordan bruke ADC i MSP430G2 - Måling av analog spenning
- Hvordan bruke ADC i Arduino Uno?
- Bruker ADC-modul fra PIC-mikrokontroller med MPLAB og XC8
Hva er ADC (analog til digital konvertering)
ADC står for Analog to Digital Converter. I elektronikk er en ADC en enhet som konverterer et analogt signal som strøm og spenning til digital kode (binær form). I den virkelige verden er de fleste signalene analoge, og enhver mikrokontroller eller mikroprosessor forstår det binære eller digitale språket (0 eller 1). Så for å få mikrokontrollere til å forstå de analoge signalene, må vi konvertere disse analoge signalene til digital form. ADC gjør akkurat dette for oss. Det er mange typer ADC tilgjengelig for forskjellige applikasjoner. Få populære ADC-er er flash, suksessiv tilnærming og sigma-delta.
Den rimeligste typen ADC er suksessiv tilnærming, og i denne opplæringen suksessiv tilnærming ADC vil bli brukt. I en suksess-tilnærmingstype av ADC, genereres en serie digitale koder, hver tilsvarer et fast analogt nivå, suksessivt. En intern teller brukes til å sammenligne med det analoge signalet under konvertering. Generasjonen stoppes når det analoge nivået blir bare større enn det analoge signalet. Den digitale koden tilsvarer det analoge nivået er den ønskede digitale representasjonen av det analoge signalet. Dette avslutter vår lille forklaring på suksessiv tilnærming.
Hvis du vil utforske ADC mye dypt, kan du henvise til vår forrige opplæring om ADC. ADC er tilgjengelig i form av IC, og også mikrokontrollere leveres med innebygd ADC i dag. I denne opplæringen vil vi bruke innebygd ADC av Atmega16. La oss diskutere om den innebygde ADC av Atmega16.
ADC i AVR Microcontroller Atmega16
Atmega16 har en innebygd 10-biters og 8-kanals ADC. 10 bit tilsvarer at hvis inngangsspenningen er 0-5V, vil den bli delt i 10 bit verdi, dvs. 1024 nivåer av diskrete analoge verdier (2 10 = 1024). Nå tilsvarer 8-kanal de dedikerte 8 ADC-pinnene på Atmega16 der hver pinne kan lese den analoge spenningen. Komplett PortA (GPIO33-GPIO40) er dedikert for ADC-drift. Som standard er PORTA-pinnene generelle IO-pinner, det betyr at portpinnene er multipleksede. For å kunne bruke disse pinnene som ADC-pinner, må vi konfigurere visse registre dedikert til ADC-kontroll. Dette er grunnen til at registrene er kjent som ADC-kontrollregistre. La oss diskutere hvordan du setter opp disse registerene for å begynne å fungere med den innebygde ADC.
ADC Pins i Atmega16
Komponenter kreves
- Atmega16 Microcontroller IC
- 16Mhz krystalloscillator
- To kondensatorer på 100nF
- To 22pF kondensatorer
- Trykknapp
- Jumper Wires
- Brettbrett
- USBASP v2.0
- Led (hvilken som helst farge)
Kretsdiagram
Sette opp ADC-kontrollregistre i Atmega16
1. ADMUX-register (ADC Multiplexer Selection Register) :
ADMUX-registeret er for valg av ADC-kanal og valg av referansespenning. Bildet nedenfor viser oversikten over ADMUX-registeret. Beskrivelsen er forklart nedenfor.
- Bit 0-4: kanalvalgbiter.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADC-kanal valgt |
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: Den brukes til å justere resultatet til høyre eller venstre.
ADLAR |
Beskrivelse |
0 |
Høyre juster resultatet |
1 |
Venstre justere resultatet |
- Bit 6-7: De brukes til å velge referansespenning for ADC.
REFS1 |
REFS0 |
Valg av spenningsreferanse |
0 |
0 |
AREF, intern Vref slått av |
0 |
1 |
AVcc med ekstern kondensator ved AREF-pin |
1 |
0 |
Reservert |
1 |
1 |
Intern 2.56 spenningsreferanse med ekstern kondensator ved AREF-pinne |
Begynn nå å konfigurere disse registerbitene i programmet slik at vi får intern ADC-lesing og utgang til All Pins of PORTC.
Programmering Atmega16 for ADC
Fullstendig program er gitt nedenfor. Brenn programmet i Atmega16 ved hjelp av JTAG og Atmel studio og roter potensiometeret for å variere ADC-verdien. Her forklares koden linje for linje.
Begynn med å lage en funksjon for å lese ADC-konvertert verdi. Send deretter kanalverdien som 'chnl' i ADC_read- funksjonen.
usignert int ADC_read (usignert char chnl)
Kanalverdiene må være mellom 0 og 7 da vi bare har 8 ADC-kanaler.
chnl = chnl & 0b00000111;
Ved å skrive '40' dvs. '01000000' til ADMUX-registeret valgte vi PORTA0 som ADC0 hvor den analoge inngangen vil bli koblet til digital konvertering.
ADMUX = 0x40;
Nå involverer dette trinnet ADC-konverteringsprosessen, der vi ved å skrive ONE til ADSC Bit i ADCSRA-registeret starter konvertering. Etter det, vent på at ADIF-biten returnerer verdien når konverteringen er fullført. Vi stopper konvertering ved å skrive '1' på ADIF Bit i ADCSRA-registeret. Når konverteringen er fullført, returner du deretter ADC-verdien.
ADCSRA - = (1 <
Her velges den interne ADC-referansespenningen ved å stille inn REFS0 bit. Aktiver deretter ADC og velg prescaler som 128.
ADMUX = (1 <
Lagre nå ADC-verdien og send den til PORTC. I PORTC er 8 lysdioder koblet til som viser den digitale utgangen i 8-bits format. Eksemplet vi har vist varierer spenningen mellom 0V og 5V ved hjelp av en 1K-pott.
i = ADC_read (0); PORTC = i;
Digital multimeter brukes til å vise analog inngangsspenning i ADC Pin og 8 LED-er brukes til å vise tilsvarende 8 Bit verdi av ADC-utgang. Bare roter potensiometeret og se det tilsvarende resultatet på multimeter så vel som på glødende lysdioder.
Fullstendig kode og arbeidsvideo er gitt nedenfor.