- Hvad er ADC (analog til digital konvertering)
- ADC i AVR Microcontroller Atmega16
- Komponenter, der kræves
- Kredsløbsdiagram
- Opsætning af ADC-kontrolregistre i Atmega16
- Programmering af Atmega16 til ADC
Et almindeligt træk, der bruges i næsten alle indlejrede applikationer, er ADC-modulet (Analog til Digital Converter). Disse analoge til digitale konvertere kan aflæse spænding fra analoge sensorer som temperaturføler, vippesensor, strømføler, fleksføler osv. I denne vejledning lærer vi, hvad der er ADC, og hvordan man bruger ADC i Atmega16. Denne tutorial inkluderer tilslutning af et lille potentiometer til ADC-stiften på Atmega16, og 8 LED'er bruges til at vise den skiftende spænding på ADC-udgangsværdien med hensyn til ændring i ADC-indgangsværdien.
Tidligere forklarede vi ADC i andre mikrocontrollere:
- Sådan bruges ADC i ARM7 LPC2148 - Måling af analog spænding
- Sådan bruges ADC i STM32F103C8 - Måling af analog spænding
- Sådan bruges ADC i MSP430G2 - Måling af analog spænding
- Hvordan bruges ADC i Arduino Uno?
- Brug af ADC-modul fra PIC Microcontroller med MPLAB og XC8
Hvad er ADC (analog til digital konvertering)
ADC står for Analog til Digital Converter. I elektronik er en ADC en enhed, der konverterer et analogt signal som strøm og spænding til digital kode (binær form). I den virkelige verden er de fleste af signalerne analoge, og enhver mikrokontroller eller mikroprocessor forstår det binære eller digitale sprog (0 eller 1). Så for at få mikrocontrollere til at forstå de analoge signaler, er vi nødt til at konvertere disse analoge signaler til digital form. ADC gør det nøjagtigt for os. Der er mange typer ADC til forskellige applikationer. Få populære ADC'er er flash, successiv tilnærmelse og sigma-delta.
Den billigste type ADC er successiv-tilnærmelse, og i denne vejledning vil ADC efterfølgende tilnærmelse blive brugt. I en successiv tilnærmelsesform for ADC genereres en række digitale koder, der hver svarer til et fast analogt niveau, successivt. En intern tæller bruges til at sammenligne med det analoge signal under konvertering. Generationen stoppes, når det analoge niveau bliver lige større end det analoge signal. Den digitale kode svarer til det analoge niveau er den ønskede digitale repræsentation af det analoge signal. Dette afslutter vores lille forklaring på successiv tilnærmelse.
Hvis du vil udforske ADC meget dybt, kan du henvise til vores tidligere tutorial om ADC. ADC'er fås i form af IC'er, og også mikrocontrollere leveres med indbygget ADC i dag. I denne vejledning bruger vi indbygget ADC af Atmega16. Lad os diskutere om den indbyggede ADC i Atmega16.
ADC i AVR Microcontroller Atmega16
Atmega16 har en indbygget 10 bit og 8-kanals ADC. 10 bit svarer til, at hvis indgangsspændingen er 0-5V, vil den blive delt i 10 bit-værdi, dvs. 1024 niveauer af diskrete analoge værdier (2 10 = 1024). Nu svarer 8-kanal til de dedikerede 8 ADC-pins på Atmega16, hvor hver pin kan læse den analoge spænding. Komplet PortA (GPIO33-GPIO40) er dedikeret til ADC-drift. Som standard er PORTA-stifter generelle IO-stifter, det betyder, at portstifterne er multipleksede. For at bruge disse ben som ADC-ben skal vi konfigurere bestemte registre dedikeret til ADC-kontrol. Dette er grunden til, at registre er kendt som ADC-kontrolregistre. Lad os diskutere, hvordan vi opretter disse registre for at begynde at fungere med den indbyggede ADC.
ADC Pins i Atmega16
Komponenter, der kræves
- Atmega16 Microcontroller IC
- 16Mhz krystaloscillator
- To 100nF kondensatorer
- To 22pF kondensatorer
- Trykknap
- Jumper Wires
- Brødbræt
- USBASP v2.0
- Led (enhver farve)
Kredsløbsdiagram
Opsætning af ADC-kontrolregistre i Atmega16
1. ADMUX-register (ADC Multiplexer Selection Register) :
ADMUX-registeret er til valg af ADC-kanal og valg af referencespænding. Billedet nedenfor viser oversigten over ADMUX-registret. Beskrivelsen forklares nedenfor.
- Bit 0-4: kanalvalgbit.
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: Det bruges til at justere resultatet til højre eller venstre.
ADLAR |
Beskrivelse |
0 |
Højre justere resultatet |
1 |
Venstre justerer resultatet |
- Bit 6-7: De bruges til at vælge referencespændingen til ADC.
REFS1 |
REFS0 |
Valg af spændingsreference |
0 |
0 |
AREF, intern Vref slukket |
0 |
1 |
AVcc med ekstern kondensator ved AREF-pin |
1 |
0 |
Reserveret |
1 |
1 |
Intern 2,56 spændingsreference med ekstern kondensator ved AREF-pin |
Start nu med at konfigurere disse registerbits i programmet, så vi får intern ADC-læsning og output til alle pins i PORTC.
Programmering af Atmega16 til ADC
Komplet program er angivet nedenfor. Brænd programmet i Atmega16 ved hjælp af JTAG og Atmel studio, og drej potentiometeret for at variere ADC-værdien. Her forklares koden linje for linje.
Start med at lave en funktion til at læse ADC konverteret værdi. Send derefter kanalværdien som 'chnl' i ADC_read- funktionen.
usigneret int ADC_read (usigneret char chnl)
Kanalværdier skal være mellem 0 og 7, da vi kun har 8 ADC-kanaler.
chnl = chnl & 0b00000111;
Ved at skrive '40' dvs. '01000000' til ADMUX-registeret valgte vi PORTA0 som ADC0, hvor den analoge indgang tilsluttes til digital konvertering.
ADMUX = 0x40;
Nu involverer dette trin ADC-konverteringsproces, hvor vi ved at skrive ONE til ADSC Bit i ADCSRA-registret starter konvertering. Derefter skal du vente på, at ADIF-bit returnerer værdi, når konverteringen er afsluttet. Vi stopper konvertering ved at skrive '1' på ADIF Bit i ADCSRA-registret. Når konverteringen er afsluttet, returneres derefter ADC-værdien.
ADCSRA - = (1 <
Her vælges den interne ADC-reference spænding ved at indstille REFS0 bit. Derefter aktiverer ADC og vælger prescaler som 128.
ADMUX = (1 <
Gem nu ADC-værdien og send den til PORTC. I PORTC er der tilsluttet 8 lysdioder, som viser det digitale output i 8 bit-format. Eksemplet, vi har vist, varierer spændingen mellem 0V og 5V ved hjælp af en 1K pot.
i = ADC_read (0); PORTC = i;
Digitalt multimeter bruges til at vise analog indgangsspænding i ADC Pin og 8 LED'er bruges til at vise tilsvarende 8 Bit værdi af ADC output. Drej bare potentiometeret og se det tilsvarende resultat på multimeter såvel som på glødende lysdioder.
Komplet kode og arbejdsvideo er angivet nedenfor.