- ¿Qué es una señal PWM?
- PWM usando PIC16F877A:
- Programación de PIC para generar señales PWM:
- Esquemas y pruebas:
- Trabajando en hardware:
Este es nuestro décimo tutorial de aprendizaje de microcontroladores PIC utilizando MPLAB y XC8. Hasta ahora, hemos cubierto muchos tutoriales básicos como LED parpadeando con PIC, temporizadores en PIC, LCD de interfaz, interfaz de 7 segmentos, ADC usando PIC, etc. Si es un principiante absoluto, visite la lista completa de tutoriales de PIC aquí y comienza a aprender.
En este tutorial, aprenderemos cómo generar señales PWM usando PIC PIC16F877A. Nuestro PIC MCU tiene un módulo especial llamado módulo de captura de comparación (CCP) que se puede utilizar para generar señales PWM. Aquí, generaremos un PWM de 5 kHz con un ciclo de trabajo variable de 0% a 100%. Para variar el ciclo de trabajo estamos usando un potenciómetro, por lo que se recomienda aprender el tutorial de ADC antes de comenzar con PWM. El módulo PWM también usa temporizadores para establecer su frecuencia, por lo tanto, aprenda a usar los temporizadores de antemano aquí. Además, en este tutorial usaremos un circuito RC y un LED para convertir los valores PWM a voltaje analógico y lo usaremos para atenuar la luz LED.
¿Qué es una señal PWM?
La modulación de ancho de pulso (PWM) es una señal digital que se usa más comúnmente en circuitos de control. Esta señal se establece en alto (5v) y bajo (0v) en un tiempo y velocidad predefinidos. El tiempo durante el cual la señal permanece alta se denomina "tiempo de activación" y el tiempo durante el cual la señal permanece baja se denomina "tiempo de inactividad". Hay dos parámetros importantes para un PWM como se describe a continuación:
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)
Frecuencia de un PWM:
La frecuencia de una señal PWM determina qué tan rápido un PWM completa un período. Un período es el ENCENDIDO y APAGADO completo de una señal PWM como se muestra en la figura anterior. En nuestro tutorial estableceremos una frecuencia de 5KHz.
PWM usando PIC16F877A:
Las señales PWM se pueden generar en nuestro microcontrolador PIC utilizando el módulo CCP (Compare Capture PWM). La resolución de nuestra señal PWM es de 10 bits, es decir, para un valor de 0 habrá un ciclo de trabajo del 0% y para un valor de 1024 (2 ^ 10) habrá un ciclo de trabajo del 100%. Hay dos módulos CCP en nuestro PIC MCU (CCP1 y CCP2), esto significa que podemos generar dos señales PWM en dos pines diferentes (pin 17 y 16) simultáneamente, en nuestro tutorial estamos usando CCP1 para generar señales PWM en el pin 17.
Los siguientes registros se utilizan para generar señales PWM utilizando nuestro PIC MCU:
- CCP1CON (Registro de control CCP1)
- T2CON (Registro de control del temporizador 2)
- PR2 (Registro de período de temporizador 2 módulos)
- CCPR1L (Registro CCP 1 bajo)
Programación de PIC para generar señales PWM:
En nuestro programa, leeremos un voltaje analógico de 0-5v de un potenciómetro y lo asignaremos a 0-1024 usando nuestro módulo ADC. Luego generamos una señal PWM con una frecuencia de 5000Hz y variamos su ciclo de trabajo en función del voltaje analógico de entrada. Es decir, 0-1024 se convertirá en un ciclo de trabajo de 0% -100%. Este tutorial asume que ya ha aprendido a usar ADC en PIC; de lo contrario, léalo desde aquí, porque omitiremos detalles al respecto en este tutorial.
Entonces, una vez que se establecen los bits de configuración y se escribe el programa para leer un valor analógico, podemos continuar con PWM.
Se deben seguir los siguientes pasos al configurar el módulo CCP para la operación PWM:
- Configure el período de PWM escribiendo en el registro PR2.
- Configure el ciclo de trabajo de PWM escribiendo en el registro CCPR1L y los bits CCP1CON <5: 4>.
- Convierta el pin CCP1 en una salida borrando el bit TRISC <2>.
- Establezca el valor de preescala TMR2 y habilite Timer2 escribiendo en T2CON.
- Configure el módulo CCP1 para operación PWM.
Hay dos funciones importantes en este programa para generar señales PWM. Una es la función PWM_Initialize () que inicializará los registros necesarios para configurar el módulo PWM y luego establecerá la frecuencia a la que debe operar PWM, la otra función es la función PWM_Duty () que establecerá el ciclo de trabajo de la señal PWM en los registros requeridos.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Configurar las fórmulas PR2 usando la hoja de datos // Hace que el PWM funcione en 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configure el módulo CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configurar el módulo Timer TRISC2 = 0; // hacer pin de puerto en C como salida}
La función anterior es la función de inicialización de PWM, en esta función el módulo CCP1 está configurado para usar PWM haciendo que los bits CCP1M3 y CCP1M2 sean altos.
El preescalador del módulo temporizador se establece haciendo que el bit T2CKPS0 sea alto y T2CKPS1 tan bajo; el bit TMR2ON se establece para iniciar el temporizador.
Ahora, tenemos que configurar la frecuencia de la señal PWM. El valor de la frecuencia debe escribirse en el registro PR2. La frecuencia deseada se puede establecer utilizando las fórmulas siguientes
Período de PWM = * 4 * TOSC * (Valor de preescala TMR2)
Reorganizar estas fórmulas para obtener PR2 dará
PR2 = (Período / (4 * Tosc * TMR2 Prescale)) - 1
Sabemos que Period = (1 / PWM_freq) y Tosc = (1 / _XTAL_FREQ). Por lo tanto…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Una vez establecida la frecuencia, no es necesario volver a llamar a esta función a menos que y hasta que necesitemos cambiar la frecuencia nuevamente. En nuestro tutorial he asignado PWM_freq = 5000; para que podamos obtener una frecuencia de funcionamiento de 5 KHz para nuestra señal PWM.
Ahora establezcamos el ciclo de trabajo del PWM usando la siguiente función
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Al reducir // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = deber & 1; // Almacena el primer bit CCP1Y = duty & 2; // Almacenar el bit 0 CCPR1L = deber >> 2; // Almacenar los 8 bits recordatorios}}
Nuestra señal PWM tiene una resolución de 10 bits, por lo que este valor no se puede almacenar en un solo registro ya que nuestro PIC solo tiene líneas de datos de 8 bits. Así que usamos otros dos bits de CCP1CON <5: 4> (CCP1X y CCP1Y) para almacenar los dos últimos LSB y luego almacenar los 8 bits restantes en el Registro CCPR1L.
El tiempo del ciclo de trabajo de PWM se puede calcular utilizando las fórmulas siguientes:
Ciclo de trabajo de PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Valor de preescala TMR2)
Reorganizar estas fórmulas para obtener el valor de CCPR1L y CCP1CON dará:
CCPRIL: CCP1Con <5: 4> = Ciclo de trabajo PWM / (Valor de preescala Tosc * TMR2)
El valor de nuestro ADC será 0-1024, necesitamos que esté en 0% -100%, por lo tanto, PWM Duty Cycle = duty / 1023. Además, para convertir este ciclo de trabajo en un período de tiempo, tenemos que multiplicarlo por el período (1 / PWM_freq)
También sabemos que Tosc = (1 / PWM_freq), por lo tanto..
Deber = (((flotante) deber / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Resolver la ecuación anterior nos dará:
Duty = ((flotante) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Puede consultar el programa completo en la sección Código a continuación junto con el video detallado.
Esquemas y pruebas:
Como de costumbre, verifiquemos la salida usando la simulación de Proteus. El diagrama de circuito se muestra a continuación.
Conectar un potenciómetro a 7 º pin de alimentación en una tensión de 0-5. El módulo CCP1 está con pin 17 (RC2), aquí se generará el PWM que se puede verificar usando el osciloscopio digital. Además de convertir esto en un voltaje variable , hemos utilizado un filtro RC y un LED para verificar la salida sin un alcance.
¿Qué es un filtro RC?
Un filtro RC o un filtro de paso bajo es un circuito simple con dos elementos pasivos, a saber, la resistencia y el condensador. Estos dos componentes se utilizan para filtrar la frecuencia de nuestra señal PWM y convertirla en un voltaje de CC variable.
Si examinamos el circuito, cuando se aplica un voltaje variable a la entrada de R, el capacitor C comenzará a cargarse. Ahora, según el valor del condensador, el condensador tardará algún tiempo en cargarse por completo, una vez cargado bloqueará la corriente CC (recuerde que los condensadores bloquean CC pero permiten CA) por lo tanto, el voltaje CC de entrada aparecerá en la salida. La PWM (señal de CA) de alta frecuencia se conectará a tierra a través del condensador. Por tanto, se obtiene una CC pura a través del condensador. Se encontró que un valor de 1000Ohm y 1uf era apropiado para este proyecto. El cálculo de los valores de R y C implica el análisis de circuitos utilizando la función de transferencia, que está fuera del alcance de este tutorial.
La salida del programa se puede verificar usando el osciloscopio digital como se muestra a continuación, varíe el potenciómetro y el ciclo de trabajo del PWM debería cambiar. También podemos notar el voltaje de salida del circuito RC usando el voltímetro. Si todo funciona como se esperaba, podemos continuar con nuestro hardware. Consulte el video al final para ver el proceso completo.
Trabajando en hardware:
La configuración del hardware del proyecto es muy simple, solo vamos a reutilizar nuestra placa PIC Perf que se muestra a continuación.
También necesitaremos un potenciómetro para alimentar el voltaje analógico, he conectado algunos cables de extremo hembra a mi olla (que se muestra a continuación) para que podamos conectarlos directamente a la placa PIC Perf.
Finalmente, para verificar la salida, necesitamos un circuito RC y un LED para ver cómo funciona la señal PWM, simplemente usé una pequeña placa de perforación y soldé el circuito RC y el LED (para controlar el brillo) como se muestra a continuación.
Podemos usar cables de conexión hembra a hembra simples y conectarlos de acuerdo con los esquemas que se muestran arriba. Una vez realizada la conexión, cargue el programa en el PIC usando nuestro pickit3 y debería poder obtener un voltaje variable basado en la entrada de su potenciómetro. La salida variable se utiliza para controlar el brillo del LED aquí.
Usé mi multímetro para medir las salidas variables, también podemos notar que el brillo del LED cambia para diferentes niveles de voltaje.
Eso es todo lo que hemos programado para leer el voltaje analógico del POT y convertirlo en señales PWM que a su vez se han convertido en voltaje variable usando un filtro RC y el resultado se verifica usando nuestro hardware. Si tiene alguna duda o se queda atascado en algún lugar, utilice la sección de comentarios a continuación, estaremos encantados de ayudarle. El trabajo completo está funcionando en el video.
Consulte también nuestros otros tutoriales de PWM en otros microcontroladores:
- Tutorial de Raspberry Pi PWM
- PWM con Arduino Due
- Atenuador LED basado en Arduino usando PWM
- Atenuador LED de potencia con microcontrolador ATmega32