- Vad är ADC?
- ADC i ARM7-LPC2148
- ADC-stift i ARM7-LPC2148
- ADC registrerar i ARM7-LPC2148
- ADxCR Registrera i LPC2148
- ADxGDR: ADC globalt dataregister
- Komponenter krävs
- Kretsschema
- Programmering ARM7-LPC2148 för ADC
I elektronikvärlden finns det många varianter av analoga sensorer på marknaden som används för att mäta temperatur, hastighet, förskjutning, tryck etc. Analoga sensorer används för att producera utdata som kontinuerligt förändras över tiden. Dessa signaler från analoga sensorer tenderar att vara mycket små i värde från några mikrovolt (uV) till flera millivolt (mV), så någon form av förstärkning krävs. För att använda dessa analoga signaler i mikrokontroller måste vi konvertera analog signal till digital signal eftersom mikrokontrollern förstår och bearbetar bara digitala signaler. Så det mesta av mikrokontrollern har en inbyggd viktig funktion som kallas ADC (Analog till Digital omvandlare). Vår mikrokontroller ARM7-LPC2148 har också en ADC-funktion.
I denna handledning kommer vi att se hur man använder ADC i ARM7-LPC2148 genom att mata en varierande spänning till en analog stift och visa den på 16x2 LCD-skärmen efter analog till digital omvandling. Så låt oss börja med en kort introduktion om ADC.
Vad är ADC?
Som sagt tidigare står ADC för Analog till digital konvertering och används för att konvertera analoga värden från verkliga världen till digitala värden som 1 och 0. Så vad är dessa analoga värden? Dessa är de som vi ser i vårt dagliga liv som temperatur, hastighet, ljusstyrka etc. Dessa parametrar mäts som analoga spänningar av respektive sensorer och sedan omvandlas dessa analoga värden till digitala värden för mikrokontroller.
Låt oss anta att vårt ADC-intervall är från 0V till 3,3V och vi har en 10-bitars ADC, vilket betyder att vår ingångsspänning 0-3,3 volt kommer att delas upp i 1024 nivåer av diskreta analoga värden (2 10 = 1024). Betydelsen 1024 är upplösningen för en 10-bitars ADC, på samma sätt för en 8-bitars ADC-upplösning blir 512 (28) och för en 16-bitars ADC-upplösning kommer den att vara 65 536 (216). LPC2148 har ADC med 10 bitars upplösning.
Med detta om den faktiska ingångsspänningen är 0V kommer MCU: s ADC att läsa den som 0 och om den är 3,3V kommer MCU att läsa 1024 och om den någonstans mellan 1,65v kommer MCU att läsa 512. Vi kan använda nedan formler för att beräkna det digitala värdet som kommer att läsas av MCU baserat på upplösningen av ADC och driftspänning.
(ADC-upplösning / driftspänning) = (ADC Digital värde / Faktiskt spänningsvärde)
Som till exempel om referensspänningen är 3v:
Vi förklarade ADC i detalj i tidigare artikel.
ADC i ARM7-LPC2148
- LPC2148 innehåller två analoga till digitala omvandlare.
- Dessa omvandlare är enstaka 10-bitars successiva approximationsanalog till digitala omvandlare.
- Medan ADC0 har sex kanaler har ADC1 åtta kanaler.
- Därför är det totala antalet tillgängliga ADC-ingångar för LPC2148 14.
- Den konverterar endast ingångsspänningen inom (0 till 3,3 V). Den får inte överstiga 3,3 V spänningsreferensen. Eftersom det kommer att skada IC och också ge osäkra värden.
Några viktiga funktioner i ADC i LPC2148
- Varje omvandlare kan utföra mer än 400000 10-bitars sampel per sekund.
- Varje analog ingång har ett dedikerat resultatregister för att minska avbrottsomkostnader.
- Burst-omvandlingsläge för enstaka eller flera ingångar.
- Valfri konvertering vid övergång på ingångsstift eller timer-matchningssignal.
- Global Start-kommando för båda omvandlarna.
Kontrollera också hur du använder ADC i andra mikrokontroller:
- Hur man använder ADC i Arduino Uno?
- Gränssnitt ADC0808 med 8051 mikrokontroller
- Använda ADC-modulen i PIC Microcontroller
- Raspberry Pi ADC-handledning
- Hur man använder ADC i MSP430G2 - Mätning av analog spänning
- Hur man använder ADC i STM32F103C8
ADC-stift i ARM7-LPC2148
Som sagt tidigare, finns det i ARM7-LPC2148 två kanaler ADC0 med 6 analoga ingångsstift och ADC1 med 8 analoga ingångsstift. Så det finns totalt 14 stift för analoga ingångar. Nedanstående diagram visar de stift som är tillgängliga för analog ingång.
Eftersom ADC-ingångarna är multiplexerade med andra GPIO-stift. Vi måste aktivera dem genom att konfigurera PINSEL-registret för att välja ADC-funktion.
Tabellen nedan visar stift på ADC och respekterad ADC-kanal nr i LPC2148. AD0 är kanal 0 och AD1 är kanal 1
LPC2148 Pin |
ADC-kanal nr |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
ADC registrerar i ARM7-LPC2148
Register används vid programmering för användning av A / D-omvandlingsfunktion i LPC2148.
Nedan finns en lista över register som används i LPC2148 för A / D-omvandling
1. ADCR: Analogt till digitalt kontrollregister
Användning: Detta register används för att konfigurera A / D-omvandlaren i LPC2148
2. ADGDR: Analogt till digitalt globalt dataregister
Användning: Detta register har Klar bit för A / D-omvandlare och RESULTAT för konverteringen lagras här.
3. ADINTERN: Analog till Digital Interrupt Enable Register
Användning: Detta är ett Interrupt Enable-register.
4. ADDR0 - ADDR7: Dataregister för analog till digital kanal
Användning: Detta register innehåller A / D-värde för respektive kanal.
5. ADSTAT: Analogt till digitalt statusregister.
Användning: Detta register innehåller DONE-flaggan för respektive ADC-kanal och OVERRUN-flaggan för respektive ADC-kanal.
I denna handledning använder vi endast ADCR- och ADGDR-register. Låt oss se om dem i detalj
ADxCR Registrera i LPC2148
AD0CR & AD1CR för kanal 0 respektive kanal 1. Det är ett 32-bitarsregister. Nedanstående tabell visar bitfälten för ADCR-registret.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RESERVERAD |
KANT |
START |
RESERVERAD |
PDN |
RESERVERAD |
CLKS |
BRISTA |
CLCKDIV |
SEL |
Låt oss se om hur du konfigurerar enskilda register
1. SEL: Bitarna från (0 till 7) används för att välja kanal för ADC-omvandling. En bit tilldelas för varje kanal. Om du till exempel ställer in Bit-0 kommer ADC att prova AD0.1 för konvertering. Och när bit -1 ställs in blir AD0.1; På samma sätt kommer bit-7 att göra omvandlingen för AD0.7. Viktigt steg är att vi har PINSEL enligt porten vi använder till exempel PINSEL0 för PORT0 i PLC2148.
2. CLCKDIV: Bitarna från (8 till 15) är för Clock Divisor. Här divideras APB-klockan (ARM Peripheral Bus Clock) med detta värde plus ett för att producera den klocka som krävs för A / D-omvandlaren, som bör vara mindre än eller lika med 4,5 MHz eftersom vi använder successiv approximationsmetod i LPC2148.
3. BURST: Bit 16 används för BURST-omvandlingsläge.
Inställning 1: ADC gör konverteringen för alla kanaler som väljs i SEL-bitar.
Inställning 0: Inaktiverar BURST-omvandlingsläget.
4. CLCKS: Bitarna från (17 till 19) tre bitar används för att välja upplösning och antalet klockor för A / D-omvandling i burst-läge eftersom det är kontinuerligt A / D-omvandlingsläge.
Värde för bitar (17 till 19) |
Bits (noggrannhet) |
Nej av klockan |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: Bit 21 är för att välja Avstängningsläge för ADC i LPC2148.
- A / D är i PDN-läge.
- A / D är i driftläge
6. START: Bitarna från (24 till 26) är för START. När BURST-omvandlingsläget är AV genom att ställa in 0 är dessa START-bitar användbara när A / D-omvandlingen ska startas. START används också för kantstyrd konvertering. Det är då det finns en ingång i CAP eller MAT-stift av LPC2148 som A / D börjar konvertera. Låt oss kolla nedanstående tabell
Värde för bitar (24 till 26) |
Pin's of LPC2148 |
ADC: s funktion |
000 |
Används för att ställa in ADC i PDN-läge Ingen start |
|
001 |
Starta A / D-konvertering |
|
010 |
CAP0.2 / MAT0.2 |
Starta A / D-konvertering på EDGE vald på stift 27 (Rising eller Falling) på CAP / MAT-stift på LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. KANT: Den 27: e biten är för EDGE används endast när START-biten innehåller 010-111. Det startar konvertering när det finns CAP- eller MAT-ingång, du kan se tabellen ovan för det.
Inställning : 0 - På fallande kant
1 - On Rising Edge
ADxGDR: ADC globalt dataregister
AD0GDR & AD1GDR för ADC Channel 0 respektive ADC channel 1.
Det är ett 32-bitarsregister som innehåller RESULTATET av A / D-omvandling och även DONE-biten som indikerar att A / D-omvandlingen är klar. Nedanstående tabell visar bitfälten för ADGDR-registret.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
GJORT |
KÖRNING |
RESERVERAD |
CHN |
RESERVERAD |
RESULTAT |
RESERVERAD |
1. RESULTAT: Dessa bitar (6 till 15) innehåller resultatet av A / D-omvandling för den valda kanalen i ADCR SEL-registret. Värdet läses först efter att A / D-omvandlingen har slutförts och detta indikeras med KLAR bit.
EXEMPEL: För ett 10-bitars ADC-resultat varierar lagrat värde från (0 till 1023).
2. KANAL: Dessa bitar 24 till 26 innehåller kanalnumret för vilket A / D-omvandlingen görs. Det konverterade digitala värdet finns i RESULT-bit.
EXEMPEL: 000 är för ADC-kanal 0 och 001 är för ADC-kanal 1, etc.
3. OVERRUN: Den 30: e biten för OVERRUN används i BURST-läge. Vid inställning 1 skrivs det tidigare konverterade ADC-värdet över av det nyligen konverterade ADC-värdet. När registret läses rensas OVERRUN-biten.
4. KLAR: Den 31: e biten är för KLAR bit.
Set 1: När A / D-konvertering är klar.
Set 0: När registret läses och ADCR skrivs.
Vi har sett om de viktiga register som används i ADC i LPC2148. Låt oss nu börja använda ADC i ARM7.
Komponenter krävs
Hårdvara
- ARM7-LPC2148 mikrokontroller
- 3,3 V spänningsregulator IC
- 5V spänningsregulator IC
- 10K potentiometer - 2 nr
- LED (valfri färg)
- LCD-skärm (16X2)
- 9V batteri
- Bakbord
- Anslutande ledningar
programvara
- Keil uVision5
- Magic Flash Tool
Kretsschema
Tabellen nedan visar kretsförbindelserna mellan LCD och ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrera Välj) |
P0.6 |
E (Aktivera) |
P0.12 |
D4 (datapinne 4) |
P0.13 |
D5 (datapinne 5) |
P0.14 |
D6 (datapinne 6) |
P0.15 |
D7 (datapinne 7) |
Lär dig mer om att använda LCD med ARM 7 - LPC2148.
VIKTIGT: Här använder vi två spänningsregulatorer, en för 5V LCD-skärm och en annan 3,3V för analog ingång som kan varieras med potentiometer.
Anslutningar mellan 5V spänningsregulator med LCD & ARM7 Stick
5V spänningsregulator IC |
Pin-funktion |
LCD & ARM-7 LPC2148 |
1. vänster stift |
+ Ve från batteri 9V ingång |
NC |
2.Centre Pin |
- Ve från batteriet |
VSS, R / W, K på LCD GND av ARM7 |
3. höger stift |
Reglerad + 5V utgång |
VDD, A av LCD + 5V av ARM7 |
Potentiometer med LCD
En potentiometer används för att variera kontrasten på LCD-skärmen. En kruka har tre stift, vänster stift (1) är ansluten till + 5V och mitt (2) till VEE eller V0 på LCD-modulen och höger stift (3) är ansluten till GND. Vi kan justera kontrasten genom att vrida på ratten.
Anslutning mellan LPC2148 och potentiometer med 3,3 V spänningsregulator
3,3 V spänningsregulator IC |
Pin-funktion |
ARM-7 LPC2148 |
1. vänster stift |
- Ve från batteriet |
GND-stift |
2.Centre Pin |
Reglerad + 3,3 V utgång |
Till potentiometer Ingång och potentiometers utgång till P0.28 |
3. höger stift |
+ Ve från batteri 9V ingång |
NC |
Programmering ARM7-LPC2148 för ADC
För att programmera ARM7-LPC2148 behöver vi keil uVision & Flash Magic-verktyget. Vi använder USB-kabel för att programmera ARM7 Stick via mikro-USB-port. Vi skriver kod med Keil och skapar en hex-fil och sedan blinkar HEX-filen till ARM7-stick med Flash Magic. Om du vill veta mer om installation av Keil uVision och Flash Magic och hur du använder dem följer du länken Komma igång med ARM7 LPC2148 Microcontroller och programmerar den med Keil uVision.
I denna handledning omvandlar vi den analoga ingångsspänningen (0 till 3,3 V) till digitalt värde genom att använda ADC i LPC2148 och visar den analoga spänningen på LCD-skärmen (16x2). En potentiometer används för att variera den analoga ingångsspänningen.
Om du vill veta mer om gränssnitt mellan LCD och ARM7-LPC2148 4-bitarsläge följer du denna länk.
Den kompletta koden för att använda ADC med ARM 7 ges i slutet av denna handledning, här förklarar vi några delar av den.
Steg involverade i LPC2148-ADC-programmering
1. PINSEL-register används för att välja portstift på LPC2148 och ADC-funktionen som analog ingång.
PINSEL1 = 0x01000000; // Välj P0.28 som AD0.1
2. Välj klock- och bitnoggrannhet för konvertering genom att skriva värde till ADxCR (ADC-kontrollregistret).
AD0CR = 0x00200402; // Ställer in ADC-operation som 10-bitar / 11 CLK för konvertering (000)
3. Starta konverteringen genom att skriva värdet till START-bitarna i ADxCR.
Här har jag skrivit till 24: e bit AD0CR-register.
AD0CR = AD0CR - (1 << 24);
4. Nu måste vi kontrollera DONE-biten (31) för motsvarande ADxDRy (ADC-dataregister) när den ändras från 0 till 1. Så vi använder while- loop för att ständigt kontrollera om konvertering sker på den 31: e biten av dataregistret.
medan (! (AD0DR1 & 0x80000000));
5. Efter att färdig bit har ställts in på 1 är konvertering framgångsrik, därefter läser vi resultatet från samma ADC-dataregister AD0DR1 och lagrar värdet i en variabel.
adcvalue = AD0DR1;
Därefter använder vi en formel för att konvertera det digitala värdet till spänning och lagra i en variabel med namnet spänning .
spänning = ((adcvalue / 1023.0) * 3.3);
5. Följande rader används för att visa digitala värden (0 till 1023) efter analog till digital konvertering.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Visa ADC-värde (0 till 1023)
6. Följande linjer används för att visa analog ingångsspänning (0 till 3,3 V) efter analog till digital omvandling och efter steg 5.
LCD_SEND (0xC0); sprintf (spänningsvärde, "Spänning =%. 2f V", spänning); LCD_DISPLAY (spänningsvärde); // Display (analog ingångsspänning)
7. Nu måste vi visa ingångsspänningen och digitala värden på LCD-skärmen. Innan det måste vi initialisera LCD-skärmen och använda lämpliga kommandon för att skicka meddelande för att visa.
Nedanstående kod används för att initialisera LCD-skärmen
ogiltig LCD_INITILIZE (ogiltig) // Funktion för att göra klar LCD-skärmen { IO0DIR = 0x0000FFF0; // Ställer in stift P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som OUTPUT delay_ms (20); LCD_SEND (0x02); // Initiera lcd i 4-bitars driftsätt LCD_SEND (0x28); // 2 rader (16X2) LCD_SEND (0x0C); // Visa på markören av LCD_SEND (0x06); // Autoinkrement- markör LCD_SEND (0x01); // Visa tydlig LCD_SEND (0x80); // Första raden första position }
Nedanstående kod används för att visa värdena på LCD
void LCD_DISPLAY (char * msg) // Funktion för att skriva ut de tecken skickas en efter en { uint8_t i = 0; medan (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Skickar övre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH för att skriva ut data IO0CLR = 0x00000020; // RW LOW Skrivläge delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS och RW oförändrade (dvs. RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Skickar lägre nibble IO0SET = 0x00000050; // RS & EN HÖG IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Funktionen nedan används för att skapa fördröjning
void delay_ms (uint16_t j) // Funktion för att göra fördröjning i millisekunder { uint16_t x, i; för (i = 0; i
Komplett kod med demonstrationsvideo ges nedan.