- Què és l'ADC?
- ADC a ARM7-LPC2148
- Pins ADC a ARM7-LPC2148
- Registres ADC a ARM7-LPC2148
- Registre ADxCR a LPC2148
- ADxGDR: registre global de dades ADC
- Components necessaris
- Esquema de connexions
- Programació ARM7-LPC2148 per ADC
Al món de l’electrònica hi ha moltes varietats de sensors analògics al mercat que s’utilitzen per mesurar la temperatura, la velocitat, el desplaçament, la pressió, etc. Els sensors analògics s’utilitzen per produir una sortida que canvia contínuament al llarg del temps. Aquests senyals dels sensors analògics tendeixen a tenir un valor molt reduït des d’uns quants micro-volts (uV) fins a diversos mili-volts (mV), de manera que cal una forma d’amplificació. Per utilitzar aquests senyals analògics en microcontrolador, hem de convertir el senyal analògic en senyal digital, ja que el microcontrolador només entén i processa els senyals digitals. Per tant, la majoria del microcontrolador té una característica important incorporada anomenada ADC (convertidor analògic a digital). El nostre microcontrolador ARM7-LPC2148 també té una funció ADC.
En aquest tutorial veurem com utilitzar ADC a ARM7-LPC2148 subministrant un voltatge variable a un pin analògic i el mostrarem a la pantalla LCD de 16x2 després de la conversió analògica a digital. Comencem, doncs, amb una breu introducció sobre ADC.
Què és l'ADC?
Com es va dir anteriorment, ADC significa conversió analògica a digital i s’utilitza per convertir valors analògics del món real en valors digitals com l’1 i el 0. Quins són, doncs, aquests valors analògics? Aquests són els que veiem en el nostre dia a dia com la temperatura, la velocitat, la brillantor, etc. Aquests paràmetres es mesuren com a tensions analògiques mitjançant els respectius sensors i, a continuació, aquests valors analògics es converteixen en valors digitals per als microcontroladors.
Suposem que el nostre rang d'ADC és de 0V a 3,3V i que tenim un ADC de 10 bits, això significa que la nostra tensió d'entrada 0-3,3 volts es dividirà en 1024 nivells de valors analògics discrets (2 10 = 1024). El significat 1024 és la resolució per a un ADC de 10 bits, de manera similar per a una resolució ADC de 8 bits serà 512 (28) i per a una resolució ADC de 16 bits serà 65.536 (216). LPC2148 té l'ADC de resolució de 10 bits.
Amb això, si la tensió d'entrada real és 0V, l'ADC de l'MCU el llegirà com a 0 i, si és de 3,3V, l'MCU llegirà 1024 i, si es troba en algun lloc entre 1,65v, l'MCU llegirà 512. Podem utilitzar el fórmules per calcular el valor digital que llegirà la MCU en funció de la resolució de l'ADC i la tensió de funcionament.
(Resolució ADC / Voltatge de funcionament) = (Valor digital ADC / Valor de tensió real)
Com per exemple, si la tensió de referència és 3v:

Vam explicar ADC amb detall a l'article anterior.
ADC a ARM7-LPC2148
- El LPC2148 conté dos convertidors analògics a digitals.
- Aquests convertidors són convertidors analògics digitals successius d’aproximació successiva de 10 bits.
- Mentre que ADC0 té sis canals, ADC1 té vuit canals.
- Per tant, el nombre total d’ entrades ADC disponibles per a LPC2148 és de 14.
- Converteix la tensió d’entrada només en el rang de (0 a 3,3 V). No ha de superar els 3,3 V de la tensió de referència. Ja que danyarà el CI i també proporcionarà valors incerts.
Algunes característiques importants de l'ADC a LPC2148
- Cada convertidor és capaç de realitzar més de 400.000 mostres de 10 bits per segon.
- Cada entrada analògica té un registre de resultats dedicat per reduir la sobrecàrrega de la interrupció.
- Mode de conversió en ràfega per a entrades simples o múltiples.
- Conversió opcional en transició en pin d'entrada o senyal de coincidència del temporitzador.
- Ordre d’inici global per als dos convertidors.
Comproveu també com utilitzar ADC en altres microcontroladors:
- Com utilitzar ADC a Arduino Uno?
- Interfície ADC0808 amb microcontrolador 8051
- Ús del mòdul ADC del microcontrolador PIC
- Tutorial ADC de Raspberry Pi
- Com s'utilitza ADC a MSP430G2: mesurament de la tensió analògica
- Com utilitzar ADC a STM32F103C8
Pins ADC a ARM7-LPC2148
Com es va dir a Earliar, a ARM7-LPC2148 hi ha dos canals ADC0 amb 6 pins d'entrada analògics i ADC1 amb 8 pins d'entrada analògics. Així doncs, hi ha totalment 14 pins per a entrades analògiques. El diagrama següent mostra els pins disponibles per a l'entrada analògica.

Atès que els pins d'entrada ADC es multiplexen amb altres pins GPIO. Els hem d’habilitar configurant el registre PINSEL per seleccionar la funció ADC.
La taula següent mostra els pins de l'ADC i el número respectat del canal ADC a LPC2148. AD0 és el canal 0 i AD1 és el canal 1
|
LPC2148 Pin |
Canal ADC núm |
|
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 |
Registres ADC a ARM7-LPC2148
Els registres s’utilitzen en la programació per utilitzar la funció de conversió A / D a LPC2148.
A continuació es mostra una llista de registres utilitzats a LPC2148 per a la conversió A / D
1. ADCR: registre de control analògic i digital
Ús: aquest registre s’utilitza per configurar el convertidor A / D a LPC2148
2. ADGDR: registre de dades globals analògic a digital
Ús: aquest registre té un bit FET per al convertidor A / D i el RESULTAT de la conversió s’emmagatzema aquí.
3. ADINTERN: registre d’activació d’interrupcions analògiques a digitals
Ús: es tracta d’un registre d’activació d’interrupcions.
4. ADDR0 - ADDR7: registre de dades de canal analògic a digital
Ús: aquest registre conté el valor A / D dels canals respectius.
5. ADSTAT: registre d'estat analògic a digital.
Ús: aquest registre conté el senyalADOR FET per al canal ADC respectiu i també el senyal OVERRUN per al canal ADC respectiu.
En aquest tutorial utilitzarem només registres ADCR i ADGDR. Vegem-ne detalladament
Registre ADxCR a LPC2148
AD0CR i AD1CR per al canal 0 i el canal 1 respectivament. És un registre de 32 bits. A la taula següent s’indiquen els camps de bits per al registre ADCR.
|
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
|
RESERVAT |
EDGE |
COMENÇAR |
RESERVAT |
PDN |
RESERVAT |
CLKS |
EXPLOSIÓ |
CLCKDIV |
SEL |
Vegem com configurar registres individuals
1. SEL: Els bits de (0 a 7) s'utilitzen per seleccionar el canal de conversió ADC. Es concedeix un bit per a cada canal. Per exemple, si configureu el bit-0, l'ADC mostrarà AD0.1 per a la conversió. I establir el bit -1 farà que AD0.1; de manera similar, configurant el bit-7 es farà la conversió per a AD0.7. El pas important és que tenim PINSEL segons el port que estem utilitzant, per exemple, PINSEL0 per a PORT0 a PLC2148.
2. CLCKDIV: els bits de (8 a 15) són per al divisor de rellotge. Aquí el rellotge APB (ARM Peripheral Bus clock) es divideix per aquest valor més un per produir el rellotge necessari per al convertidor A / D, que hauria de ser inferior o igual a 4,5 MHz ja que estem utilitzant el mètode d’aproximació successiva a LPC2148.
3. BURST: el bit 16 s'utilitza per al mode de conversió BURST.
Configuració 1: l'ADC farà la conversió de tots els canals seleccionats en bits SEL.
Configuració 0: desactivarà el mode de conversió BURST.
4. CLCKS: els bits de (17 a 19) tres bits s’utilitzen per seleccionar la resolució i el nombre de rellotges per a la conversió A / D en mode ràfega ja que és un mode de conversió A / D continu.
|
Valor dels bits (17 a 19) |
Bits (precisió) |
No de rellotge |
|
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: el bit 21 serveix per seleccionar el mode de desconnexió de l'ADC a LPC2148.
- A / D està en mode PDN.
- A / D està en mode operatiu
6. START: els bits de (24 a 26) són per a START. Quan el mode de conversió BURST està DESACTIVAT configurant 0, aquests bits START són útils per iniciar la conversió A / D. El START també s’utilitza per a la conversió controlada per vora. És aleshores quan hi ha una entrada al pin CAP o MAT de LPC2148, l'A / D comença a convertir-se. Consulteu la taula següent
|
Valor per a bits (24 a 26) |
Pin's de LPC2148 |
Funció de l'ADC |
|
000 |
S'utilitza per configurar ADC en mode PDN Sense inici |
|
|
001 |
Inicieu la conversió A / D |
|
|
010 |
CAP0.2 / MAT0.2 |
Inicieu la conversió A / D a EDGE seleccionada al pin 27 (Pujant o Baixant) als pins CAP / MAT de LPC2148 |
|
011 |
CAP0.0 / MAT0.0 |
|
|
100 |
MAT0.1 |
|
|
101 |
MAT0.3 |
|
|
110 |
MAT1.0 |
|
|
111 |
MAT1.1 |
7. EDGE: El 27 º bit és per EDGE s'utilitza només quan el bit d'inici conté 010-111. Comença la conversió quan hi ha entrada CAP o MAT que podeu veure a la taula superior per a això.
Configuració : 0 - A Falling Edge
1 - On Rising Edge
ADxGDR: registre global de dades ADC
AD0GDR i AD1GDR per al canal ADC 0 i el canal ADC 1 respectivament.
Es tracta d’un registre de 32 bits que conté el RESULTAT de la conversió A / D i també el bit FET que indica que s’ha fet la conversió A / D. La taula següent indica els camps de bits per al registre ADGDR.
|
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
|
FET |
SUPERFUNCIÓ |
RESERVAT |
CHN |
RESERVAT |
RESULTAT |
RESERVAT |
1. RESULTAT: Aquests bits (6 a 15) contenen el resultat de la conversió A / D del canal seleccionat al registre ADCR SEL. El valor només es llegeix un cop finalitzada la conversió A / D i així ho indica el bit FET.
EXEMPLE: per a un resultat ADC de 10 bits, el valor emmagatzemat varia de (0 a 1023).
2. CANAL: Aquests bits 24 a 26 contenen el número de canal per al qual es fa la conversió A / D. El valor digital convertit és present al bit RESULT.
EXEMPLE: 000 és per al canal ADC 0 i 001 per al canal ADC 1, etc.
3. overrun: El 30 º bits per overrun s'utilitza en mode de ràfega. Quan es defineix 1, el valor ADC convertit anterior es sobreescriu pel valor ADC acabat de convertir. Quan es llegeix el registre, esborra el bit OVERRUN.
4. FET: el bit 31è és per al bit FET.
Conjunt 1: quan s'hagi completat la conversió A / D.
Conjunt 0: quan es llegeix el registre i s’escriu l’ADCR.
Hem vist sobre els registres importants que s’utilitzen a ADC a LPC2148. Ara comencem a utilitzar ADC a ARM7.
Components necessaris
Maquinari
- Microcontrolador ARM7-LPC2148
- CI regulador de voltatge de 3,3 V
- Regulador de tensió 5V IC
- Potenciòmetre 10K - 2 núm
- LED (qualsevol color)
- Pantalla LCD (16X2)
- Bateria de 9V
- Taula de pa
- Connexió de cables
Programari
- Keil uVision5
- Eina Magic Flash
Esquema de connexions


La taula següent mostra les connexions de circuits entre LCD i ARM7-LPC2148.
|
ARM7-LPC2148 |
LCD (16x2) |
|
P0.4 |
RS (Selecciona registre) |
|
P0.6 |
E (Activa) |
|
P0.12 |
D4 (pin de dades 4) |
|
P0.13 |
D5 (pin de dades 5) |
|
P0.14 |
D6 (pin de dades 6) |
|
P0.15 |
D7 (pin de dades 7) |
Obteniu més informació sobre l’ús de la pantalla LCD amb ARM 7 - LPC2148.
IMPORTANT: aquí estem utilitzant dos CI de regulador de voltatge, un per a pantalla LCD de 5V i un altre de 3,3V per a entrada analògica que es pot variar mitjançant un potenciòmetre.
Connexions entre regulador de voltatge de 5V amb LCD i pal ARM7
|
CI de regulador de tensió 5V |
Funció Pin |
LCD i ARM-7 LPC2148 |
|
1. Pin esquerre |
+ Ve de la bateria d'entrada de 9V |
NC |
|
2. Pin del centre |
- Ve de la bateria |
VSS, R / W, K de pantalla LCD GND de ARM7 |
|
3. Pin dret |
Sortida regulada + 5V |
VDD, A de pantalla LCD + 5 V d'ARM7 |
Potenciòmetre amb pantalla LCD
Es fa servir un potenciòmetre per variar el contrast de la pantalla LCD. Un pot té tres pins, el pin esquerre (1) està connectat a + 5V i el centre (2) a VEE o V0 del mòdul LCD i el pin dret (3) està connectat a GND. Podem ajustar el contrast girant el pom.
Connexió entre LPC2148 i potenciòmetre amb regulador de voltatge de 3,3V
|
CI de regulador de voltatge de 3,3 V |
Funció Pin |
ARM-7 LPC2148 |
|
1. Pin esquerre |
- Ve de la bateria |
Pin GND |
|
2. Pin del centre |
Sortida regulada + 3,3V |
A l'entrada del potenciòmetre i sortida del potenciòmetre a P0.28 |
|
3. Pin dret |
+ Ve de la bateria d'entrada de 9V |
NC |
Programació ARM7-LPC2148 per ADC
Per programar ARM7-LPC2148 necessitem l'eina keil uVision i Flash Magic. Estem utilitzant un cable USB per programar ARM7 Stick mitjançant un port micro USB. Escrivim codi amb Keil i creem un fitxer hexadecimal i, a continuació, el fitxer HEX es converteix en un pal ARM7 mitjançant Flash Magic. Per obtenir més informació sobre com instal·lar keil uVision i Flash Magic i com utilitzar-los, seguiu l’enllaç Introducció al microcontrolador ARM7 LPC2148 i programeu-lo mitjançant Keil uVision.
En aquest tutorial convertim la tensió d'entrada analògica (de 0 a 3,3 V) en valor digital mitjançant l'ADC a LPC2148 i mostrem la tensió analògica a la pantalla LCD (16x2). S’utilitzarà un potenciòmetre per variar la tensió analògica d’entrada.
Per obtenir més informació sobre la interfície LCD amb el mode de 4 bits ARM7-LPC2148, seguiu aquest enllaç.
El codi complet per utilitzar ADC amb ARM 7 es dóna al final d’aquest tutorial, aquí en detallem algunes parts.
Passos relacionats amb la programació LPC2148-ADC
1. El registre PINSEL s'utilitza per seleccionar el pin de port de LPC2148 i la funció ADC com a entrada analògica.
PINSEL1 = 0x01000000; // Seleccioneu P0.28 com a AD0.1
2. Seleccioneu la precisió del rellotge i dels bits per a la conversió escrivint valor al ADxCR (registre de control ADC).
AD0CR = 0x00200402; // Estableix l'operació ADC com a 10 bits / 11 CLK per a la conversió (000)
3. Inicieu la conversió escrivint el valor a START bits a ADxCR.
Aquí he escrit a 24 º mica de registre AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Ara hem de comprovar el bit FET (31è) del corresponent ADxDRy (registre de dades ADC) ja que canvia de 0 a 1. Per tant, fem servir loop mentre que comprovem constantment si la conversió es fa al 31è bit de registre de dades.
while (! (AD0DR1 i 0x80000000));
5. Després que el bit finalitzat estigui establert a 1, la conversió és correcta; a continuació, llegim el resultat del mateix registre de dades ADC AD0DR1 i emmagatzemem el valor en una variable.
adcvalue = AD0DR1;
A continuació, fem servir una fórmula per convertir el valor digital a voltatge i emmagatzemar-lo en una variable anomenada voltatge .
voltatge = ((adcvalue / 1023.0) * 3.3);
5. Les línies següents s'utilitzen per mostrar valors digitals (de 0 a 1023) després de la conversió analògica a digital.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Mostra el valor ADC (0 a 1023)
6. Les línies següents s’utilitzen per mostrar la tensió analògica d’entrada (de 0 a 3,3 V) després de la conversió analògica a digital i després del pas 5.
LCD_SEND (0xC0); sprintf (voltatge, "Voltatge =%. 2f V", tensió); LCD_DISPLAY (voltatge); // Visualització (tensió analògica d’entrada)
7. Ara hem de mostrar el voltatge d'entrada i els valors digitals a la pantalla LCD. Abans d'això, hem d'inicialitzar la pantalla LCD i utilitzar les ordres adequades per enviar el missatge a mostrar.
Sota el codi s'utilitza per inicialitzar la pantalla LCD
void LCD_INITILIZE (void) // Funció per preparar la pantalla LCD { IO0DIR = 0x0000FFF0; // Estableix el pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 com OUTPUT delay_ms (20); LCD_SEND (0x02); // Inicialitzar lcd en mode de funcionament de 4 bits LCD_SEND (0x28); // 2 línies (16X2) LCD_SEND (0x0C); // Mostra el cursor desactivat LCD_SEND (0x06); // Cursor d'increment automàtic LCD_SEND (0x01); // Mostra LCD_SEND clar (0x80); // Primera línia primera posició }
A sota del codi s’utilitza per mostrar els valors a la pantalla LCD
LCD_DISPLAY buit (char * msg) // Funció per imprimir els caràcters enviar 1-1 { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envia mordassa superior IO0SET = 0x00000050; // RS HIGH & ACTIVE HIGH per imprimir dades IO0CLR = 0x00000020; // RW LOW Mode d'escriptura delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS i RW sense canvis (és a dir, RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envia un picet inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
La funció següent s'utilitza per crear un retard
void delay_ms (uint16_t j) // Funció per fer un retard en mil·lisegons { uint16_t x, i; per a (i = 0; i
A continuació es mostra el codi complet amb el vídeo de demostració.
