- Hvad er ADC?
- ADC i ARM7-LPC2148
- ADC-stifter i ARM7-LPC2148
- ADC registrerer i ARM7-LPC2148
- ADxCR Registrer i LPC2148
- ADxGDR: ADC Global Data Register
- Komponenter, der kræves
- Kredsløbsdiagram
- Programmering ARM7-LPC2148 til ADC
I elektronikverdenen er der mange varianter af analoge sensorer på markedet, der bruges til at måle temperatur, hastighed, forskydning, tryk osv. Analoge sensorer bruges til at producere output, der konstant ændrer sig over tid. Disse signaler fra analoge sensorer har en tendens til at være meget lille i værdi fra nogle få mikro volt (uV) til flere milli volt (mV), så der kræves en form for forstærkning. For at bruge disse analoge signaler i mikrokontroller er vi nødt til at konvertere analogt signal til digitalt signal, da mikrokontrolleren kun forstår og behandler digitale signaler. Så det meste af mikrokontrolleren har en indbygget vigtig funktion kaldet ADC (Analog til Digital konverter). Vores mikrocontroller ARM7-LPC2148 har også en ADC-funktion.
I denne vejledning vil vi se, hvordan man bruger ADC i ARM7-LPC2148 ved at levere en varierende spænding til en analog pin og vise den på 16x2 LCD-skærmen efter analog til digital konvertering. Så lad os starte med en kort introduktion om ADC.
Hvad er ADC?
Som tidligere nævnt står ADC for analog til digital konvertering, og det bruges til at konvertere analoge værdier fra den virkelige verden til digitale værdier som 1 og 0. Så hvad er disse analoge værdier? Det er dem, vi ser i vores daglige liv som temperatur, hastighed, lysstyrke osv. Disse parametre måles som analoge spændinger af de respektive sensorer, og derefter konverteres disse analoge værdier til digitale værdier for mikrocontrollere.
Lad os antage, at vores ADC-interval er fra 0V til 3,3V, og vi har en 10-bit ADC, hvilket betyder, at vores indgangsspænding 0-3,3 volt opdeles i 1024 niveauer af diskrete analoge værdier (2 10 = 1024). Betydning 1024 er opløsningen for en 10-bit ADC, ligesom for en 8-bit ADC-opløsning vil være 512 (28) og for en 16-bit ADC-opløsning vil være 65.536 (216). LPC2148 har 10 bit ADC-opløsning.
Med dette, hvis den faktiske indgangsspænding er 0V, vil MCU's ADC læse den som 0, og hvis den er 3.3V, vil MCU læse 1024, og hvis den et sted imellem som 1.65v, vil MCU læse 512. Vi kan bruge nedenstående formler til beregning af den digitale værdi, der læses af MCU'en baseret på opløsning af ADC og driftsspænding.
(ADC-opløsning / driftsspænding) = (ADC Digital værdi / faktisk spændingsværdi)
Som for eksempel hvis referencespænding er 3v:
Vi forklarede ADC i detaljer i forrige artikel.
ADC i ARM7-LPC2148
- LPC2148 indeholder to analoge til digitale konvertere.
- Disse konvertere er enkelt 10-bit successive tilnærmelse analog til digitale konvertere.
- Mens ADC0 har seks kanaler, har ADC1 otte kanaler.
- Derfor er det samlede antal tilgængelige ADC-indgange til LPC2148 14.
- Den konverterer kun indgangsspænding i området (0 til 3,3 V). Den må ikke overstige 3,3 V spændingsreferencen. Da det vil beskadige IC og også give usikre værdier.
Nogle vigtige træk ved ADC i LPC2148
- Hver konverter, der er i stand til at udføre mere end 400.000 10-bit prøver pr. Sekund.
- Hver analog indgang har et dedikeret resultatregister for at reducere afbrydelsesomkostninger.
- Burst-konverteringstilstand til enkelt eller flere indgange.
- Valgfri konvertering ved overgang på input-pin eller timer-match signal.
- Global startkommando for begge konvertere.
Kontroller også, hvordan du bruger ADC i andre mikrocontrollere:
- Hvordan bruges ADC i Arduino Uno?
- Interfacing ADC0808 med 8051 Microcontroller
- Brug af ADC-modul fra PIC Microcontroller
- Raspberry Pi ADC vejledning
- Sådan bruges ADC i MSP430G2 - Måling af analog spænding
- Sådan bruges ADC i STM32F103C8
ADC-stifter i ARM7-LPC2148
Som fortalt earliar, i ARM7-LPC2148 er der to kanaler ADC0 med 6 analoge input pins & ADC1 med 8 analoge input pins. Så totalt er der 14 ben til analoge indgange. Nedenstående diagram viser de ben, der er tilgængelige til analog indgang.
Da ADC-indgangsstifter er multipleksede med andre GPIO-ben. Vi er nødt til at aktivere dem ved at konfigurere PINSEL-registeret til at vælge ADC-funktion.
Tabellen nedenfor viser stifter af ADC og respekteret ADC-kanal nr. I LPC2148. AD0 er kanal 0 og AD1 er 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 registrerer i ARM7-LPC2148
Register bruges til programmering til brug af A / D-konverteringsfunktion i LPC2148.
Nedenfor er en liste over registre, der bruges i LPC2148 til A / D-konvertering
1. ADCR: Analog til digitalt kontrolregister
Anvendelse: Dette register bruges til at konfigurere A / D-konverteren i LPC2148
2. ADGDR: Analog til digitalt globalt dataregister
Anvendelse: Dette register har DONE-bit til A / D-konverter, og RESULTATET af konverteringen gemmes her.
3. ADINTERN: Analog til Digital Interrupt Enable Register
Brug: Dette er et Interrupt Enable-register.
4. ADDR0 - ADDR7: Analog til digital kanal dataregister
Anvendelse: Dette register indeholder A / D-værdi for de respektive kanaler.
5. ADSTAT: Analog til digital statusregister.
Anvendelse: Dette register indeholder DONE-flag for respektive ADC-kanal og også OVERRUN-flag for respektive ADC-kanal.
I denne vejledning bruger vi kun ADCR & ADGDR-registre. Lad os se om dem i detaljer
ADxCR Registrer i LPC2148
AD0CR & AD1CR til henholdsvis kanal 0 og kanal 1. Det er et 32-bit register. Nedenstående tabel viser bitfelterne til ADCR-registret.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RESERVERET |
KANT |
START |
RESERVERET |
PDN |
RESERVERET |
CLKS |
BURST |
CLCKDIV |
SEL |
Lad os se om, hvordan man konfigurerer individuelle registre
1. SEL: Bitene fra (0 til 7) bruges til at vælge kanalen til ADC-konvertering. Der tildeles en bit til hver kanal. For eksempel indstilling af Bit-0 vil gøre ADC til at prøve AD0.1 til konvertering. Og indstilling af bit -1 vil gøre AD0.1; på samme måde vil indstilling af bit-7 konvertere for AD0.7. Vigtigt trin er, at vi har PINSEL i henhold til den port, vi bruger, for eksempel PINSEL0 til PORT0 i PLC2148.
2. CLCKDIV: Bits fra (8 til 15) er til Clock Divisor. Her divideres APB-uret (ARM Peripheral Bus Clock) med denne værdi plus en til at producere det nødvendige ur til A / D-konverteren, som skal være mindre end eller lig med 4,5 MHz, da vi bruger successiv tilnærmelsesmetode i LPC2148.
3. BURST: Bit 16 bruges til BURST-konverteringstilstand.
Indstilling 1: ADC udfører konverteringen for alle de kanaler, der er valgt i SEL-bits.
Indstilling 0: Deaktiverer BURST-konverteringstilstand.
4. CLCKS: Bitene fra (17 til 19) tre bits bruges til at vælge opløsning og antallet af ure til A / D-konvertering i burst-tilstand, da det er kontinuerlig A / D-konverteringstilstand.
Værdi for bits (17 til 19) |
Bits (nøjagtighed) |
Ingen af uret |
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 er til valg af Power down Mode for ADC i LPC2148.
- A / D er i PDN-tilstand.
- A / D er i driftstilstand
6. START: Bitene fra (24 til 26) er til START. Når BURST-konverteringstilstand er OFF ved at indstille 0, er disse START-bits nyttige til hvornår A / D-konvertering skal startes. START bruges også til kantstyret konvertering. Det er, når der er et input i CAP eller MAT pin af LPC2148, begynder A / D at konvertere. Lad os kontrollere nedenstående tabel
Værdi for bits (24 til 26) |
Pin's af LPC2148 |
ADC's funktion |
000 |
Bruges til at indstille ADC i PDN-tilstand Ingen start |
|
001 |
Start A / D-konvertering |
|
010 |
CAP0.2 / MAT0.2 |
Start A / D-konvertering på EDGE valgt på pin 27 (Rising or Falling) på CAP / MAT-pins i LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: Den 27 th bit er til EDGE bruges kun, når START bit indeholder 010-111. Det starter konvertering, når der er CAP eller MAT input, du kan se ovenstående tabel for det.
Indstilling : 0 - På faldende kant
1 - On Rising Edge
ADxGDR: ADC Global Data Register
AD0GDR & AD1GDR til henholdsvis ADC-kanal 0 og ADC-kanal 1.
Det er et 32-bit register, der indeholder RESULTATET af A / D-konvertering og også DONE-bit, der indikerer, at A / D-konvertering er udført. Nedenstående tabel viser bitfelterne til ADGDR-registret.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
FÆRDIG |
OVERKØRING |
RESERVERET |
CHN |
RESERVERET |
RESULTAT |
RESERVERET |
1. RESULTAT: Disse bits (6 til 15) indeholder resultatet af A / D-konvertering for den valgte kanal i ADCR SEL-registeret. Værdien læses først, når A / D-konverteringen er afsluttet, og dette er angivet med FERDIG bit.
EKSEMPEL: For et 10-bit ADC-resultat varierer den gemte værdi fra (0 til 1023).
2. KANAL: Disse bit 24 til 26 indeholder det kanalnummer, som A / D-konverteringen udføres for. Den konverterede digitale værdi er til stede i RESULT bit.
EKSEMPEL: 000 er for ADC-kanal 0 og 001 er for ADC-kanal 1 osv
3. OVERRUN: Den 30 th bit for OVERRUN bruges i burst mode. Ved indstilling 1 overskrives den tidligere konverterede ADC-værdi af den nyomregnede ADC-værdi. Når registret læses, rydder det OVERRUN-biten.
4. FERDIG: Den 31. bit er til FERDIG bit.
Sæt 1: Når A / D-konvertering er afsluttet.
Sæt 0: Når registret læses og ADCR skrives.
Vi har set om de vigtige registre, der bruges i ADC i LPC2148. Lad os nu begynde at bruge ADC i ARM7.
Komponenter, der kræves
Hardware
- ARM7-LPC2148 Microcontroller
- 3,3 V spændingsregulator IC
- 5V spændingsregulator IC
- 10K potentiometer - 2 nr
- LED (enhver farve)
- LCD-skærm (16X2)
- 9V batteri
- Brødbræt
- Tilslutning af ledninger
Software
- Keil uVision5
- Magic Flash-værktøj
Kredsløbsdiagram
Tabellen nedenfor viser kredsløbsforbindelserne mellem LCD og ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrer Vælg) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapind 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (datapind 6) |
P0.15 |
D7 (datapind 7) |
Lær mere om brug af LCD med ARM 7 - LPC2148.
VIGTIGT: Her bruger vi to spændingsregulator IC'er, en til 5V LCD-skærm og en anden 3,3V til analog indgang, som kan varieres med potentiometer.
Forbindelser mellem 5V spændingsregulator med LCD & ARM7 Stick
5V spændingsregulator IC |
Pin-funktion |
LCD & ARM-7 LPC2148 |
1. venstre pin |
+ Ve fra batteri 9V Input |
NC |
2. centrum pin |
- Ve fra batteri |
VSS, R / W, K af LCD GND af ARM7 |
3. højre pin |
Reguleret + 5V udgang |
VDD, A af LCD + 5V af ARM7 |
Potentiometer med LCD
Et potentiometer bruges til at variere kontrasten på LCD-displayet. En gryde har tre ben, venstre pin (1) er forbundet til + 5V og center (2) til VEE eller V0 på LCD-modulet, og højre pin (3) er forbundet til GND. Vi kan justere kontrasten ved at dreje på knappen.
Forbindelse mellem LPC2148 og potentiometer med 3,3 V spændingsregulator
3,3 V spændingsregulator IC |
Pin-funktion |
ARM-7 LPC2148 |
1. venstre pin |
- Ve fra batteri |
GND-pin |
2. centrum pin |
Reguleret + 3,3 V udgang |
Til potentiometer Input og potentiometer's output til P0.28 |
3. højre pin |
+ Ve fra batteri 9V Input |
NC |
Programmering ARM7-LPC2148 til ADC
For at programmere ARM7-LPC2148 har vi brug for keil uVision & Flash Magic værktøj. Vi bruger USB-kabel til at programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjælp af Keil og opretter en hex-fil, og derefter blinkes HEX-filen til ARM7-stick ved hjælp af Flash Magic. Hvis du vil vide mere om installation af keil uVision og Flash Magic, og hvordan du bruger dem, skal du følge linket Kom godt i gang med ARM7 LPC2148 Microcontroller og programmer det ved hjælp af Keil uVision.
I denne tutorial konverterer vi den analoge indgangsspænding (0 til 3,3 V) til digital værdi ved hjælp af ADC i LPC2148 og viser den analoge spænding på LCD-displayet (16x2). Et potentiometer vil blive brugt til at variere den analoge indgangsspænding.
Hvis du vil vide mere om grænseflade mellem LCD og ARM7-LPC2148 4-bit-tilstand, skal du følge dette link.
Den komplette kode til brug af ADC med ARM 7 er givet i slutningen af denne tutorial, her forklarer vi få dele af det.
Trin involveret i LPC2148-ADC programmering
1. PINSEL-register bruges til at vælge port pin på LPC2148 og ADC-funktionen som analog indgang.
PINSEL1 = 0x01000000; // Vælg P0.28 som AD0.1
2. Vælg uret og bitnøjagtigheden til konvertering ved at skrive værdi til ADxCR (ADC kontrolregister).
AD0CR = 0x00200402; // Indstiller ADC-drift som 10-bit / 11 CLK til konvertering (000)
3. Start konverteringen ved at skrive værdien til START-bits i ADxCR.
Her har jeg skrevet til 24 th smule AD0CR registret.
AD0CR = AD0CR - (1 << 24);
4. Nu skal vi kontrollere DONE bit (31.) for tilsvarende ADxDRy (ADC data register), da den ændres fra 0 til 1. Så vi bruger mens loop til konstant at kontrollere, om konvertering er udført på den 31. bit af data register.
mens (! (AD0DR1 & 0x80000000));
5. Når færdig bit er sat til 1, er konvertering vellykket, næste læser vi resultatet fra det samme ADC-dataregister AD0DR1 og gemmer værdien i en variabel.
adcvalue = AD0DR1;
Dernæst bruger vi en formel til at konvertere den digitale værdi til spænding og gemme i en variabel med navnet spænding .
spænding = ((adcvalue / 1023.0) * 3.3);
5. Følgende linjer bruges til at vise digitale værdier (0 til 1023) efter analog til digital konvertering.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Vis ADC-værdi (0 til 1023)
6. Følgende linjer bruges til at vise analog indgangsspænding (0 til 3,3 V) efter analog til digital konvertering og efter trin 5.
LCD_SEND (0xC0); sprintf (spændingsværdi, "Spænding =%. 2f V", spænding); LCD_DISPLAY (spændingsværdi); // Display (analog indgangsspænding)
7. Nu skal vi vise indgangsspændingen og de digitale værdier på LCD-skærmen. Før det er vi nødt til at initialisere LCD-skærmen og bruge passende kommandoer til at sende besked til visning.
Nedenstående kode bruges til at initialisere LCD'et
ugyldig LCD_INITILIZE (ugyldig) // Funktion for at gøre LCD-skærmen klar { IO0DIR = 0x0000FFF0; // Indstiller pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som OUTPUT delay_ms (20); LCD_SEND (0x02); // Initialiser lcd i 4-bit driftstilstand LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markør fra LCD_SEND (0x06); // Auto stigning markør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje første position }
Nedenstående kode bruges til at vise værdierne på LCD
ugyldig LCD_DISPLAY (char * msg) // Funktion til at udskrive de tegn sendt én efter én { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender øvre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH for at udskrive data IO0CLR = 0x00000020; // RW LOW Skrivefunktion delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uændret (dvs. RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre nibble IO0SET = 0x00000050; // RS & EN HØJ IO0CLR = 0x00000020; forsinkelse_ms (2); IO0CLR = 0x00000040; forsinkelse_ms (5); i ++; } }
Nedenstående funktion bruges til at skabe forsinkelse
ugyldigt delay_ms (uint16_t j) // Funktion til at foretage forsinkelse i millisekunder { uint16_t x, i; for (i = 0; i
Komplet kode med demonstrationsvideo er angivet nedenfor.