in

Thug lifeThug life

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.

Distintos ciclos de trabajo para una misma frecuencia. Eso es la escencia del PWM

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.

Declaración de variables y alias a usar en el programa

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.

Registros e interrupción

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.

Conexión del potenciómetro y ejemplo de rutina POT

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 ~

Listado para las 8 salidas PWM

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:

Circuito sugerido para exitar cargas a través de un transistor MOSFET

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.

Reportar

¿Qué te pareció?

Escrito por Mario

31 Comments

Leave a Reply
  1. Muy buena nota mario yo hice esto para el proyecto final de electronica en el el cole, pero con ventiladores. use un 84a e hice las rutinas en asm para 4 velocidades a una f de 20kHZ
    funciono espectacular… lo ibamos a hacer con el 877A pero como habia q usar LCD COnv AD el modulo CCP no lo podiamos utilizar asi q quedo un sistema con 2 pic…

    • Suena interesante Ramiro !

      Cuéntame un poco más del proyecto. En líneas generales, claro. No comprendo porqué no pudo ser con un 16F877A ya que el mismo tiene suficientes puertos …

  2. ^_^ El pwm es una super herramienta yo la aprendí en la materia de electrónica de potencia y la aplique por primera vez con ayuda de un amigo en variar la Velocidad de un motor DC

    • Hola Truko !

      Gracias por estar siempre con nosotros !
      ¿Utilizaron un puente H para algún motor bidireccional? Siempre es muy interesante trabajar con PWM y es como tú dices. Siempre se aprende mucho trabajando con este método de trabajo.

      Saludos !

  3. buen tutorial como siempre mario, un consejo te pido; cual es un buen grabador de pic, en simpleza o si es "todoterreno", cual aconsejarias para empezar???

    • Hola Luxax !

      Yo utilizo el GTP USB+ y es un grabador que siempre voy a recomendar. Realmente vale cada centavo que te lo cobran. Siempre hablando de microcontroladores PIC. Para otras marcas no sabría orientarte. En la web http://www.ucontol.com.ar encontrarás info sobre donde conseguirlo.

      Saludos cordiales !

      • muchas gracias guillermo, yo estoy por construir uno propio, vamos a ver si sale, se llama te-20se, todabia estoy recopilando materiales, quisiera saber si se puede cambiar la entrada por la usb que hiciste hace poco, me intereso mucho, te paso la pagina para que la veas
        http://www.terra.es/personal5/ajss123/te_20se.htm
        el db9 ya esta viejito para estos trabajos, jejeje, porque para hacerlo andar necesito arreglar y poner a andar una de las maquinas viejas que tengo, solo tengo la placa madre, asi que seria mucha ayuda cambiar el db9 por usb, gracias

    • Hola Gustavo !

      Gracias por estar con nosotros. Utilizamos lenguaje Basic, y el programa se llama Proton Development Suite. Puedes descargar una versión Lite (Free) (que permite aplicar la mayoría de los ejemplos que vemos en NeoTeo) del sitio web oficial.

      Saludos !

  4. Hola, la verdad no soy ni amateur en el ambito electronico pero quisiera saber si podian hacer un "minidocumental" de como funcionan estos circuitos? Ya que al hablar de un circuito solo me imagino como pasa electricidad e inumerables aperturas para obedecer una orden, pero no como "interpretan" las señales u ordenes que uno da…. Saludos

    • Hola Capitan !

      Gracias por estar siempre con nosotros !
      Suena muy interesante tu propuesta. Estudiaremos las posibilidades y veremos si en un futuro próximo se puede aplicar una modalidad así.

      Saludos cordiales !

  5. Hola Mario:
    No sabia que se podia hacer esto, tener 8 salidas PWM en un solo micro es algo que hasta que no lo hagas no lo crees. La verdad eres un maestro de la creatividad; espero poder llegar a tener algun dia esa misma creatividad e ingenio que tienes, y esa habilidad tan grande para implementar cosas dificiles con algo sencillo.
    Eres un Maestro completo.

    Un abrazo desde Colombia

    • Hola Yesbond !

      Los PICs económicos traen sólo uno o dos módulos CCP y cuando quieres armar un hexapodo o cualquier aplicación robótica (entre las miles que siempre hacen falta), estas opciones son muy prácticas y sencillas. Me alegra que te haya gustado.
      Ojalá algún día te sea útil ! :))

      Un abrazo !

  6. Buenos días. Interesante nota, aunque un punto a mejorar seria el uso de PSOC para futuros proyectos pues son mas completos y mejores en practicamente todo con respecto a los PIC de Microchip y a un costo igual o inferior.

    De todas maneras muy buen aporte.

  7. Hola tocayo… yo también soy un picmaniaco y te vengo siguiendo desde hace tiempo… vengo de TodoPic

    Enhorabuena… un buen trabajo.

    Conozco y tengo el Proton y andaba detrás de hacer algo así para ganarme el verdadero titulo de "Nerdo del año" xD… No se si seguirás la serie BattleStar Galactica y sabrás lo que es un Cylon. Tu circuito es ideal para ganar el titulo de Nerdo del Siglo xD… pero me temo que se nos han adelantado xD :

    Mira este video de algo que tiene que ver con Galactica… la caña…

    Video youtube

    Un saludo

  8. Muy buena nota, como siempre… solo una duda, yo tengo planeado aplicar este mismo principio para manejar unos leds, generando la señal PWM en base a una placa arduino, el tema es que no se que debo usar para la etapa de "potencia", ya que debo manejar muchos leds, escuche hablar de mosfet, de transistores, pero no se cuales, agradezco cualquier tipo de ayuda! Gracias!

  9. Hola:

    muy buen tutorial, hace poco consegui el PIC 16F628a, lo estoy programando en Micro C y solo he podido configurarlo para que utilice el oscilador interno. Lo que quiero hacer ( y quisiera saber si tu podrias orientarme) es que este pic encienda 8 leds infrarrojos a una frecuencia de 38 KHZ, empeze probando con un led, la frecuencia la genere atraves de un ciclo anidado,pero al parecer el led enciende pero no a los 38khz, me pregunto si es por el oscilador interno. Podria hacerlo con el PWM y mas importante este PWM me permitiria encender los 8 leds al mismo tiempo.

  10. Hola Mario. La explicación y la idea 10 puntos, pero . . . ¿y el circuito??? Tené en cuenta que siempre es obvio lo que se conoce. Gracias por tu aporte

  11. hola:
    bueno ya logre generar los pulsos a 38khz con un 50% de duty, no estaba considerando que las instrucciones tambien consumen tiempo, por eso es que no daba la frecuencia, aun no intento ponerle los 8 leds al pic, por que no quisiera quemarlo.

  12. Hace bastantes días estaba por iniciarme en la programación Pic con C, conozco bastante el ensamblador del Pic como el lenguaje C básico. pero no logro adaptarme a la programación de Pic con C.
    Gracias por sus tutoriales, pero desearía tener una tabla con una correspondencia biunívoca entre el ensamblador y el C con el Pic 16f84 pués este es el básico y yo lo adoro.
    además el medio ya me está exigiendo programación de Pic C, aunque yo no lo veo necesario, quiero aprender.

    Gracias a Uds por existir . ferlemega

  13. Veo que por haca hay personas muy inteligentes, muy agradecido, me tomo nota para cuando aprenda algo sobre pic, hoy lo que necesito son 6 salidas de PWM desfasadas para motor 380V.,no se si ese programa estará o tendré que buscar quien me lo diseñe, soy electrónica pero de la otra época,desfasado,.Un cordial saludo a todos.

  14. hola mario

    me han interesado sus proyectos y el compilador que emplea.
    estoy buscando en compilador proton en la red pero me funciona.
    me podría dar información de donde lo puedo descargar.
    tengo win7 64bit y una maquina virtual con win xp a 32bit.

    gracias.

  15. Que tal como estan… he revisado el programa varias veces y no mismo me funciona tanto simulado como en la practica y NADA NO ME FUNCIONA……. por favor AYUDAAAAAAAAAAA

    gracias por su atencion

Responder a Cristobal Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

CERN reinicia el Large Hadron Collider (LHC)

La sucesión de Fibonacci en la naturaleza