- Wat is ADC (analoog naar digitaal conversie)
- ADC in AVR Microcontroller Atmega16
- Componenten vereist
- Schakelschema
- ADC-controleregisters instellen in Atmega16
- Atmega16 programmeren voor ADC
Een veelvoorkomend kenmerk dat in bijna elke embedded applicatie wordt gebruikt, is de ADC-module (Analog to Digital Converter). Deze analoog naar digitaal converters kunnen spanning lezen van analoge sensoren zoals temperatuursensor, tilt sensor, stroomsensor, flex sensor etc. In deze tutorial zullen we leren wat ADC is en hoe je ADC gebruikt in Atmega16. Deze tutorial omvat het aansluiten van een kleine potentiometer op de ADC-pin van Atmega16 en 8 LED's worden gebruikt om de veranderende spanning van de ADC-uitvoerwaarde weer te geven met betrekking tot de verandering in de ADC-invoerwaarde.
Eerder hebben we ADC uitgelegd in andere microcontrollers:
- ADC gebruiken in ARM7 LPC2148 - Analoge spanning meten
- Hoe ADC te gebruiken in STM32F103C8 - Analoge spanning meten
- Hoe ADC te gebruiken in MSP430G2 - Analoge spanning meten
- Hoe ADC te gebruiken in Arduino Uno?
- Met behulp van ADC-module van PIC-microcontroller met MPLAB en XC8
Wat is ADC (analoog naar digitaal conversie)
ADC staat voor Analog to Digital Converter. In de elektronica is een ADC een apparaat dat een analoog signaal, zoals stroom en spanning, omzet in digitale code (binaire vorm). In de echte wereld zijn de meeste signalen analoog en elke microcontroller of microprocessor begrijpt de binaire of digitale taal (0 of 1). Dus om microcontrollers de analoge signalen te laten begrijpen, moeten we deze analoge signalen in digitale vorm omzetten. ADC doet dit precies voor ons. Er zijn veel soorten ADC beschikbaar voor verschillende toepassingen. Weinig populaire ADC's zijn flash, opeenvolgende benadering en sigma-delta.
Het meest goedkope type ADC is Opeenvolgende benadering en in deze tutorial wordt Opeenvolgende benadering ADC gebruikt. In een ADC van het type met opeenvolgende benaderingen wordt achtereenvolgens een reeks digitale codes gegenereerd, die elk overeenkomen met een vast analoog niveau. Een interne teller wordt gebruikt om te vergelijken met het analoge signaal dat wordt geconverteerd. Het genereren wordt gestopt wanneer het analoge niveau net groter wordt dan het analoge signaal. De digitale code komt overeen met het analoge niveau en is de gewenste digitale weergave van het analoge signaal. Hiermee is onze kleine uitleg over opeenvolgende benaderingen voltooid.
Als je de ADC diepgaand wilt verkennen, kun je onze vorige tutorial over ADC raadplegen. ADC's zijn beschikbaar in de vorm van IC's en ook microcontrollers worden tegenwoordig geleverd met ingebouwde ADC. In deze tutorial gebruiken we de ingebouwde ADC van Atmega16. Laten we het hebben over de ingebouwde ADC van Atmega16.
ADC in AVR Microcontroller Atmega16
Atmega16 heeft een ingebouwde 10 bit en 8-kanaals ADC. 10 bit komt overeen met dat als de ingangsspanning 0-5 V is, dan wordt het opgesplitst in 10 bit waarde, dwz 1024 niveaus van discrete analoge waarden (2 10 = 1024). Nu komt 8-kanaals overeen met de speciale 8 ADC-pinnen op Atmega16, waar elke pin de analoge spanning kan lezen. Volledige PortA (GPIO33-GPIO40) is speciaal bedoeld voor ADC-bediening. Standaard zijn de PORTA-pinnen algemene IO-pinnen, dit betekent dat de poortpinnen gemultiplexed zijn. Om deze pinnen als ADC-pinnen te gebruiken, moeten we bepaalde registers configureren die zijn bedoeld voor ADC-besturing. Daarom staan de registers bekend als ADC-controleregisters. Laten we bespreken hoe u deze registers instelt om de ingebouwde ADC te laten functioneren.
ADC-pinnen in Atmega16
Componenten vereist
- Atmega16 Microcontroller IC
- 16Mhz kristaloscillator
- Twee 100nF condensatoren
- Twee 22pF condensatoren
- Druk op de knop
- Doorverbindingsdraden
- Breadboard
- USBASP v2.0
- Led (elke kleur)
Schakelschema
ADC-controleregisters instellen in Atmega16
1. ADMUX Register (ADC Multiplexer Selection Register) :
Het ADMUX-register is voor het selecteren van het ADC-kanaal en het selecteren van referentiespanning. De onderstaande afbeelding toont het overzicht van het ADMUX-register. De beschrijving wordt hieronder toegelicht.
- Bit 0-4: kanaalselectiebits.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADC-kanaal geselecteerd |
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: Het wordt gebruikt om het resultaat naar rechts of links aan te passen.
ADLAR |
Omschrijving |
0 |
Pas het resultaat juist aan |
1 |
Pas links het resultaat aan |
- Bit 6-7: Ze worden gebruikt om de referentiespanning voor ADC te selecteren.
REFS1 |
REFS0 |
Selectie spanningsreferentie |
0 |
0 |
AREF, interne Vref uitgeschakeld |
0 |
1 |
AVcc met externe condensator op AREF-pin |
1 |
0 |
Gereserveerd |
1 |
1 |
Interne 2,56 spanningsreferentie met externe condensator op AREF-pen |
Begin nu met het configureren van deze registerbits in het programma, zodat we interne ADC lezen en uitvoeren naar alle pinnen van PORTC.
Atmega16 programmeren voor ADC
Het volledige programma wordt hieronder weergegeven. Brand het programma in Atmega16 met JTAG en Atmel studio en draai de potentiometer om de ADC-waarde te variëren. Hier wordt de code regel voor regel uitgelegd.
Begin met het maken van één functie om de omgezette ADC-waarde te lezen. Geef vervolgens de kanaalwaarde door als 'chnl' in de ADC_read- functie.
unsigned int ADC_read (unsigned char chnl)
Kanaalwaarden moeten tussen 0 en 7 liggen, aangezien we slechts 8 ADC-kanalen hebben.
chnl = chnl & 0b00000111;
Door '40' oftewel '01000000' naar het ADMUX-register te schrijven, hebben we PORTA0 als ADC0 geselecteerd, waar de analoge ingang zal worden aangesloten voor digitale conversie.
ADMUX = 0x40;
Deze stap omvat nu het ADC-conversieproces, waarbij we door ONE naar ADSC Bit in het ADCSRA-register te schrijven, de conversie starten. Wacht daarna tot de ADIF-bit de waarde retourneert wanneer de conversie is voltooid. We stoppen de conversie door '1' te schrijven bij ADIF Bit in het ADCSRA-register. Retourneer de ADC-waarde als de conversie is voltooid.
ADCSRA - = (1 <
Hier wordt de interne ADC-referentiespanning geselecteerd door REFS0 bit in te stellen. Schakel daarna ADC in en selecteer Prescaler als 128.
ADMUX = (1 <
Sla nu de ADC-waarde op en stuur deze naar PORTC. In PORTC zijn 8 LED's aangesloten die de digitale output in 8 bit formaat laten zien. Het voorbeeld dat we hebben getoond, varieert de spanning tussen 0V en 5V met behulp van één 1K-pot.
i = ADC_read (0); PORTC = i;
Digitale multimeter wordt gebruikt om de analoge ingangsspanning in ADC-pin weer te geven en 8 LED's worden gebruikt om de overeenkomstige 8-bits waarde van de ADC-uitgang weer te geven. Draai gewoon aan de Potentiometer en zie het overeenkomstige resultaat op de multimeter en op gloeiende LED's.
Volledige code en werkende video wordt hieronder gegeven.