- Hva er ADC?
- ADC i ARM7-LPC2148
- ADC-pinner i ARM7-LPC2148
- ADC registrerer seg i ARM7-LPC2148
- ADxCR Registrer deg i LPC2148
- ADxGDR: ADC Global Data Register
- Komponenter kreves
- Kretsdiagram
- Programmering ARM7-LPC2148 for ADC
I elektronikkverdenen er det mange varianter av analoge sensorer i markedet som brukes til å måle temperatur, hastighet, forskyvning, trykk etc. Analoge sensorer brukes til å produsere utganger som endrer seg kontinuerlig over tid. Disse signalene fra analoge sensorer har en tendens til å ha veldig liten verdi fra noen få mikrovolt (uV) til flere millivolt (mV), så det kreves en form for forsterkning. For å bruke disse analoge signalene i mikrokontroller, trenger vi å konvertere analogt signal til digitalt signal ettersom mikrokontrolleren bare forstår og behandler digitale signaler. Så det meste av mikrokontrolleren har en innebygd viktig funksjon kalt ADC (Analog til Digital omformer). Vår mikrokontroller ARM7-LPC2148 har også en ADC-funksjon.
I denne opplæringen vil vi se hvordan du bruker ADC i ARM7-LPC2148 ved å levere en varierende spenning til en analog pin og vise den på 16x2 LCD-skjermen etter analog til digital konvertering. Så la oss starte med en kort introduksjon om ADC.
Hva er ADC?
Som tidligere sagt står ADC for Analog til digital konvertering, og den brukes til å konvertere analoge verdier fra den virkelige verden til digitale verdier som 1 og 0. Så hva er disse analoge verdiene? Dette er de vi ser i vårt daglige liv som temperatur, hastighet, lysstyrke osv. Disse parametrene måles som analoge spenninger av respektive sensorer, og deretter konverteres disse analoge verdiene til digitale verdier for mikrokontrollere.
La oss anta at ADC-området vårt er fra 0V til 3,3V, og vi har en 10-bit ADC, dette betyr at inngangsspenningen 0-3,3 volt vil bli delt inn i 1024 nivåer av diskrete analoge verdier (2 10 = 1024). Betydning 1024 er oppløsningen for en 10-biters ADC, på samme måte for en 8-biters ADC-oppløsning vil være 512 (28) og for en 16-biters ADC-oppløsning vil være 65 536 (216). LPC2148 har 10-biters ADC-oppløsning.
Med dette, hvis den faktiske inngangsspenningen er 0V, vil MCUs ADC lese den som 0, og hvis den er 3,3V vil MCU lese 1024, og hvis den et sted i mellom som 1,65v vil MCU lese 512. Vi kan bruke nedenstående formler for å beregne den digitale verdien som vil bli lest av MCU basert på oppløsningen til ADC og driftsspenning.
(ADC-oppløsning / driftsspenning) = (ADC Digital verdi / faktisk spenningsverdi)
Som for eksempel hvis referansespenningen er 3v:
Vi forklarte ADC i detalj i forrige artikkel.
ADC i ARM7-LPC2148
- LPC2148 inneholder to analoge til digitale omformere.
- Disse omformerne er enkle 10-bit påfølgende analoge til digitale omformere.
- Mens ADC0 har seks kanaler, har ADC1 åtte kanaler.
- Derfor er totalt antall tilgjengelige ADC-innganger for LPC2148 14.
- Den konverterer kun inngangsspenningen i området (0 til 3,3V). Den må ikke overstige 3,3V spenningsreferansen. Da det vil skade IC og også gi usikre verdier.
Noen viktige trekk ved ADC i LPC2148
- Hver omformer som er i stand til å utføre mer enn 400000 10-bits prøver per sekund.
- Hver analoge inngang har et dedikert resultatregister for å redusere avbrudd overhead.
- Burst-konverteringsmodus for enkelt- eller flere innganger.
- Valgfri konvertering ved overgang på inngangsstift eller timersamsignal.
- Global Start-kommando for begge omformerne.
Sjekk også hvordan du bruker ADC i andre mikrokontrollere:
- Hvordan bruke ADC i Arduino Uno?
- Grensesnitt ADC0808 med 8051 mikrokontroller
- Bruker ADC-modulen til PIC Microcontroller
- Raspberry Pi ADC opplæring
- Hvordan bruke ADC i MSP430G2 - Måling av analog spenning
- Hvordan bruke ADC i STM32F103C8
ADC-pinner i ARM7-LPC2148
Som fortalt earliar, i ARM7-LPC2148 er det to kanaler ADC0 med 6 analoge inngangspinner og ADC1 med 8 analoge inngangspinner. Så det er totalt 14 pinner for analoge innganger. Diagrammet nedenfor viser pinnene som er tilgjengelige for analog inngang.
Siden ADC-inngangspinnene er multiplekserte med andre GPIO-pinner. Vi må aktivere dem ved å konfigurere PINSEL-registeret for å velge ADC-funksjon.
Tabellen nedenfor viser pinner på ADC og respektert ADC-kanalnr 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 seg i ARM7-LPC2148
Register brukes i programmering for bruk av A / D-konverteringsfunksjon i LPC2148.
Nedenfor er en liste over registre som brukes i LPC2148 for A / D-konvertering
1. ADCR: Analog til Digital Control Register
Bruk: Dette registeret brukes til å konfigurere A / D-omformeren i LPC2148
2. ADGDR: Analog til Digital Global Data Register
Bruk: Dette registeret har FERDIG bit for A / D-omformer og RESULTATET av konverteringen lagres her.
3. ADINTERN: Analog til Digital Interrupt Enable Register
Bruk: Dette er et Interrupt Enable-register.
4. ADDR0 - ADDR7: Analog til digital kanal dataregister
Bruk: Dette registeret inneholder A / D-verdien for de respektive kanalene.
5. ADSTAT: Analogt til digitalt statusregister.
Bruk: Dette registeret inneholder DONE-flagget for respektive ADC-kanal og OVERRUN-flagg for respektive ADC-kanal.
I denne opplæringen bruker vi bare ADCR & ADGDR-registre. La oss se om dem i detalj
ADxCR Registrer deg i LPC2148
AD0CR og AD1CR for henholdsvis kanal 0 og kanal 1. Det er et 32-biters register. Tabellen nedenfor viser bitfeltene for ADCR-registeret.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RESERVERT |
KANT |
START |
RESERVERT |
PDN |
RESERVERT |
CLKS |
BURST |
CLCKDIV |
SELG |
La oss se om hvordan du konfigurerer individuelle registre
1. SEL: Bitene fra (0 til 7) brukes til å velge kanalen for ADC-konvertering. Det tildeles en bit for hver kanal. For eksempel å sette Bit-0 vil ADC prøve AD0.1 for konvertering. Og innstilling av bit -1 vil gjøre AD0.1; På samme måte vil innstilling av bit-7 gjøre konverteringen for AD0.7. Viktig trinn er at vi har PINSEL i henhold til porten vi bruker for eksempel PINSEL0 for PORT0 i PLC2148.
2. CLCKDIV: Bittene fra (8 til 15) er for Clock Divisor. Her deles APB-klokken (ARM Peripheral Bus Clock) med denne verdien pluss en for å produsere klokken som kreves for A / D-omformeren, som skal være mindre enn eller lik 4,5 MHz da vi bruker suksessive tilnærmingsmetoder i LPC2148.
3. BURST: Bit 16 brukes til BURST-konverteringsmodus.
Innstilling 1: ADC vil konvertere for alle kanalene som er valgt i SEL-bits.
Innstilling 0: Deaktiverer BURST-konverteringsmodus.
4. CLCKS: Bittene fra (17 til 19) tre bits brukes til å velge oppløsning og antall klokker for A / D-konvertering i burst-modus ettersom det er kontinuerlig A / D-konverteringsmodus.
Verdi for bits (17 til 19) |
Bits (nøyaktighet) |
No of Clock |
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 for å velge Power down Mode of ADC i LPC2148.
- A / D er i PDN-modus.
- A / D er i driftsmodus
6. START: Bittene fra (24 til 26) er for START. Når BURST-konverteringsmodus er AV ved å sette 0, er disse START-bitene nyttige for når du skal starte A / D-konvertering. START brukes også til kantstyrt konvertering. Det er da det er en inngang i CAP eller MAT pin av LPC2148 A / D begynner å konvertere. La oss sjekke tabellen nedenfor
Verdi for bit (24 til 26) |
Pin's of LPC2148 |
Funksjonen til ADC |
000 |
Brukes til å sette ADC i PDN-modus 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 på 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 for EDGE brukes bare når START bit inneholder 010-111. Det starter konvertering når det er CAP- eller MAT-inngang, du kan se tabellen ovenfor for det.
Innstilling : 0 - På fallende kant
1 - On Rising Edge
ADxGDR: ADC Global Data Register
AD0GDR og AD1GDR for henholdsvis ADC kanal 0 og ADC kanal 1.
Det er et 32-bits register som inneholder RESULTATET av A / D-konvertering og også DONE-biten som indikerer at A / D-konvertering er gjort. Tabellen nedenfor viser bitfeltene for ADGDR-registeret.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
FERDIG |
OVERKJØRING |
RESERVERT |
CHN |
RESERVERT |
RESULTAT |
RESERVERT |
1. RESULTAT: Disse bitene (6 til 15) inneholder resultatet av A / D-konvertering for den valgte kanalen i ADCR SEL-registeret. Verdien leses bare etter at A / D-konverteringen er fullført, og dette indikeres med FERDIG bit.
EKSEMPEL: For et 10-biters ADC-resultat varierer den lagrede verdien fra (0 til 1023).
2. KANAL: Disse bitene 24 til 26 inneholder kanalnummeret som A / D-konverteringen gjøres for. Den konverterte digitale verdien er tilstede i RESULTAT-bit.
EKSEMPEL: 000 er for ADC-kanal 0 og 001 er for ADC-kanal 1 osv
3. DATA: De 30 th bit for DATA blir brukt i burst mode. Når du setter 1, blir den tidligere konverterte ADC-verdien overskrevet av den nylig konverterte ADC-verdien. Når registeret leses, tømmes OVERRUN-biten.
4. FERDIG: Den 31. biten er for FERDIG bit.
Sett 1: Når A / D-konvertering er fullført.
Sett 0: Når registeret leses og ADCR skrives.
Vi har sett om viktige registre som brukes i ADC i LPC2148. Nå kan vi begynne å bruke ADC i ARM7.
Komponenter kreves
Maskinvare
- ARM7-LPC2148 mikrokontroller
- 3,3V spenningsregulator IC
- 5V spenningsregulator IC
- 10K potensiometer - 2 nr
- LED (hvilken som helst farge)
- LCD-skjerm (16X2)
- 9V batteri
- Brettbrett
- Koble ledninger
Programvare
- Keil uVision5
- Magic Flash Tool
Kretsdiagram
Tabellen nedenfor viser kretsforbindelsene mellom LCD og ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapinne 4) |
P0.13 |
D5 (datapinne 5) |
P0.14 |
D6 (datapinne 6) |
P0.15 |
D7 (datapinne 7) |
Lær mer om bruk av LCD med ARM 7 - LPC2148.
VIKTIG: Her bruker vi to spenningsregulator-ICer, en for 5V LCD-skjerm og en annen 3,3V for analog inngang som kan varieres med potensiometer.
Forbindelser mellom 5V spenningsregulator med LCD og ARM7 Stick
5V spenningsregulator IC |
Pin-funksjon |
LCD & ARM-7 LPC2148 |
1. venstre pin |
+ Ve fra batteri 9V inngang |
NC |
2. sentrum pin |
- Ve fra batteri |
VSS, R / W, K på LCD GND av ARM7 |
3. høyre pin |
Regulert + 5V utgang |
VDD, A av LCD + 5V av ARM7 |
Potensiometer med LCD
Et potensiometer brukes til å variere kontrasten på LCD-skjermen. En pott har tre pinner, venstre pinne (1) er koblet til + 5V og midt (2) til VEE eller V0 på LCD-modulen og høyre pinne (3) er koblet til GND. Vi kan justere kontrasten ved å vri på knotten.
Forbindelse mellom LPC2148 og potensiometer med 3,3 V spenningsregulator
3,3V spenningsregulator IC |
Pin-funksjon |
ARM-7 LPC2148 |
1. venstre pin |
- Ve fra batteri |
GND-pinne |
2. sentrum pin |
Regulert + 3.3V utgang |
Til potensiometer Inngang og potensiometer utgang til P0.28 |
3. høyre pin |
+ Ve fra batteri 9V inngang |
NC |
Programmering ARM7-LPC2148 for ADC
For å programmere ARM7-LPC2148 trenger vi keil uVision & Flash Magic verktøy. Vi bruker USB-kabel til å programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjelp av Keil og lager en hex-fil, og deretter blinkes HEX-filen til ARM7-pinne ved hjelp av Flash Magic. Hvis du vil vite mer om å installere keil uVision og Flash Magic og hvordan du bruker dem, kan du følge lenken Komme i gang med ARM7 LPC2148 Microcontroller og programmere den ved hjelp av Keil uVision.
I denne opplæringen konverterer vi den analoge inngangsspenningen (0 til 3,3 V) til digital verdi ved å bruke ADC i LPC2148 og viser den analoge spenningen på LCD-skjermen (16x2). Et potensiometer vil bli brukt til å variere den analoge inngangsspenningen.
For å vite mer om grensesnitt LCD med ARM7-LPC2148 4-bits modus, følg denne lenken.
Den komplette koden for bruk av ADC med ARM 7 er gitt på slutten av denne opplæringen, her forklarer vi noen få deler av den.
Trinn involvert i LPC2148-ADC programmering
1. PINSEL-registeret brukes til å velge portpinnen til LPC2148 og ADC-funksjonen som analog inngang.
PINSEL1 = 0x01000000; // Velg P0.28 som AD0.1
2. Velg klokke- og bitnøyaktighet for konvertering ved å skrive verdi til ADxCR (ADC-kontrollregister).
AD0CR = 0x00200402; // Stiller ADC-drift som 10-bits / 11 CLK for konvertering (000)
3. Start konverteringen ved å skrive verdien til START-bits i ADxCR.
Her har jeg skrevet til 24 th litt AD0CR register.
AD0CR = AD0CR - (1 << 24);
4. Nå skal vi sjekke DONE-biten (31.) av tilsvarende ADxDRy (ADC-dataregister) når den endres fra 0 til 1. Så vi bruker mens loop for å kontinuerlig sjekke om konvertering er gjort på den 31. biten av dataregisteret.
mens (! (AD0DR1 & 0x80000000));
5. Etter at ferdig bit er satt til 1, er konvertering vellykket, neste gang leser vi resultatet fra samme ADC-dataregister AD0DR1 og lagrer verdien i en variabel.
adcvalue = AD0DR1;
Deretter bruker vi en formel for å konvertere den digitale verdien til spenning og lagre i en variabel som heter spenning .
spenning = ((adcvalue / 1023.0) * 3.3);
5. Følgende linjer brukes til å vise digitale verdier (0 til 1023) etter analog til digital konvertering.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Vis ADC-verdi (0 til 1023)
6. Følgende linjer brukes til å vise inngangsspenning (0 til 3,3 V) etter analog til digital konvertering og etter trinn 5.
LCD_SEND (0xC0); sprintf (voltvalue, "Voltage =%. 2f V", voltage); LCD_DISPLAY (spenningsverdi); // Display (analog inngangsspenning)
7. Nå må vi vise inngangsspenningen og digitale verdier på LCD-skjermen. Før det må vi initialisere LCD-skjermen og bruke passende kommandoer for å sende meldinger for å vise.
Koden nedenfor brukes til å initialisere LCD-skjermen
ugyldig LCD_INITILIZE (ugyldig) // Funksjon for å gjøre klar LCD-skjermen { IO0DIR = 0x0000FFF0; // Setter pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som OUTPUT delay_ms (20); LCD_SEND (0x02); // Initier lcd i 4-biters modus LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markøren av LCD_SEND (0x06); // Automatisk økningsmarkør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje førsteplass }
Koden nedenfor brukes til å vise verdiene på LCD-skjermen
void LCD_DISPLAY (char * msg) // Funksjon for å skrive tegnene sendes etter hverandre { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender Upper nibble IO0SET = 0x00000050; // RS HIGH & AKTIVER HIGH for å skrive ut data IO0CLR = 0x00000020; // RW LOW Skrivemodus delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uendret (dvs. RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre knabb IO0SET = 0x00000050; // RS & EN HØY IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Funksjonen nedenfor brukes til å skape forsinkelse
ugyldig delay_ms (uint16_t j) // Funksjon for å gjøre forsinkelse i millisekunder { uint16_t x, i; for (i = 0; i
Komplett kode med demonstrasjonsvideo er gitt nedenfor.