- Vad är ADC (analog till digital omvandling)
- ADC i AVR Microcontroller Atmega16
- Komponenter krävs
- Kretsschema
- Ställa in ADC-kontrollregister i Atmega16
- Programmering Atmega16 för ADC
En vanlig funktion som används i nästan alla inbäddade applikationer är ADC-modulen (Analog till Digital Converter). Dessa analoga till digitala omvandlare kan läsa spänningar från analoga sensorer som temperatursensor, lutningssensor, strömgivare, flexsensor etc. I denna handledning lär vi oss vad som är ADC och hur man använder ADC i Atmega16. Denna handledning inkluderar anslutning av en liten potentiometer till ADC-stift på Atmega16 och 8 lysdioder används för att visa den ändrade spänningen för ADC-utgångsvärdet med avseende på förändring av ADC-ingångsvärdet.
Tidigare förklarade vi ADC i andra mikrokontroller:
- Hur man använder ADC i ARM7 LPC2148 - Mätning av analog spänning
- Hur man använder ADC i STM32F103C8 - Mätning av analog spänning
- Hur man använder ADC i MSP430G2 - Mätning av analog spänning
- Hur man använder ADC i Arduino Uno?
- Använda ADC-modulen för PIC-mikrokontroller med MPLAB och XC8
Vad är ADC (analog till digital omvandling)
ADC står för Analog till Digital Converter. I elektronik är en ADC en enhet som omvandlar en analog signal som ström och spänning till digital kod (binär form). I verkliga världen är de flesta signalerna analoga och alla mikrokontroller eller mikroprocessorer förstår det binära eller digitala språket (0 eller 1). Så, för att få mikrokontroller att förstå de analoga signalerna, måste vi konvertera dessa analoga signaler till digital form. ADC gör exakt detta för oss. Det finns många typer av ADC tillgängliga för olika applikationer. Få populära ADC: er är flash, successiv approximation och sigma-delta.
Den billigaste typen av ADC är Successive-Approximation och i denna handledning kommer ADC att användas successivt-approximation. I en ADC-typ av successiv tillnärmning genereras en serie digitala koder, var och en motsvarar en fixanalognivå, successivt. En intern räknare används för att jämföra med den analoga signalen under konvertering. Generationen stoppas när den analoga nivån blir bara större än den analoga signalen. Den digitala koden motsvarar den analoga nivån är den önskade digitala representationen av den analoga signalen. Detta avslutar vår lilla förklaring om successiv approximering.
Om du vill utforska ADC mycket djupt kan du hänvisa till vår tidigare handledning om ADC. ADC finns i form av IC och även mikrokontroller levereras med inbyggd ADC idag. I denna handledning använder vi inbyggd ADC av Atmega16. Låt oss diskutera om den inbyggda ADC i Atmega16.
ADC i AVR Microcontroller Atmega16
Atmega16 har en inbyggd 10-bitars och 8-kanals ADC. 10 bit motsvarar att om ingångsspänningen är 0-5V kommer den att delas upp i 10 bitars värde, dvs. 1024 nivåer av diskreta analoga värden (2 10 = 1024). Nu motsvarar 8-kanal de dedikerade 8 ADC-stiften på Atmega16 där varje stift kan läsa den analoga spänningen. Komplett PortA (GPIO33-GPIO40) är dedikerad för ADC-drift. Som standard är PORTA-stiften allmänna IO-stift, det betyder att portstiften är multiplexerade. För att använda dessa stift som ADC-stift måste vi konfigurera vissa register som är dedikerade till ADC-kontroll. Det är därför som registren kallas ADC-kontrollregister. Låt oss diskutera hur du ställer in dessa register för att börja fungera med den inbyggda ADC.
ADC-stift i Atmega16
Komponenter krävs
- Atmega16 Microcontroller IC
- 16Mhz kristalloscillator
- Två 100nF kondensatorer
- Två 22pF kondensatorer
- Tryckknapp
- Bygeltrådar
- Bakbord
- USBASP v2.0
- Led (valfri färg)
Kretsschema
Ställa in ADC-kontrollregister i Atmega16
1. ADMUX-register (ADC Multiplexer Selection Register) :
ADMUX-registret är för val av ADC-kanal och val av referensspänning. Bilden nedan visar översikten över ADMUX-registret. Beskrivningen förklaras nedan.
- Bit 0-4: kanalvalbitar.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADC-kanal vald |
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 används för att justera resultatet till höger eller vänster.
ADLAR |
Beskrivning |
0 |
Högerjustera resultatet |
1 |
Vänster justera resultatet |
- Bit 6-7: De används för att välja referensspänning för ADC.
REFS1 |
REFS0 |
Val av spänningsreferens |
0 |
0 |
AREF, Intern Vref avstängd |
0 |
1 |
AVcc med extern kondensator vid AREF-stift |
1 |
0 |
Reserverad |
1 |
1 |
Intern 2.56 spänningsreferens med extern kondensator vid AREF-stift |
Börja nu med att konfigurera dessa registerbitar i programmet så att vi får intern ADC-läsning och utmatning till alla pins i PORTC.
Programmering Atmega16 för ADC
Komplett program ges nedan. Bränn programmet i Atmega16 med JTAG och Atmel studio och rotera potentiometern för att variera ADC-värdet. Här förklaras koden rad för rad.
Börja med att göra en funktion för att läsa ADC-omvandlat värde. Skicka sedan kanalvärdet som 'chnl' i ADC_read- funktionen.
osignerad int ADC_read (osignerad char chnl)
Kanalvärden måste vara mellan 0 och 7 eftersom vi bara har 8 ADC-kanaler.
chnl = chnl & 0b00000111;
Genom att skriva '40' dvs '01000000' till ADMUX-registret valde vi PORTA0 som ADC0 där den analoga ingången kommer att anslutas för digital konvertering.
ADMUX = 0x40;
Nu involverar detta steg ADC-omvandlingsprocess, där vi genom att skriva ONE till ADSC Bit i ADCSRA-registret startar omvandlingen. Därefter väntar du på att ADIF-biten returnerar värdet när konverteringen är klar. Vi stoppar konvertering genom att skriva '1' vid ADIF Bit i ADCSRA-registret. När konverteringen är klar returnerar du ADC-värdet.
ADCSRA - = (1 <
Här väljs den interna ADC-referensspänningen genom att ställa in REFS0-bit. Aktivera därefter ADC och välj förskalare som 128.
ADMUX = (1 <
Spara nu ADC-värdet och skicka det till PORTC. I PORTC är 8 lysdioder anslutna som visar den digitala utgången i 8-bitarsformat. Exemplet vi har visat varierar spänningen mellan 0V och 5V med en 1K-pott.
i = ADC_read (0); PORTC = i;
Digital multimeter används för att visa analog ingångsspänning i ADC-stift och 8 lysdioder används för att visa motsvarande 8-bitarsvärde för ADC-utgång. Vrid bara på potentiometern och se motsvarande resultat på multimeter såväl som på glödande lysdioder.
Komplett kod och arbetsvideo ges nedan.