- PWM (modulación de ancho de pulso)
- Pines PWM en ARM7-LPC2148
- Registros PWM en ARM7-LPC2148
- Componentes requeridos
- Diagrama de circuito y conexiones
- Programando ARM7-LPC2148 para PWM
- Pasos involucrados en la programación de LPC2148 para PWM y ADC
Como sabemos, los microcontroladores toman la entrada analógica de los sensores analógicos y usan ADC (convertidor analógico a digital) para procesar esas señales. Pero, ¿qué pasa si un microcontrolador desea producir una señal analógica para controlar dispositivos operados analógicamente como un servomotor, motor de CC, etc.? Los microcontroladores no producen voltaje de salida como 1V, 5V, sino que usan una técnica llamada PWM para operar dispositivos analógicos. Un ejemplo de PWM es el ventilador de enfriamiento de nuestra computadora portátil (motor de CC), que debe controlarse la velocidad de acuerdo con la temperatura, y lo mismo se implementa mediante la técnica de Modulación de ancho de pulso (PWM) en las placas base.
En este tutorial controlaremos el brillo de un LED usando el PWM en el microcontrolador ARM7-LPC2148.
PWM (modulación de ancho de pulso)
PWM es una buena manera de controlar los dispositivos analógicos usando valores digitales como controlar la velocidad del motor, el brillo de un LED, etc. Aunque PWM no proporciona una salida analógica pura, genera pulsos analógicos decentes para controlar los dispositivos analógicos. PWM en realidad modula el ancho de una onda de pulso rectangular para obtener una variación en el valor promedio de la onda resultante.
Ciclo de trabajo del PWM
El porcentaje de tiempo en el que la señal PWM permanece ALTA (a tiempo) se denomina ciclo de trabajo. Si la señal está siempre encendida, está en un ciclo de trabajo del 100% y si siempre está apagada, es un ciclo de trabajo del 0%.
Ciclo de trabajo = tiempo de encendido / (tiempo de encendido + tiempo de apagado)
Pines PWM en ARM7-LPC2148
La imagen de abajo indica los pines de salida PWM de ARM7-LPC2148. Hay un total de seis pines para PWM.
Canal PWM |
Pines de puerto LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Registros PWM en ARM7-LPC2148
Antes de adentrarnos en nuestro proyecto necesitamos conocer los registros PWM en LPC2148.
Aquí está la lista de registros usados en LPC2148 para PWM
1. PWMPR: Registro de preescala PWM
Uso: Es un registro de 32 bits. Contiene el número de veces (menos 1) que PCLK debe realizar un ciclo antes de incrementar el contador del temporizador PWM (en realidad, mantiene el valor máximo del contador de preescala).
2. PWMPC: Contador de preescalador PWM
Uso: Es un registro de 32 bits . Contiene el valor del contador incremental. Cuando este valor es igual al valor PR más 1, se incrementa el contador de temporizador PWM (TC).
3. PWMTCR: Registro de control del temporizador PWM
Uso: Contiene los bits de control Habilitación del contador, Reset del contador y Habilitación PWM. Es un registro de 8 bits.
7: 4 |
3 |
2 |
1 |
0 |
RESERVADO |
HABILITAR PWM |
RESERVADO |
RESTABLECIMIENTO DEL CONTADOR |
CONTADOR HABILITADO |
- Habilitar PWM: (Bit-3)
0- PWM deshabilitado
1- PWM habilitado
- Habilitar contador: (Bit-0)
0- Deshabilitar contadores
1- Habilitar contador
- Reinicio del contador: (Bit-1)
0- No hacer nada.
1- Reinicia PWMTC y PWMPC en el borde positivo de PCLK.
4. PWMTC: Contador de temporizador PWM
Uso: Es un registro de 32 bits. Contiene el valor actual del temporizador PWM incremental. Cuando el contador de preescalador (PC) alcanza el valor del registro de preescalador (PR) más 1, este contador se incrementa.
5. PWMIR: Registro de interrupciones PWM
Uso: Es un registro de 16 bits. Contiene los indicadores de interrupción para los canales de coincidencia PWM 0-6. Se establece una bandera de interrupción cuando ocurre una interrupción para ese canal (Interrupción MRx) donde X es el número de canal (0 a 6).
6. PWMMR0-PWMMR6: Registro de coincidencia PWM
Uso: Es un registro de 32 bits . En realidad, el grupo Match Channel permite configurar 6 salidas PWM controladas por un solo borde o 3 controladas por dos bordes. Puede modificar los siete canales de coincidencia para configurar estas salidas PWM para que se adapten a sus requisitos en PWMPCR.
7. PWMMCR: Registro de control de coincidencias PWM
Uso: Es un registro de 32 bits. Contiene los bits de interrupción, reinicio y parada que controlan el canal de coincidencia seleccionado. Se produce una coincidencia entre los registros de coincidencia de PWM y los contadores de temporizador de PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
RESERVADO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Aquí x es de 0 a 6
- PWMMRxI (bit 0)
HABILITAR O DESHABILITAR interrupciones PWM
0- Deshabilita las interrupciones de PWM Match.
1- Habilita la interrupción de PWM Match.
- PWMMRxR: (Bit-1)
RESET PWMTC - Valor del contador del temporizador siempre que coincida con PWMRx
0- No hagas nada.
1- Reinicia el PWMTC.
- PWMMRxS: (bit 2)
DETENGA PWMTC & PWMPC cuando PWMTC alcance el valor del registro Match
0- Desactiva la función de parada PWM.
1- Habilite la función de parada de PWM.
8. PWMPCR: Registro de control PWM
Uso: Es un registro de 16 bits. Contiene los bits que habilitan las salidas PWM 0-6 y seleccionan el control de un solo borde o de doble borde para cada salida.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NO USADO |
PWMENA6-PWMENA1 |
NO USADO |
PWMSEL6-PWMSEL2 |
NO USADO |
- PWMSELx (x: 2 a 6)
- Modo de borde único para PWMx
- 1- Modo de doble filo para PWMx.
- PWMENAx (x: 1 a 6)
- Desactivar PWMx.
- 1- PWMx habilitado.
9. PWMLER: PWM Latch Enable Register
Uso: Es un registro de 8 bits. Contiene los bits Match x Latch para cada Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NO USADO |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 a 6):
0- Deshabilitar la carga de nuevos valores de coincidencia
1- Cargar los nuevos valores de coincidencia desde (PWMMRx) PWMMatch Register cuando se reinicia el temporizador.
Ahora comencemos a construir la configuración del hardware para demostrar la modulación de ancho de pulso en el microcontrolador ARM.
Componentes requeridos
Hardware
- Microcontrolador ARM7-LPC2148
- Regulador de voltaje de 3.3V IC
- Potenciómetro 10k
- LED (cualquier color)
- Módulo de pantalla LCD (16x2)
- Tablero de circuitos
- Conexión de cables
Software
- Keil uVision5
- Herramienta Flash Magic
Diagrama de circuito y conexiones
Conexiones 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) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Conexión entre LED y ARM7-LPC2148
El ANODO de LED está conectado a la salida PWM (P0.0) de LPC2148, mientras que el pin CATHODE de LED está conectado al pin GND de LPC2148.
Conexión entre ARM7-LPC2148 y potenciómetro con regulador de voltaje de 3.3V
Regulador de voltaje de 3.3V IC |
Función pin |
Pin ARM-7 LPC2148 |
1.Pin izquierdo |
- Ve de GND |
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 de LPC2148 |
3.Pin derecho |
+ Ve desde 5V ENTRADA |
+ 5V |
Puntos a tener en cuenta
1. Aquí se usa un regulador de voltaje de 3.3V para proporcionar un valor de entrada analógica al pin ADC (P0.28) de LPC2148 y debido a que estamos usando una potencia de 5V, necesitamos regular el voltaje con un regulador de voltaje de 3.3V.
2. Se usa un potenciómetro para variar el voltaje entre (0V a 3.3V) para proporcionar entrada analógica (ADC) al pin P0.28 del LPC2148
Programando ARM7-LPC2148 para PWM
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 usaremos la técnica ADC y PWM para controlar el brillo del LED. Aquí LPC2148 recibe una entrada analógica (0 a 3.3V) a través del pin de entrada ADC P0.28, luego esta entrada analógica se convierte en valor digital (0 a 1023). Luego, este valor se convierte nuevamente en valor digital (0-255) ya que la salida PWM de LPC2148 tiene solo una resolución de 8 bits (28). El LED está conectado al pin PWM P0.0 y el brillo del LED se puede controlar usando el potenciómetro. Para saber más sobre ADC en ARM7-LPC2148 siga el enlace.
Pasos involucrados en la programación de LPC2148 para PWM y ADC
Paso 1: - Lo primero es configurar el PLL para la generación de reloj, ya que establece el reloj del sistema y el reloj periférico de LPC2148 según las necesidades de los programadores. La frecuencia de reloj máxima para LPC2148 es 60Mhz. Las siguientes líneas se utilizan para configurar la generación de reloj PLL.
void initilizePLL (void) // Función para usar PLL para la generación de reloj { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Paso 2: - Lo siguiente es seleccionar los pines PWM y la función PWM de LPC2148 usando el registro PINSEL. Usamos PINSEL0 como usamos P0.0 para la salida PWM de LPC2148.
PINSEL0 = 0x00000002; // Configuración del pin P0.0 para salida PWM
Paso 3: - A continuación, necesitamos RESETEAR los temporizadores usando PWMTCR (Registro de control de temporizador).
PWMTCR = (1 << 1); // Configuración del registro de control del temporizador PWM como reinicio del contador
Y luego, establezca el valor de preescala que decide la resolución de PWM. Lo estoy poniendo a cero
PWMPR = 0X00; // Configuración del valor de preescala de PWM
Paso 4: - A continuación, debemos configurar el PWMMCR (registro de control de coincidencia de PWM), ya que establece una operación como reinicio, interrupciones para PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Configuración del registro de control de coincidencias de PWM
Paso 5: - El período máximo del canal PWM se establece mediante PWMMR.
PWMMR0 = PWMvalue; // Dar valor PWM Valor máximo
En nuestro caso el valor máximo es 255 (para brillo máximo)
Paso 6: - A continuación, debemos configurar Latch Enable en los registros de coincidencia correspondientes usando PWMLER
PWMLER = (1 << 0); // Pestillo Enalbe PWM
(Usamos PWMMR0) Entonces habilite el bit correspondiente configurando 1 en PWMLER
Paso 7: - Para habilitar la salida PWM al pin, necesitamos usar el PWMTCR para habilitar los contadores del temporizador PWM y los modos PWM.
PWMTCR = (1 << 0) - (1 << 3); // Habilitando PWM y contador PWM
Paso 8: - Ahora necesitamos obtener los valores del potenciómetro para configurar el ciclo de trabajo de PWM desde el pin P0.28 del ADC. Entonces usamos el módulo ADC en LPC2148 para convertir potenciómetros de entrada analógica (0 a 3.3V) a los valores ADC (0 a 1023).
Aquí estamos convirtiendo los valores de 0-1023 a 0-255 dividiéndolos con 4 ya que el PWM de LPC2148 tiene una resolución de 8 bits (2 8).
Paso 9: - Para seleccionar el pin ADC P0.28 en LPC2148, usamos
PINSEL1 = 0x01000000; // Configurando P0.28 como ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Configuración de reloj y PDN para conversión A / D
Las siguientes líneas capturan la entrada analógica (0 a 3,3 V) y la convierten en valor digital (0 a 1023). Y luego estos valores digitales se dividen por 4 para convertirlos en (0 a 255) y finalmente se alimentan como salida PWM en el pin P0.0 del LPC2148 en el que está conectado el LED.
AD0CR - = (1 << 1); // Seleccione el canal AD0.1 en el registro ADC delaytime (10); AD0CR - = (1 << 24); // Inicie la conversión A / D while ((AD0DR1 & (1 << 31)) == 0); // Verifique el bit DONE en el registro de datos ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Obtener el RESULTADO del registro de datos de ADC dutycycle = adcvalue / 4; // fórmula para obtener valores del ciclo de trabajo de (0 a 255) PWMMR1 = ciclo de trabajo; // establece el valor del ciclo de trabajo en el registro de coincidencia PWM PWMLER - = (1 << 1); // Habilita la salida PWM con el valor del ciclo de trabajo
Paso 10: - A continuación mostramos esos valores en el módulo de visualización LCD (16X2). Entonces agregamos las siguientes líneas para inicializar el módulo de pantalla LCD
Void LCD_INITILIZE (void) // Función para preparar el LCD { IO0DIR = 0x0000FFF0; // Configura el pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 como tiempo de retardo de SALIDA (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 }
Como conectamos LCD en modo de 4 bits con LPC2148, necesitamos enviar valores para que se muestren como nibble por nibble (Upper Nibble & Lower Nibble). Entonces se usan las siguientes líneas.
void LCD_DISPLAY (char * msg) // Función para imprimir los caracteres enviados 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 delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS y RW sin cambios (es decir, RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envía un nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delaytime (2); IO0CLR = 0x00000040; delaytime (5); i ++; } }
Para mostrar esos valores ADC y PWM usamos las siguientes líneas en la función int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Muestra el valor ADC (0 a 1023) LCD_SEND (0xC0); sprintf (salida led, "PWM OP =%. 2f", brillo); LCD_DISPLAY (salida led); // Muestra los valores del ciclo de trabajo de (0 a 255)
A continuación se proporciona el código completo y la descripción en video del tutorial.