- Wat is ADC?
- ADC in ARM7-LPC2148
- ADC-pinnen in ARM7-LPC2148
- ADC registreert in ARM7-LPC2148
- ADxCR Registreer in LPC2148
- ADxGDR: ADC Global Data Register
- Componenten vereist
- Schakelschema
- Programmering ARM7-LPC2148 voor ADC
In de elektronicawereld zijn er vele soorten analoge sensoren op de markt die worden gebruikt om temperatuur, snelheid, verplaatsing, druk enz. Te meten. Analoge sensoren worden gebruikt om output te produceren die continu verandert in de tijd. Deze signalen van analoge sensoren hebben de neiging om een zeer kleine waarde te hebben, van enkele microvolt (uV) tot enkele milli-volt (mV), dus enige vorm van versterking is vereist. Om deze analoge signalen in een microcontroller te gebruiken, moeten we een analoog signaal omzetten in een digitaal signaal, aangezien de microcontroller alleen digitale signalen begrijpt en verwerkt. Het grootste deel van de microcontroller heeft dus een ingebouwde belangrijke functie genaamd ADC (analoog naar digitaal convertor). Onze microcontroller ARM7-LPC2148 heeft ook een ADC-functie.
In deze tutorial zullen we zien hoe we ADC kunnen gebruiken in ARM7-LPC2148 door een variërende spanning te leveren aan een analoge pin en deze weer te geven op het 16x2 LCD-scherm na analoog naar digitaal conversie. Dus laten we beginnen met een korte introductie over ADC.
Wat is ADC?
Zoals eerder gezegd staat ADC voor analoog naar digitaal conversie en wordt het gebruikt om analoge waarden uit de echte wereld om te zetten in digitale waarden zoals enen en nullen. Dus wat zijn deze analoge waarden? Dit zijn degenen die we in ons dagelijks leven zien, zoals temperatuur, snelheid, helderheid enz. Deze parameters worden gemeten als analoge spanningen door respectievelijke sensoren en vervolgens worden deze analoge waarden omgezet in digitale waarden voor microcontrollers.
Laten we aannemen dat ons ADC-bereik van 0V tot 3,3V is en dat we een 10-bit ADC hebben, dit betekent dat onze ingangsspanning van 0-3,3 volt wordt opgesplitst in 1024 niveaus van discrete analoge waarden (2 10 = 1024). Dit betekent dat 1024 de resolutie is voor een 10-bits ADC, evenzo voor een 8-bits ADC-resolutie is 512 (28) en voor een 16-bits ADC-resolutie 65.536 (216). LPC2148 heeft de 10 bit resolutie ADC.
Hiermee als de werkelijke ingangsspanning 0 V is, leest de ADC van de MCU dit als 0 en als het 3,3 V is, leest de MCU 1024 en als het ergens tussenin, zoals 1,65 V, leest de MCU 512. We kunnen het onderstaande gebruiken formules om de digitale waarde te berekenen die door de MCU wordt gelezen op basis van de resolutie van de ADC en de bedrijfsspanning.
(ADC-resolutie / bedrijfsspanning) = (ADC digitale waarde / werkelijke spanningswaarde)
Zoals bijvoorbeeld als de referentiespanning 3v is:
We hebben ADC in detail uitgelegd in het vorige artikel.
ADC in ARM7-LPC2148
- De LPC2148 bevat twee analoog naar digitaal converters.
- Deze converters zijn enkele 10-bits opeenvolgende benadering analoog naar digitaal convertors.
- Terwijl ADC0 zes kanalen heeft, heeft ADC1 acht kanalen.
- Daarom is het totale aantal beschikbare ADC-ingangen voor LPC2148 14.
- Het converteert alleen ingangsspanning in het bereik van (0 tot 3,3 V). Het mag niet hoger zijn dan 3,3 V de spanningsreferentie. Omdat het de IC beschadigt en ook onzekere waarden oplevert.
Een belangrijk kenmerk van ADC in LPC2148
- Elke converter kan meer dan 400.000 10-bit samples per seconde uitvoeren.
- Elke analoge ingang heeft een speciaal resultatenregister om de overhead te verminderen.
- Burst-conversiemodus voor enkele of meerdere ingangen.
- Optionele conversie bij overgang op ingangspen of timer-match-signaal.
- Globaal Start-commando voor beide converters.
Controleer ook hoe u ADC in andere microcontrollers kunt gebruiken:
- Hoe ADC te gebruiken in Arduino Uno?
- Koppeling tussen ADC0808 met 8051 Microcontroller
- Met behulp van ADC-module van PIC Microcontroller
- Raspberry Pi ADC-zelfstudie
- Hoe ADC te gebruiken in MSP430G2 - Analoge spanning meten
- Hoe ADC te gebruiken in STM32F103C8
ADC-pinnen in ARM7-LPC2148
Zoals eerder verteld, zijn er in ARM7-LPC2148 twee kanalen ADC0 met 6 analoge inputpinnen en ADC1 met 8 analoge inputpinnen. Er zijn dus in totaal 14 pinnen voor analoge ingangen. Het onderstaande diagram toont de pinnen die beschikbaar zijn voor analoge invoer.
Omdat de ADC-invoerpinnen zijn gemultiplexed met andere GPIO-pinnen. We moeten ze inschakelen door het PINSEL-register te configureren om de ADC-functie te selecteren.
De onderstaande tabel toont pinnen van ADC en gerespecteerd ADC-kanaalnummer in LPC2148. AD0 is kanaal 0 en AD1 is kanaal 1
LPC2148-pen |
ADC-kanaalnr |
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 registreert in ARM7-LPC2148
Registers worden gebruikt bij het programmeren voor het gebruik van de A / D-conversiefunctie in LPC2148.
Hieronder vindt u een lijst met registers die in LPC2148 worden gebruikt voor A / D-conversie
1. ADCR: analoog naar digitaal besturingsregister
Gebruik: Dit register wordt gebruikt voor het configureren van de A / D-omzetter in LPC2148
2. ADGDR: analoog naar digitaal globaal gegevensregister
Gebruik: Dit register heeft een GEREED bit voor A / D-omzetter en het RESULTAAT van de conversie wordt hier opgeslagen.
3. ADINTERN: Analoog naar digitaal onderbrekingsregister inschakelen
Gebruik: Dit is een Interrupt Enable-register.
4. ADDR0 - ADDR7: analoog naar digitaal kanaalgegevensregister
Gebruik: Dit register bevat de A / D-waarde voor de respectievelijke kanalen.
5. ADSTAT: Analoog naar digitaal statusregister.
Gebruik: Dit register bevat de DONE-vlag voor het respectieve ADC-kanaal en ook de OVERRUN-vlag voor het respectieve ADC-kanaal.
In deze tutorial gebruiken we alleen ADCR- en ADGDR-registers. Laten we ze in detail bekijken
ADxCR Registreer in LPC2148
AD0CR & AD1CR voor respectievelijk kanaal 0 en kanaal 1. Het is een 32-bits register. Onderstaande tabel geeft de bitvelden voor ADCR-register aan.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
GERESERVEERD |
RAND |
BEGIN |
GERESERVEERD |
PDN |
GERESERVEERD |
CLKS |
UITBARSTING |
CLCKDIV |
SEL |
Laten we eens kijken hoe we individuele registers kunnen configureren
1. SEL: De bits van (0 tot 7) worden gebruikt om het kanaal voor ADC-conversie te selecteren. Voor elk kanaal wordt een bit toegewezen. Als u bijvoorbeeld Bit-0 instelt, wordt de ADC naar AD0.1 voor conversie omgezet. En als je bit -1 instelt, wordt AD0.1 gemaakt; Op dezelfde manier zal het instellen van bit-7 de conversie voor AD0.7 uitvoeren. Belangrijke stap is dat we PINSEL hebben volgens de poort die we gebruiken, bijvoorbeeld PINSEL0 voor PORT0 in PLC2148.
2. CLCKDIV: de bits van (8 tot 15) zijn voor Clock Divisor. Hier wordt de APB-klok (ARM Peripheral Bus-klok) gedeeld door deze waarde plus één om de klok te produceren die nodig is voor de A / D-omzetter, die kleiner of gelijk moet zijn aan 4,5 MHz, aangezien we de opeenvolgende benaderingsmethode gebruiken in LPC2148.
3. BURST: De bit 16 wordt gebruikt voor de BURST-conversiemodus.
Instelling 1: De ADC voert de conversie uit voor alle kanalen die zijn geselecteerd in SEL-bits.
Instelling 0: schakelt de BURST-conversiemodus uit.
4. CLCKS: De bits van (17 tot 19) drie bits worden gebruikt voor het selecteren van resolutie en het aantal klokken voor A / D-conversie in burst-modus, aangezien het continue A / D-conversiemodus is.
Waarde voor bits (17 tot 19) |
Bits (nauwkeurigheid) |
Geen van de klok |
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: De bit 21 is voor het selecteren van Power down Mode van ADC in LPC2148.
- A / D is in PDN-modus.
- A / D is in operationele modus
6. START: De bits van (24 tot 26) zijn voor START. Als de BURST-conversiemodus UIT is door 0 in te stellen, zijn deze START-bits handig voor het starten van de A / D-conversie. De START wordt ook gebruikt voor randgestuurde conversie. Dat is wanneer er een invoer is in CAP- of MAT-pin van LPC2148, de A / D begint te converteren. Laten we de onderstaande tabel eens bekijken
Waarde voor bits (24 tot 26) |
Pin's van LPC2148 |
Functie van ADC |
000 |
Wordt gebruikt om ADC in PDN-modus in te stellen Geen start |
|
001 |
Start A / D-conversie |
|
010 |
CAP0.2 / MAT0.2 |
Start A / D-conversie op EDGE geselecteerd op pin 27 (stijgend of dalend) op CAP / MAT-pinnen van LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: De 27ste bit is voor EDGE en wordt alleen gebruikt als de START-bit 010-111 bevat. Het begint met de conversie wanneer er CAP- of MAT-invoer is, u kunt daarvoor de bovenstaande tabel zien.
Instelling : 0 - Op vallende rand
1 - Op stijgende rand
ADxGDR: ADC Global Data Register
AD0GDR en AD1GDR voor respectievelijk ADC-kanaal 0 en ADC-kanaal 1.
Het is een 32-bits register met het RESULTAAT van A / D-conversie en ook de DONE-bit die aangeeft dat de A / D-conversie is voltooid. Onderstaande tabel geeft de bitvelden voor ADGDR-register aan.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
GEDAAN |
OVERLOOP |
GERESERVEERD |
CHN |
GERESERVEERD |
RESULTAAT |
GERESERVEERD |
1. RESULTAAT: Deze bits (6 tot 15) bevatten het resultaat van A / D-conversie voor het geselecteerde kanaal in het ADCR SEL-register. De waarde wordt pas gelezen nadat de A / D-conversie is voltooid en dit wordt aangegeven met de DONE- bit.
VOORBEELD: Voor een 10-bits ADC-resultaat varieert de opgeslagen waarde van (0 tot 1023).
2. CHANNEL: Deze bits 24 tot 26 bevatten het kanaalnummer waarvoor de A / D-conversie wordt uitgevoerd. De geconverteerde digitale waarde is aanwezig in de RESULT-bit.
VOORBEELD: 000 is voor ADC-kanaal 0 en 001 is voor ADC-kanaal 1, enz
3. OVERRUN: De 30 ste bit voor OVERRUN wordt gebruikt in de BURST-modus. Bij set 1 wordt de vorige geconverteerde ADC-waarde overschreven door de nieuw geconverteerde ADC-waarde. Wanneer het register wordt gelezen, wist het de OVERRUN-bit.
4. KLAAR: De 31ste bit is voor GEREED bit.
Set 1: Wanneer A / D-conversie is voltooid.
Set 0: Wanneer het register wordt gelezen en ADCR wordt geschreven.
We hebben gezien over de belangrijke registers die worden gebruikt in ADC in LPC2148. Laten we nu ADC gaan gebruiken in ARM7.
Componenten vereist
Hardware
- ARM7-LPC2148 Microcontroller
- 3.3V spanningsregelaar IC
- 5V spanningsregelaar IC
- 10K Potentiometer - 2 nrs
- LED (elke kleur)
- LCD-scherm (16X2)
- 9V batterij
- Breadboard
- Verbindingsdraden
Software
- Keil uVision5
- Magische Flash-tool
Schakelschema
De onderstaande tabel toont de circuitverbindingen tussen LCD en ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registreer selecteren) |
P0.6 |
E (inschakelen) |
P0.12 |
D4 (gegevenspin 4) |
P0.13 |
D5 (gegevenspin 5) |
P0.14 |
D6 (gegevenspin 6) |
P0.15 |
D7 (gegevenspin 7) |
Meer informatie over het gebruik van LCD met ARM 7 - LPC2148.
BELANGRIJK: hier gebruiken we twee spanningsregelaar-IC's, één voor 5V LCD-display en een andere 3.3V voor analoge invoer die kan worden gevarieerd met een potentiometer.
Verbindingen tussen 5V spanningsregelaar met LCD & ARM7 Stick
5V spanningsregelaar IC |
Pin-functie |
LCD & ARM-7 LPC2148 |
1. linker pin |
+ Ve van batterij 9V Input |
NC |
2. middelste pin |
- Ve van de batterij |
VSS, R / W, K of LCD GND van ARM7 |
3. juiste pin |
Gereguleerde + 5V-uitgang |
VDD, A van LCD + 5V van ARM7 |
Potentiometer met LCD
Een potentiometer wordt gebruikt om het contrast van het LCD-scherm te variëren. Een pot heeft drie pinnen, Linker pin (1) is verbonden met + 5V en midden (2) met VEE of V0 van LCD-module en rechter pin (3) is verbonden met GND. We kunnen het contrast aanpassen door aan de knop te draaien.
Verbinding tussen LPC2148 en potentiometer met 3.3V spanningsregelaar
3.3V Spanningsregelaar IC |
Pin-functie |
ARM-7 LPC2148 |
1. linker pin |
- Ve van de batterij |
GND-pin |
2. middelste pin |
Gereguleerde + 3.3V-uitgang |
Naar de ingang van de potentiometer en de uitgang van de potentiometer naar P0.28 |
3. juiste pin |
+ Ve van batterij 9V Input |
NC |
Programmering ARM7-LPC2148 voor ADC
Om ARM7-LPC2148 te programmeren, hebben we de tool uVision & Flash Magic nodig. We gebruiken een USB-kabel om de ARM7 Stick te programmeren via een micro-USB-poort. We schrijven code met Keil en maken een hex-bestand en vervolgens wordt het HEX-bestand met Flash Magic naar de ARM7-stick geflitst. Om meer te weten over het installeren van keil uVision en Flash Magic en hoe u ze kunt gebruiken, volgt u de link Aan de slag met ARM7 LPC2148 Microcontroller en programmeert u deze met Keil uVision.
In deze tutorial zetten we de analoge ingangsspanning (0 tot 3.3V) om in digitale waarde met behulp van ADC in LPC2148 en geven we de analoge spanning weer op het LCD-scherm (16x2). Een potentiometer wordt gebruikt om de analoge ingangsspanning te variëren.
Volg deze link om meer te weten over de interfacing van LCD met ARM7-LPC2148 4-bits modus.
De volledige code voor het gebruik van ADC met ARM 7 wordt aan het einde van deze tutorial gegeven, hier leggen we enkele delen ervan uit.
Stappen die betrokken zijn bij het programmeren van LPC2148-ADC
1. PINSEL-register wordt gebruikt om de poortpin van LPC2148 en de ADC-functie als analoge ingang te selecteren.
PINSEL1 = 0x01000000; // Selecteer P0.28 als AD0.1
2. Selecteer de klok- en bitnauwkeurigheid voor conversie door waarde te schrijven naar de ADxCR (ADC-controleregister).
AD0CR = 0x00200402; // Stelt ADC-bewerking in als 10-bits / 11 CLK voor conversie (000)
3. Start de conversie door de waarde naar START-bits in ADxCR te schrijven.
Hier heb ik geschreven naar 24 ste bit van AD0CR register.
AD0CR = AD0CR - (1 << 24);
4. Nu moeten we de DONE-bit (31e) van de corresponderende ADxDRy (ADC-dataregister) controleren terwijl het verandert van 0 in 1. Dus gebruiken we de while- lus om constant te controleren of de conversie is uitgevoerd op het 31e bit van het dataregister.
while (! (AD0DR1 & 0x80000000));
5. Nadat de done bit is ingesteld op 1, is de conversie geslaagd. Vervolgens lezen we het resultaat van hetzelfde ADC-gegevensregister AD0DR1 en slaan de waarde op in een variabele.
adcvalue = AD0DR1;
Vervolgens gebruiken we een formule om de digitale waarde om te zetten in spanning en op te slaan in een variabele met de naam spanning .
spanning = ((adcvalue / 1023.0) * 3.3);
5. De volgende regels worden gebruikt om digitale waarden (0 tot 1023) weer te geven na analoog naar digitaal conversie.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // ADC-waarde weergeven (0 tot 1023)
6. De volgende regels worden gebruikt om de analoge ingangsspanning (0 tot 3,3 V) weer te geven na analoog naar digitaal conversie en na stap 5.
LCD_SEND (0xC0); sprintf (voltwaarde, "Spanning =%. 2f V", spanning); LCD_DISPLAY (voltwaarde); // Display (analoge ingangsspanning)
7. Nu moeten we de ingangsspanning en digitale waarden op het LCD-scherm weergeven. Daarvoor moeten we het LCD-scherm initialiseren en de juiste opdrachten gebruiken om een bericht te verzenden.
De onderstaande code wordt gebruikt om het LCD-scherm te initialiseren
void LCD_INITILIZE (void) // Functie om de LCD klaar te maken { IO0DIR = 0x0000FFF0; // Stelt pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 in als OUTPUT delay_ms (20); LCD_SEND (0x02); // Initialiseer lcd in 4-bits modus LCD_SEND (0x28); // 2 regels (16X2) LCD_SEND (0x0C); // Weergave op cursor uit LCD_SEND (0x06); // Auto increment cursor LCD_SEND (0x01); // Display duidelijk LCD_SEND (0x80); // Eerste regel eerste positie }
De onderstaande code wordt gebruikt om de waarden op het LCD-scherm weer te geven
leegte LCD_DISPLAY (char * msg) // Functie om de tekens afdrukken verzonden één voor één { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Stuurt bovenste nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH om gegevens af te drukken IO0CLR = 0x00000020; // RW LOW Schrijfmodus delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS en RW ongewijzigd (dwz RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Stuurt lagere nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
De onderstaande functie wordt gebruikt om vertraging te creëren
void delay_ms (uint16_t j) // Functie voor het maken van vertraging in milliseconden { uint16_t x, i; voor (i = 0; i
Volledige code met demonstratievideo wordt hieronder gegeven.