8 Canales de PWM con un 16F628A

Mario Sacco . Vista 64958 veces

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 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 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 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 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 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 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.

    Download:  Los archivos fuente de los ejemplos de este artículo

¿Y tú, qué opinas?

  • #1 Ramiro
    Ramiro sábado, 21 de noviembre de 2009, 16:42

    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...

    Responder >> Attention Minus Plus Votos: 5 de 5
  • #2 <a href="../../foro/member.php?u=16843" target="_self">kianji</a>
    kianji sábado, 21 de noviembre de 2009, 16:59

    ^_^ 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

    Responder >> Attention Minus Plus Votos: 3 de 3
  • #3 <a href="../../foro/member.php?u=23103" target="_self">PABLO_xp</a>
    PABLO_xp sábado, 21 de noviembre de 2009, 17:48

    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???

    Responder >> Attention Minus Plus Votos: 5 de 5
  • #4 Gustavo
    Gustavo sábado, 21 de noviembre de 2009, 19:27

    Saludos, Excelente articulo... Me gustaria saber que compilador usaste?

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #5 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 00:08

    #1Suena 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 ...

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #6 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 00:12

    #3Hola 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 www.ucontol.com.ar encontrarás info sobre donde conseguirlo.

    Saludos cordiales !

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #7 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 00:16

    #2Hola 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 !

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #8 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 00:22

    #4Hola 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 !

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #9 Capitan Obvio
    Capitan Obvio domingo, 22 de noviembre de 2009, 02:47

    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

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #10 <a href="../../foro/member.php?u=18623" target="_self">LucasVega</a>
    LucasVega domingo, 22 de noviembre de 2009, 15:24

    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

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #11 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 16:05

    #10Hola 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 !

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #12 <a href="../../foro/member.php?u=8" target="_self">Mario</a>
    Mario domingo, 22 de noviembre de 2009, 16:07

    #9Hola 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 !

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #13 jukinch
    jukinch domingo, 22 de noviembre de 2009, 23:17

    Impecable. Como siempre. Ya pareces el sensai de karatekid. Alias Mishagui.
    Jukinch

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #14 <a href="../../foro/member.php?u=22530" target="_self">charlie75</a>
    charlie75 lunes, 23 de noviembre de 2009, 15:25

    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.

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #15 <a href="../../foro/member.php?u=23103" target="_self">PABLO_xp</a>
    PABLO_xp lunes, 23 de noviembre de 2009, 18:19

    #6muchas 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

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #16 <a href="../../foro/member.php?u=23442" target="_self">papinolmedo</a>
    papinolmedo lunes, 23 de noviembre de 2009, 19:14

    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

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #17 <a href="../../foro/member.php?u=23442" target="_self">papinolmedo</a>
    papinolmedo lunes, 23 de noviembre de 2009, 19:17

    http://www.youtube.com/watch?v=43gAH3CBPoE



    perdon por la repeticion... no ha funcionado el link xD

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #18 <a href="../../foro/member.php?u=23442" target="_self">papinolmedo</a>
    papinolmedo lunes, 23 de noviembre de 2009, 19:18

    #16http://www.youtube.com/watch?v=43gAH3CBPoE

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #19 Dieguitofernandez
    Dieguitofernandez lunes, 23 de noviembre de 2009, 21:43

    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!

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #20 <a href="../../foro/member.php?u=27120" target="_self">heavyshaka</a>
    heavyshaka viernes, 21 de mayo de 2010, 20:52

    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.

    Responder >> Attention Minus Plus Votos: 0 de 0
  • « «« Anterior12Siguiente »» »
    Cargando...Cargando...

  • nuevo comentario
    Nombre

    Campo obligatorio

    Email

    Escriba una dirección de correo electrónico con el formato sunombre@ejemplo.com.

    Campo obligatorio

 
Ir arriba