Menu
in

8 Canales de PWM con un 16F628A

Luego del mítico 16F84A, el microcontrolador que le sucede en complejidad es el también popular 16F628A. Con su aparición en el mercado, marcó un avance significativo por sobre el 16F84A en incontables aspectos, uno de ellos es la incorporación de un módulo CCP (Capture/Compare/PWM). La posibilidad de incorporar en forma nativa un generador de señal PWM simplificó mucho los trabajos al momento de “emular” una salida analógica desde el chip. Hasta aquí todos habían sido 1’s y 0’s, los LEDs sólo encendían o apagaban y los motores funcionaban o no, mientras que necesitabas tener la posibilidad de atenuar la iluminación de un LED, variar la velocidad de un motor y otras aplicaciones que requerían una urgente salida analógica. De manera muy inteligente, y sin dejar de trabajar con niveles lógicos, veremos los métodos más frecuentes para aprovechar no sólo una salida PWM, sino ocho a partir de un microcontrolador sencillo y muy económico.

Con el trabajo de hoy veremos de manera muy sencilla y didáctica, algunas posibilidades que existen dentro del mundo de los microcontroladores que te ayudarán a comprender muchos conceptos que son importantes en la fase inicial, cuando nos decidimos a trabajar con estos dispositivos. Por supuesto que lo primero que debemos aclarar y definir es el concepto de PWM. ¿Qué es el PWM? Pulse-Width Modulation o lo que en castellano significa modulación por ancho de pulsos. Es decir, partiendo de una señal de amplitud y frecuencia fija, vamos a proceder a variar el ancho del semiciclo activo, comprimiéndolo o expandiéndolo para así lograr transportar dentro de la señal una información variable que utilizaremos para diversas aplicaciones según la necesidad del desarrollo que emprendamos.

En la gráfica vemos claramente que, manteniendo una frecuencia constante (representada por el Período) de la señal de salida de cualquiera de los puertos de un microcontrolador, podemos aplicar una variación del tiempo de duración de la mencionada salida en estado alto (referencias de color rojo). De esta manera, si la variación es en aumento, incrementará el valor promedio de la tensión aplicada en el dispositivo conectado (referencias de color verde). En el caso de la aplicación de un ancho de pulso mínimo, observaremos una salida de tensión promedio casi nula, por lo que si tenemos allí conectado un LED, el mismo lucirá prácticamente apagado. Por el contrario, si el ancho de pulsos que le imponemos a nuestra señal es el máximo posible, el mismo LED brillará en toda su intensidad.

Con este artilugio electrónico estaremos acercándonos mucho a una salida analógica con la que podremos variar velocidades de motores, intensidad de brillo de un conjunto de LEDs y hasta las aplicaciones más interesantes y divertidas que se nos ocurran. La idea de funcionamiento inicial es muy simple y se sustenta en el funcionamiento del Timer0 del microcontrolador. Habilitando el overflow del TMR0 (T0IE = 1) y manejando su incremento con una variable BYTE, podemos jugar con valores que irán desde 0 hasta 255, donde desbordará y recomenzará el ciclo de cuenta. Por lo tanto, lo primero que haremos es (dentro del programa fuente) habilitar las interrupciones y darle un marco funcional y operativo ajustando los registros pertinentes para un funcionamiento correcto del TMR0.

Una vez que la interrupción (PWM_INT) esté preparada para acumular los valores que comenzarán a aparecer en la variable DUTY0 para finalmente entregar el resultado en el puerto B (sección del programa indicada en rojo difuso), ya estaremos listos para organizar y preparar la variable DUTY0 con valores comprendidos entre 0 y 255. Entre las más sencillas y prácticas para experimentar dentro de la mayoría de los programas que manejan el lenguaje BASIC, se encuentra la instrucción POT. Esta sencilla instrucción será capaz de leer un potenciómetro, una resistencia variable del tipo preset, un termistor, un LDR, un NTC, un PTC y cualquier otra resistencia que no supere los 50K.

La aplicación del circuito es muy sencilla y sólo se necesita un capacitor en serie con la resistencia variable. Mediante la instrucción POT, el microcontrolador mide el tiempo de descarga del capacitor, tiempo que será directamente proporcional a la resistencia que adopte P1. La sintaxis del ejemplo mostrado en la gráfica devolverá un valor máximo de 100 y lo cargará en la variable VAR1. Esto se conectará al pin 0 del puerto B y, a cada vuelta del lazo, estará informando al PIC si la resistencia ha variado o no. En nuestro caso, la instrucción llevará un límite de 255 para cargar al máximo la variable DUTY0. Veremos el funcionamiento del sistema de la siguiente forma:

Como habrás apreciado en el video, el funcionamiento es muy claro y sencillo y nos invita a profundizar en la experimentación. La primera posibilidad clara es la de hacer un contador de 1 a 255 por pasos de 1 en forma ascendente y luego en forma descendente. De esta forma, el LED que estamos utilizando para el ensayo variará entre máximos y mínimos y a ese comportamiento podemos darle mayor o menor velocidad según el ajuste del retardo que se ubica entre cada lazo FOR – NEXT.

En el final del ensayo con el hardware, completaremos la conexión de todo el puerto B con 8 LEDs indicadores a la salida e implementaremos un recorrido secuencial que, al ubicar los 8 LEDs en forma de círculo, nos permitirá observar un agradable efecto que, como en el caso anterior, podemos variar en velocidad para darle un poco de “vértigo” al movimiento. Pero es bueno dejarlo en la etapa inicial a la velocidad que te lo entregamos para poder apreciar el efecto “cuasi-analógico” que ofrecen los LEDs. Observarás en el código fuente la implementación de un comando que no habíamos utilizado hasta ahora y es el comando Complemento ~

Aquí necesitaremos 8 acumuladores y 8 variables DUTY; la función del “complemento” será muy sencilla de entender y muy útil. Como todos sabemos, el complemento de 1 es 0, de 11 es 00, de 1010101010 es 0101010101, y así con cualquier número binario. Por lo tanto, y para dar un ejemplo, mientras DUTY5 vaya decrementando su valor desde 255 hasta 1, DUTY6 se irá incrementando al mismo ritmo desde 1 a 255. Esto es muy interesante de ver y ensayar porque permite una transición suave desde un LED al contiguo. Si no se utiliza esta línea de código, que puedes eliminar para notar la diferencia, observarás que, cuando se apaga totalmente DUTY5, se enciende de golpe y a pleno DUTY6 siguiendo así toda la vuelta. En cambio, de esta forma, mientras uno se apaga el otro comienza a encenderse y la transición es más suave y agradable. Observa el video:

Por supuesto que el circuito es tan sencillo y simple que no merece aclaraciones especiales. Al 16F628A debemos alimentarlo con una fuente de alimentación de 5Volts y aplicarle en su conexión de oscilador un cristal de cuarzo de 4Mhz. Si lo que deseas es construir un gadget llamativo, dinámico y con luces en movimiento, puedes optar por una construcción a partir de una batería de 9Voltios y un 7805, sacando el ejemplo del popular artículo del POV. Luego, una resistencia de 4K7 para el MCLR por pin 4, más ocho resistencias de 220 ohms y 8 LEDs del color que gustes y quedarás como un rey regalando a tus chicas un presente navideño tan original. Seguramente, no podrás evitar ganar el mote de “friki del año”, pero sin duda alguna muchos te pedirán una demostración de lo que es capaz de hacer tu maravilla.

A toda esta aplicación que hemos visto se le puede agregar conexión RS232 al ordenador para variar parámetros como velocidad, efectos de transición de encendido, selección de salidas activadas y muchas aplicaciones más. También puedes utilizar este sistema de control PWM para cargas importantes de varios amperes, donde puedas manejar motores y/o luminarias incandescentes de varias decenas de watts. Para esto es importante que utilices un circuito optimizado con un MOSFET de potencia que pueda manejar una carga de varios amperes. Un ejemplo que te recomendamos sería un circuito como el siguiente:

En general, la frecuencia de PWM depende de la aplicación. Sin embargo, hay dos reglas de oro en lo que respecta a la frecuencia del PWM. La primera es que a medida que la frecuencia aumenta, también lo hace la demanda de corriente debido a pérdidas propias de un circuito conmutado. La segunda es que la capacitancia e inductancia de la carga tienden a limitar la respuesta en frecuencia del circuito. En condiciones de bajo consumo, es una buena idea utilizar el mínimo de frecuencia posible con la finalidad de reducir pérdidas. En los circuitos, la capacitancia y/o inductancia que intervienen son factores que deben ser considerados para la correcta elección de la frecuencia del PWM.

Los sistemas operados por PWM son utilizados frecuentemente en el control de motores debido a la eficacia de los sistemas conmutados en contraste con los de regulación lineal de velocidad. Un aspecto importante a la hora de elegir la frecuencia de PWM para el control de un motor es la respuesta del motor ante cambios en el "DutyCycle" (ciclo de trabajo) del PWM. Un motor va a tener una respuesta más rápida a cambio de un "DutyCycle" a frecuencias mayores. Otra consideración que no debes dejar de tener en cuenta es el ruido provocado por el motor. Los motores de corriente continua del tipo "brushed" (con escobillas y colector) hacen un ruido intolerable dentro del rango audible cuando son llevados a altas frecuencias. Para eliminar este fenómeno, hay que utilizar este tipo de motores a frecuencias mayores que los 4kHz. Recordemos que los humanos pueden escuchar frecuencias hasta los 20kHZ; sin embargo, la mecánica de los motores va a atenuar el ruido en virtud de su imposibilidad de resonar a tan altas frecuencias.

Es muy importante que conozcas las posibilidades que te brinda este artículo de poder obtener hasta 8 salidas PWM con un ajuste individual para cada salida en lo que refiere a su factor de trabajo (DutyCycle). Esta aplicación va mucho más allá que un simple juego de luces en forma de círculo o un emulador del efecto de Knight Rider, sino que estás ante un verdadero sistema de control que, aplicado apropiadamente, puede ayudarte a resolver muchos problemas de control. Además, PWM se puede lograr hasta con 555, pero del modo en que te lo hemos presentado, todas las salidas pueden mantener una probable sincronía requerida por la aplicación, hecho que con los 555 eso sería impensado.

Por otra parte, también puedes utilizar el/los módulos CCP que traen en forma nativa los microcontroladores, pero nunca alcanzarías a sumar ocho unidades a un costo tan irrisorio como el circuito propuesto. Es decir, un PIC que traiga más de dos módulos CCP, puede costar muchos euros, mientras que tú podrás controlar todo un mecanismo complejo con muy poco gasto y, además, siempre tendrás la posibilidad de hacer trabajar a este 16F628A (que controlará tus LEDs RGB o tus motores) como esclavo de otros procesadores más específicos abocados a cualquier función especial. Podemos afirmar en pocas palabras que el circuito propuesto hoy es un verdadero expansor de salidas PWM para cualquier sistema. Disfrútalo.

Escrito por Mario

Leave a Reply