Generando señales PWM por software

Ante la necesidad de armar un circuito para controlar LEDs RGB con un microcontrolador PIC16F627A me encuentro con que este chip posee un solo módulo PWM. La solución es generar las señales PWM mediante software, algo sencillo de implementar y que realmente funciona muy bien siempre y cuando la frecuencia de la señal no sea critica.

Tomando como base el documento que encontramos en el foro TodoPIC podemos resumir la lógica a lo siguiente:

1. Configuramos la interrupción por timer 0.
2. Inicializamos un variable «contador» con valor 0.
3. Inicializamos dos variables más: «TPWM» (período) y «DUTY» (ciclo de trabajo).
4. Cargamos TMR0 con el valor 254.
5. Definimos un bit de salida con el valor 1, el pin por donde vamos a sacar la señal PWM.

Dentro de la rutina de interrupción lo que hacemos es incrementar el contador en una unidad. Si este es igual al ciclo de trabajo manda el pin de salida a 0, si en cambio es igual al período manda el pin de salida a 1. Modificandole el valor a la variable DUTY cambiamos el tiempo de encendido de la señal.

Adjunto el código escrito en BASIC de PIC Simulator IDE:

'CONTROLANDO LEDS RGB VIA PWM POR SOFTWARE
'AUTOMATISMOS MAR DEL PLATA - 9 DE JULIO DE 2012

PORTA = %00000001
contador = %00000000
tpwm = %00000000
duty = %00000000

main:
tpwm = 4
duty = 3
End                                               

On Interrupt

contador = contador + 1
If contador = duty Then RA.0 = 0
If contador = tpwm Then
RA.0 = 1
contador = 0
Endif

TMR0 = 254
INTCON.T0IF = 0  'habilita nuevamente la interrupción
Resume                                            

Por último agrego una captura de pantalla tomada con el analizador Logic donde podemos ver tres señales PWM generadas por software funcionando a una frecuencia de aproximadamente 1,4KHz y con distintos ciclos de trabajo. Cualquier duda o sugerencia es bienvenida vía comentarios!

Enlaces de interés