- Conceptos básicos de la señal PWM
- Configuración y requisitos de hardware
- Diagrama de circuito para atenuación de LED del microcontrolador Nuvoton N76E003
- Pines PWM en el microcontrolador N76E003 Nuvoton
- Registros y funciones PWM en el microcontrolador Nuvoton N76E003
- Modos de funcionamiento PWM en el microcontrolador Nuvoton N6E003
- Programación de Nuvoton N76E003 para PWM
- Destellando el código y probando la salida
La modulación de ancho de pulso (PWM) es una técnica comúnmente utilizada en microcontroladores para producir una señal de pulso continuo con una frecuencia y ciclo de trabajo definidos. En resumen, PWM se trata de cambiar el ancho de un pulso mientras la frecuencia es constante.
Una señal PWM se usa principalmente para controlar un servomotor o el brillo de un LED. Además, dado que los microcontroladores solo pueden proporcionar Logic 1 (High) o Logic 0 (Low) en sus pines de salida, no pueden proporcionar un voltaje analógico variable a menos que se utilice un convertidor DAC o Digital a Analógico. En tal caso, el microcontrolador se puede programar para generar un PWM con un ciclo de trabajo variado que luego se puede convertir al voltaje analógico variable. También hemos utilizado previamente periféricos PWM en muchos otros microcontroladores.
- Tutorial ARM7-LPC2148 PWM: Control del brillo del LED
- Modulación de ancho de pulso (PWM) usando MSP430G2: Control de brillo de LED
- Generando PWM usando el microcontrolador PIC con MPLAB y XC8
- Modulación de ancho de pulso (PWM) en STM32F103C8: Control de velocidad del ventilador de CC
- Generación de señales PWM en pines GPIO del microcontrolador PIC
- Tutorial de Raspberry Pi PWM
- Tutorial de PWM con ESP32
En este tutorial, conectaremos un LED que se controlará mediante esta señal PWM de la unidad del microcontrolador N76E003. Evaluaremos qué tipo de configuración de hardware necesitamos y cómo debemos programar nuestro microcontrolador. Antes de eso, comprendamos algunos conceptos básicos de una señal PWM.
Conceptos básicos de la señal PWM
En la imagen de abajo se muestra una señal PWM constante.
La imagen de arriba no es más que una onda cuadrada constante con el mismo tiempo de encendido y el mismo tiempo de apagado. Supongamos que el período total de la señal es de 1 segundo. Por lo tanto, el tiempo de encendido y apagado es de 500 ms. Si se conecta un LED a través de esta señal, el LED se encenderá durante 500 ms y se apagará durante 500 ms. Por lo tanto, en la vista en perspectiva, el LED se iluminará con la mitad del brillo real si se enciende a una señal directa de 5V sin tiempo de inactividad.
Ahora, como se muestra en la imagen anterior, si se cambia el ciclo de trabajo, el LED se iluminará con el 25% del brillo real usando el mismo principio que se discutió anteriormente. Si desea saber más y aprender sobre la modulación de ancho de pulso (PWM), puede consultar el artículo vinculado.
Configuración y requisitos de hardware
Como requisito de este proyecto es controlar LED mediante PWM. Se requiere un LED para conectarse con N76E003. Dado que hay un LED disponible en la placa de desarrollo N76E003, se utilizará en este proyecto. No se requieren otros componentes.
Sin mencionar que necesitamos la placa de desarrollo basada en microcontroladores N76E003, así como el programador Nu-Link. Es posible que se requiera una fuente de alimentación adicional de 5 V si el programador no se utiliza como fuente de alimentación.
Diagrama de circuito para atenuación de LED del microcontrolador Nuvoton N76E003
Como podemos ver en el siguiente esquema, el Test LED está disponible dentro de la placa de desarrollo y está conectado en el puerto 1.4. En el extremo izquierdo, se muestra la conexión de la interfaz de programación.
Pines PWM en el microcontrolador N76E003 Nuvoton
El N76E003 tiene 20 pines de los cuales 10 pines se pueden usar como PWM. Las siguientes imágenes muestran los pines PWM resaltados en el cuadro cuadrado rojo.
Como podemos ver, los pines PWM resaltados también se pueden utilizar para otros fines. Sin embargo, este otro propósito de los pines no estará disponible cuando los pines estén configurados para salida PWM. Pin 1.4 que se usa como pin de salida PWM, perderá la otra funcionalidad. Pero eso no es un problema ya que no se requiere otra funcionalidad para este proyecto.
La razón para elegir el pin 1.4 como pin de salida es porque el LED de prueba incorporado está conectado en ese pin en la placa de desarrollo, por lo que no necesitamos LED externos. Sin embargo, en este microcontrolador de 20 pines, se pueden usar 10 pines como un pin de salida PWM y cualquier otro pin PWM se puede usar para fines relacionados con la salida.
Registros y funciones PWM en el microcontrolador Nuvoton N76E003
N76E003 usa el reloj del sistema o el desbordamiento del temporizador 1 dividido por un reloj PWM con preescalador seleccionable de 1/1 a 1/128. El período PWM se puede configurar utilizando el registro de período de 16 bits PWMPH y el registro PWMPL.
El microcontrolador tiene seis registros PWM individuales que generan seis señales PWM llamadas PG0, PG1, PG2, PG3, PG4 y PG5. Sin embargo, el período es el mismo para cada canal PWM porque comparten el mismo contador de período de 16 bits, pero el ciclo de trabajo de cada PWM puede ser diferente de los demás, ya que cada PWM utiliza un registro de ciclo de trabajo de 16 bits diferente llamado {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} y {PWM5H, PWM5L}. Por lo tanto, en N76E003, se pueden generar seis salidas PWM de forma independiente con diferentes ciclos de trabajo.
A diferencia de otros microcontroladores, habilitar el PWM no configura los pines de E / S en su salida PWM automáticamente. Por lo tanto, el usuario debe configurar el modo de salida de E / S.
Por lo tanto, sea lo que sea que se requiera para la aplicación, el primer paso es determinar o seleccionar cuál, uno o dos o incluso más de dos pines de E / S como salida PWM. Después de seleccionar uno, los pines de E / S deben configurarse como modo Push-Pull o Cuasi bidireccional para generar la señal PWM. Esto se puede seleccionar usando el registro PxM1 y PxM2. Estos dos registros establecen los modos de E / S donde la x representa el número de puerto (por ejemplo, el puerto P1.0 el registro será P1M1 y P1M2, para P3.0 será P3M1 y P3M2, etc.)
La configuración se puede ver en la siguiente imagen:
Luego, el siguiente paso es habilitar el PWM en esos pines de E / S en particular. Para hacer esto, el usuario debe configurar los registros PIOCON0 o PIOCON1. El registro depende de la asignación de pines, ya que PIOCON0 y PIOCON1 controlan diferentes pines que dependen de las señales PWM. La configuración de estos dos registros se puede ver en la siguiente imagen:
Como podemos ver, el registro anterior controla 6 configuraciones. Para el resto, use el registro PIOCON1.
Así, el registro anterior controla las 4 configuraciones restantes.
Modos de funcionamiento PWM en el microcontrolador Nuvoton N6E003
El siguiente paso es seleccionar los modos de operación PWM. Cada PWM admite tres modos de funcionamiento: modo de activación Independiente, Sincrónico y Tiempo muerto.
El modo independiente proporciona la solución en la que las seis señales PWM se pueden generar de forma independiente. Esto se requiere el máximo de veces cuando las operaciones relacionadas con LED o los zumbadores deben encenderse y controlarse.
El modo síncrono establece el PG1 / 3/5 en la misma salida PWM en fase, lo mismo que PG0 / 2/4, donde el PG0 / 2/4 proporciona señales de salida PWM independientes. Esto se requiere principalmente para controlar motores trifásicos.
El modo de inserción Dead-Time es un poco complejo y se aplica en aplicaciones de motores reales, especialmente en aplicaciones industriales. En tales aplicaciones, una salida PWM complementaria debe ser una inserción de “tiempo muerto” que evite dañar los dispositivos de conmutación de energía como los GPIB. Las configuraciones se establecen en este modo de manera que PG0 / 2/4 proporcione señales de salida PWM de la misma manera que el modo independiente, pero PG1 / 3/5 proporcione la salida de "señales PWM fuera de fase" de PG0 / 2/4 correspondientemente e ignore el registro de servicio PG1 / 3/5.
Se pueden seleccionar los tres modos anteriores utilizando la configuración de registro siguiente:
La siguiente configuración es la selección de tipos de PWM usando el registro PWMCON1.
Entonces, como podemos ver, hay dos tipos de PWM disponibles que se pueden seleccionar usando el registro anterior. En el borde alineado, el contador de 16 bits utiliza la operación de pendiente única contando desde 0000H hasta el valor establecido de {PWMPH, PWMPL}, y luego comenzando desde 0000H. La forma de onda de salida está alineada con el borde izquierdo.
Pero, en el modo de alineación central, el contador de 16 bits utiliza la operación de doble pendiente contando desde 0000H hasta {PWMPH, PWMPL} y luego vuelve a pasar de {PWMPH, PWMPL} a 0000H contando hacia atrás. La salida está alineada al centro y es útil para generar formas de onda que no se superponen. Ahora, finalmente, las operaciones de control PWM que se pueden verificar en los registros a continuación:
Para configurar la fuente de reloj, use el registro de control de reloj CKCON.
La señal de salida PWM también se puede enmascarar utilizando el registro PMEN. Usando este registro, el usuario puede enmascarar la señal de salida por 0 o 1.
El siguiente es el registro de control PWM-
El registro anterior es útil para ejecutar el PWM, cargar un nuevo período y carga de trabajo, controlar el indicador PWM y borrar el contador PWM.
Las configuraciones de bits asociadas se muestran a continuación:
Para configurar el divisor de reloj, use el registro PWMCON1 para el divisor de reloj PWM. El quinto bit se utiliza para el modo de grupo habilitado PWM agrupado y proporciona el mismo ciclo de trabajo para los primeros tres pares de PWM.
Programación de Nuvoton N76E003 para PWM
La codificación es simple y el código completo utilizado en este tutorial se puede encontrar en la parte inferior de esta página. El LED está conectado al pin P1.4. Por lo tanto, se necesita el pin P1.4 para la salida PWM.
En el programa principal, la configuración se realiza en el orden respectivo. A continuación, las líneas de códigos establecen el PWM y configuran el pin P1.4 como salida PWM.
P14_PushPull_Mode;
Esto se usa para configurar el pin P1.4 en modo push-pull. Esto se define en la biblioteca Function_define.h como-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Las siguientes líneas se utilizan para habilitar el PWM en el pin P1.4. Esto también se define en la biblioteca Function_define.h como-
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 como Habilitación de salida PWM1 PWM_IMDEPENDENT_MODE;
El siguiente código se utiliza para configurar el PWM en modo independiente. En la biblioteca Function_define.h , se define como-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Luego tenemos que configurar la salida PWM tipo EDGE. En la biblioteca Function_define.h , se define como-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
A continuación, tenemos que borrar el valor del contador PWM que está disponible en la biblioteca SFR_Macro.h-
#define set_CLRPWM CLRPWM = 1
Después de eso, el reloj PWM se selecciona como reloj Fsys y el factor de división utilizado es la división 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Ambos se definen como-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
La siguiente línea de código se usa para enmascarar la señal PWM de salida por 0 definido como-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Luego tenemos que establecer el período de tiempo de la señal PWM. Esta función establece el período en el registro PWMPL y PWMPH. Como se trata de un registro de 16 bits, la función utiliza un método de desplazamiento de bits para establecer el período PWM.
void set_PWM_period (valor int sin firmar) { PWMPL = (valor & 0x00FF); PWMPH = ((valor & 0xFF00) >> 8); }
Sin embargo, además del período de 1023 y 8 bits, los usuarios también pueden usar otros valores. Aumentar el período da como resultado una atenuación o desvanecimiento suaves.
set_PWMRUN;
Esto iniciará el PWM que está definido en la biblioteca SFR_Macro.h como-
#define set_PWMRUN PWMRUN = 1
A continuación, en el ciclo while , el LED se enciende y se atenúa continuamente.
while (1) { para (valor = 0; valor <1024; valor + = 10) { set_PWM1 (valor); Timer1_Delay10ms (3); } para (valor = 1023; valor> 0; valor - = 10) { set_PWM1 (valor); Timer1_Delay10ms (2); } } }
El ciclo de trabajo lo establece set_PWM1 ();, una función que establece el ciclo de trabajo en el registro PWM1L y PWM1H.
void set_PWM1 (valor int sin signo) { PWM1L = (valor & 0x00FF); PWM1H = ((valor & 0xFF00) >> 8); set_LOAD; }
Destellando el código y probando la salida
Una vez que el código esté listo, compílelo y cárguelo en el controlador. Si es nuevo en el medio ambiente, consulte el tutorial de introducción a Nuvoton N76E003 para aprender los conceptos básicos. Como puede ver en el resultado a continuación, el código devolvió 0 advertencia y 0 errores y parpadeó utilizando el método de parpadeo predeterminado de Keil. La aplicación comienza a funcionar.
Reconstrucción iniciada: Proyecto: PWM Reconstruir objetivo 'Target 1' ensamblando STARTUP.A51… compilando main.c… compilando Delay.c… vinculando… Tamaño del programa: datos = 35.1 xdata = 0 código = 709 creando archivo hexadecimal de ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Error (s), 0 Advertencia (s). Tiempo de construcción transcurrido: 00:00:05
El hardware está conectado a la fuente de alimentación y funciona como se esperaba. Ese es el brillo del LED integrado reducido y luego aumentado para indicar el cambio de ciclo de trabajo PWM.
El funcionamiento completo de este tutorial también se puede encontrar en el video vinculado a continuación. Espero que haya disfrutado del tutorial y haya aprendido algo útil si tiene alguna pregunta, déjela en la sección de comentarios o puede usar nuestros foros para otras preguntas técnicas.