- ¿Qué es ADC?
- ADC en ARM7-LPC2148
- Pines ADC en ARM7-LPC2148
- Registros ADC en ARM7-LPC2148
- Registro ADxCR en LPC2148
- ADxGDR: Registro de datos global de ADC
- Componentes requeridos
- Diagrama de circuito
- Programación de ARM7-LPC2148 para ADC
En el mundo de la electrónica, existen muchas variedades de sensores analógicos en el mercado que se utilizan para medir temperatura, velocidad, desplazamiento, presión, etc. Los sensores analógicos se utilizan para producir resultados que cambian continuamente con el tiempo. Estas señales de los sensores analógicos tienden a tener un valor muy pequeño, desde unos pocos microvoltios (uV) hasta varios milivoltios (mV), por lo que se requiere alguna forma de amplificación. Para usar estas señales analógicas en un microcontrolador, necesitamos convertir la señal analógica en señal digital, ya que el microcontrolador entiende y procesa solo señales digitales. Entonces, la mayoría de los microcontroladores tienen una característica importante incorporada llamada ADC (convertidor analógico a digital). Nuestro microcontrolador ARM7-LPC2148 también tiene una función ADC.
En este tutorial veremos cómo usar ADC en ARM7-LPC2148 al suministrar un voltaje variable a un pin analógico y mostrarlo en la pantalla LCD 16x2 después de la conversión analógica a digital. Empecemos por una breve introducción sobre ADC.
¿Qué es ADC?
Como se dijo anteriormente, ADC significa conversión analógica a digital y se usa para convertir valores analógicos del mundo real en valores digitales como 1 y 0. Entonces, ¿cuáles son estos valores analógicos? Estos son los que vemos en nuestro día a día como temperatura, velocidad, brillo, etc. Estos parámetros se miden como voltajes analógicos por sensores respectivos y luego estos valores analógicos se convierten en valores digitales para microcontroladores.
Supongamos que nuestro rango de ADC es de 0V a 3.3V y tenemos un ADC de 10 bits, esto significa que nuestro voltaje de entrada de 0-3.3 Voltios se dividirá en 1024 niveles de valores analógicos discretos (2 10 = 1024). Lo que significa que 1024 es la resolución para un ADC de 10 bits, de manera similar, para un ADC de 8 bits, la resolución será 512 (28) y para un ADC de 16 bits, la resolución será 65,536 (216). LPC2148 tiene el ADC de resolución de 10 bits.
Con esto, si el voltaje de entrada real es 0V, entonces el ADC de la MCU lo leerá como 0 y si es 3.3V, la MCU leerá 1024 y si está en algún lugar entre 1,65v, entonces la MCU leerá 512. Podemos usar lo siguiente fórmulas para calcular el valor digital que leerá el MCU en función de la resolución del ADC y el voltaje de funcionamiento.
(Resolución ADC / Voltaje de funcionamiento) = (Valor digital ADC / Valor de voltaje real)
Como por ejemplo si el voltaje de referencia es 3v:
Explicamos ADC en detalle en el artículo anterior.
ADC en ARM7-LPC2148
- El LPC2148 contiene dos convertidores de analógico a digital.
- Estos convertidores son convertidores analógicos a digitales de aproximación sucesiva simple de 10 bits.
- Mientras que ADC0 tiene seis canales, ADC1 tiene ocho canales.
- Por lo tanto, el número total de entradas ADC disponibles para LPC2148 es 14.
- Convierte el voltaje de entrada en el rango de (0 a 3.3V) solamente. No debe exceder los 3.3V de la referencia de voltaje. Ya que dañará el IC y también proporcionará valores inciertos.
Alguna característica importante de ADC en LPC2148
- Cada convertidor es capaz de realizar más de 400000 muestras de 10 bits por segundo.
- Cada entrada analógica tiene un registro de resultados dedicado para reducir la sobrecarga de interrupciones.
- Modo de conversión en ráfaga para entradas únicas o múltiples.
- Conversión opcional en la transición en el pin de entrada o la señal de coincidencia del temporizador.
- Comando de inicio global para ambos convertidores.
También verifique cómo usar ADC en otros microcontroladores:
- ¿Cómo usar ADC en Arduino Uno?
- Interfaz ADC0808 con microcontrolador 8051
- Usando el módulo ADC del microcontrolador PIC
- Tutorial de Raspberry Pi ADC
- Cómo usar ADC en MSP430G2 - Medición de voltaje analógico
- Cómo utilizar ADC en STM32F103C8
Pines ADC en ARM7-LPC2148
Como se dijo anteriormente, en ARM7-LPC2148 hay dos canales ADC0 con 6 pines de entrada analógica y ADC1 con 8 pines de entrada analógica. Así que hay 14 pines para entradas analógicas. El siguiente diagrama muestra los pines que están disponibles para entrada analógica.
Dado que los pines de entrada ADC están multiplexados con otros pines GPIO. Necesitamos habilitarlos configurando el registro PINSEL para seleccionar la función ADC.
La siguiente tabla muestra los pines de ADC y el canal ADC respetado no en LPC2148. AD0 es el canal 0 y AD1 es el canal 1
Pin LPC2148 |
Canal ADC No |
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 |
Registros ADC en ARM7-LPC2148
Los registros se utilizan en la programación para utilizar la función de conversión A / D en LPC2148.
A continuación se muestra una lista de registros utilizados en LPC2148 para conversión A / D
1. ADCR: Registro de control analógico a digital
Uso: Este registro se utiliza para configurar el convertidor A / D en LPC2148
2. ADGDR: Registro de datos globales analógico a digital
Uso: Este registro tiene el bit DONE para el convertidor A / D y el RESULTADO de la conversión se almacena aquí.
3. ADINTERN: Registro de habilitación de interrupciones de analógico a digital
Uso: Este es un registro de habilitación de interrupciones.
4. ADDR0 - ADDR7: Registro de datos de canal analógico a digital
Uso: Este registro contiene el valor A / D para los canales respectivos.
5. ADSTAT: Registro de estado analógico a digital.
Uso: Este registro contiene el indicador DONE para el canal ADC respectivo y también el indicador OVERRUN para el canal ADC respectivo.
En este tutorial utilizaremos únicamente registros ADCR y ADGDR. Veamos sobre ellos en detalle
Registro ADxCR en LPC2148
AD0CR y AD1CR para canal 0 y canal 1 respectivamente. Es un registro de 32 bits. La siguiente tabla indica los campos de bits para el registro ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
dieciséis |
15: 8 |
7: 0 |
RESERVADO |
BORDE |
COMIENZO |
RESERVADO |
PDN |
RESERVADO |
CLKS |
ESTALLAR |
CLCKDIV |
SEL |
Veamos cómo configurar registros individuales.
1. SEL: Los bits de (0 a 7) se utilizan para seleccionar el canal para la conversión ADC. Se asigna un bit para cada canal. Por ejemplo, la configuración del Bit-0 hará que el ADC muestre AD0.1 para la conversión. Y establecer el bit -1 hará que AD0.1; de manera similar, la configuración del bit-7 hará la conversión para AD0.7. Un paso importante es que tenemos PINSEL de acuerdo con el puerto que estamos usando, por ejemplo, PINSEL0 para PORT0 en PLC2148.
2. CLCKDIV: Los bits de (8 a 15) son para Clock Divisor. Aquí el reloj APB (reloj del bus periférico ARM) se divide por este valor más uno para producir el reloj requerido para el convertidor A / D, que debe ser menor o igual a 4.5 MHz ya que estamos usando el método de aproximación sucesiva en LPC2148.
3. BURST: El bit 16 se utiliza para el modo de conversión BURST.
Configuración 1: El ADC hará la conversión para todos los canales que estén seleccionados en bits SEL.
Configuración 0: Desactiva el modo de conversión BURST.
4. CLCKS: Los bits de (17 a 19) tres bits se utilizan para seleccionar la resolución y el número de relojes para la conversión A / D en modo ráfaga, ya que es el modo de conversión A / D continuo.
Valor para bits (17 a 19) |
Bits (precisión) |
No de reloj |
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 es para seleccionar el modo de apagado del ADC en LPC2148.
- A / D está en modo NEM.
- A / D está en modo operativo
6. INICIO: Los bits del (24 al 26) son para INICIO. Cuando el modo de conversión RÁFAGA está APAGADO al establecer 0, estos bits de INICIO son útiles para cuándo iniciar la conversión A / D. El INICIO también se utiliza para conversión controlada por bordes. Es entonces cuando hay una entrada en el pin CAP o MAT de LPC2148, el A / D comienza a convertir. Veamos la siguiente tabla
Valor por bits (24 a 26) |
Pin de LPC2148 |
Función de ADC |
000 |
Se usa para configurar ADC en modo PDN Sin inicio |
|
001 |
Iniciar conversión A / D |
|
010 |
CAP0.2 / MAT0.2 |
Inicie la conversión A / D en EDGE seleccionado en el pin 27 (ascendente o descendente) en los pines 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 es para EDGE se utiliza sólo cuando el bit de inicio contiene 010-111. Comienza la conversión cuando hay una entrada CAP o MAT que puede ver la tabla de arriba para eso.
Configuración : 0 - En el borde descendente
1 - En Rising Edge
ADxGDR: Registro de datos global de ADC
AD0GDR y AD1GDR para ADC Canal 0 y ADC canal 1 respectivamente.
Es un registro de 32 bits que contiene el RESULTADO de la conversión A / D y también el bit DONE que indica que se realizó la conversión A / D. La siguiente tabla indica los campos de bits para el registro ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
HECHO |
INVADIR |
RESERVADO |
CHN |
RESERVADO |
RESULTADO |
RESERVADO |
1. RESULTADO: Estos bits (6 a 15) contienen el resultado de la conversión A / D para el canal seleccionado en el registro ADCR SEL. El valor se lee solo después de que se completa la conversión A / D y esto se indica con el bit DONE.
EJEMPLO: Para un resultado de ADC de 10 bits, el valor almacenado varía de (0 a 1023).
2. CANAL: Estos bits 24 a 26 contienen el número de canal para el que se realiza la conversión A / D. El valor digital convertido está presente en el bit RESULTADO.
EJEMPLO: 000 es para el canal ADC 0 y 001 es para el canal ADC 1, etc.
3. OVERRUN: El 30 º bits para OVERRUN se utiliza en modo de ráfaga. Cuando se establece 1, el valor ADC convertido anteriormente se sobrescribe con el valor ADC recién convertido. Cuando se lee el registro, borra el bit OVERRUN.
4. DONE: El bit 31 es para el bit DONE.
Conjunto 1: cuando se completa la conversión A / D.
Establecer 0: cuando se lee el registro y se escribe ADCR.
Hemos visto los registros importantes que se utilizan en ADC en LPC2148. Ahora comencemos a usar ADC en ARM7.
Componentes requeridos
Hardware
- Microcontrolador ARM7-LPC2148
- Regulador de voltaje de 3.3V IC
- Regulador de voltaje 5V IC
- Potenciómetro 10K - 2 Nos
- LED (cualquier color)
- Pantalla LCD (16X2)
- Batería de 9V
- Tablero de circuitos
- Conexión de cables
Software
- Keil uVision5
- Herramienta de flash mágico
Diagrama de circuito
La siguiente tabla muestra las conexiones del circuito entre LCD y ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Seleccionar registro) |
P0.6 |
E (habilitar) |
P0.12 |
D4 (pin de datos 4) |
P0.13 |
D5 (pin de datos 5) |
P0.14 |
D6 (pin de datos 6) |
P0.15 |
D7 (pin de datos 7) |
Obtenga más información sobre el uso de LCD con ARM 7 - LPC2148.
IMPORTANTE: Aquí estamos usando dos circuitos integrados reguladores de voltaje, uno para la pantalla LCD de 5 V y otro de 3,3 V para la entrada analógica que se puede variar con un potenciómetro.
Conexiones entre el regulador de voltaje de 5 V con LCD y ARM7 Stick
Regulador de voltaje de 5 V IC |
Función pin |
LCD y ARM-7 LPC2148 |
1.Pin izquierdo |
+ Ve de la batería Entrada 9V |
CAROLINA DEL NORTE |
2.Pin central |
- Ve de la batería |
VSS, R / W, K de LCD GND de ARM7 |
3.Pin derecho |
Salida regulada de +5 V |
VDD, A de LCD + 5V de ARM7 |
Potenciómetro con LCD
Se utiliza un potenciómetro para variar el contraste de la pantalla LCD. Una olla tiene tres pines, el pin izquierdo (1) está conectado a + 5V y el centro (2) a VEE o V0 del módulo LCD y el pin derecho (3) está conectado a GND. Podemos ajustar el contraste girando el mando.
Conexión entre LPC2148 y potenciómetro con regulador de voltaje de 3.3V
Regulador de voltaje de 3.3V IC |
Función pin |
ARM-7 LPC2148 |
1.Pin izquierdo |
- Ve de la batería |
Pin GND |
2.Pin central |
Salida regulada de + 3.3V |
A la entrada del potenciómetro y la salida del potenciómetro a P0.28 |
3.Pin derecho |
+ Ve de la batería Entrada 9V |
CAROLINA DEL NORTE |
Programación de ARM7-LPC2148 para ADC
Para programar ARM7-LPC2148 necesitamos la herramienta keil uVision y Flash Magic. Estamos usando un cable USB para programar ARM7 Stick a través del puerto micro USB. Escribimos código usando Keil y creamos un archivo hexadecimal y luego el archivo HEX se actualiza a la barra ARM7 usando Flash Magic. Para saber más sobre la instalación de keil uVision y Flash Magic y cómo usarlos, siga el enlace Comenzando con el microcontrolador ARM7 LPC2148 y prográmelo usando Keil uVision.
En este tutorial convertimos el voltaje de entrada analógica (0 a 3.3V) en valor digital usando ADC en LPC2148 y mostramos el voltaje analógico en la pantalla LCD (16x2). Se utilizará un potenciómetro para variar el voltaje analógico de entrada.
Para obtener más información sobre la interfaz de la pantalla LCD con el modo de 4 bits ARM7-LPC2148, siga este enlace.
El código completo para usar ADC con ARM 7 se proporciona al final de este tutorial, aquí explicamos algunas partes.
Pasos involucrados en la programación LPC2148-ADC
1. El registro PINSEL se utiliza para seleccionar el pin del puerto de LPC2148 y la función ADC como entrada analógica.
PINSEL1 = 0x01000000; // Seleccione P0.28 como AD0.1
2. Seleccione el reloj y la precisión de bits para la conversión escribiendo el valor en el ADxCR (registro de control ADC).
AD0CR = 0x00200402; // Establece la operación de ADC como 10 bits / 11 CLK para conversión (000)
3. Inicie la conversión escribiendo el valor en bits de INICIO en ADxCR.
Aquí he escrito a 24 º poco de registro AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Ahora que tienen a comprobar el bit de efectuado (31) de la correspondiente ADxDRy (registro de datos ADC), ya que cambia de 0 a 1. Así que usamos mientras bucle para comprobar constantemente si la conversión se realiza en el bit 31 del registro de datos.
while (! (AD0DR1 & 0x80000000));
5. Una vez que el bit de hecho se establece en 1, la conversión es exitosa, luego leemos el resultado del mismo registro de datos ADC AD0DR1 y almacenamos el valor en una variable.
adcvalue = AD0DR1;
A continuación, usamos una fórmula para convertir el valor digital en voltaje y almacenarlo en una variable llamada voltaje .
voltaje = ((adcvalue / 1023.0) * 3.3);
5. Las siguientes líneas se utilizan para mostrar valores digitales (0 a 1023) después de la conversión de analógico a digital.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Muestra el valor ADC (0 a 1023)
6. Las siguientes líneas se utilizan para mostrar el voltaje analógico de entrada (0 a 3,3 V) después de la conversión analógica a digital y después del paso 5.
LCD_SEND (0xC0); sprintf (voltvalue, "Voltage =%. 2f V", voltaje); LCD_DISPLAY (voltvalue); // Display (entrada de voltaje analógico)
7. Ahora tenemos que mostrar el voltaje de entrada y los valores digitales en la pantalla LCD. Antes de eso, tenemos que inicializar la pantalla LCD y usar los comandos apropiados para enviar el mensaje a la pantalla.
El siguiente código se utiliza para inicializar la pantalla LCD
void LCD_INITILIZE (void) // Función para preparar el LCD { IO0DIR = 0x0000FFF0; // Establece el pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 como SALIDA delay_ms (20); LCD_SEND (0x02); // Inicializar lcd en modo de operación de 4 bits LCD_SEND (0x28); // 2 líneas (16X2) LCD_SEND (0x0C); // Mostrar en cursor apagado LCD_SEND (0x06); // Cursor de incremento automático LCD_SEND (0x01); // Mostrar claro LCD_SEND (0x80); // Primera línea, primera posición }
El siguiente código se utiliza para mostrar los valores en la pantalla LCD
LCD_DISPLAY vacío (char * msg) // Función para imprimir los caracteres envió uno a uno { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envía el nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH para imprimir datos IO0CLR = 0x00000020; // RW LOW Modo de escritura delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS y RW sin cambios (es decir, RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envía un nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
La siguiente función se utiliza para crear un retraso
void delay_ms (uint16_t j) // Función para hacer el retardo en milisegundos { uint16_t x, i; para (i = 0; i
A continuación se proporciona el código completo con el video de demostración.