JVM-Electronics

  • Aumentar fuente
  • Fuente predeterminada
  • Disminuir fuente

Control de Leds por PWM

E-mail Imprimir PDF

CONTROL DE LED POR PWM

La modulación por ancho de pulsos (MAP o PWM, siglas del inglés Pulse-Width Modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una sinusoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.

Si suministramos y cortamos la señal de alimentación de la carga (led o motor) lo suficientemente rápido como para que el parpadeo no sea visible al ojo humano, podemos comprobar visualmente la variación de luminosidad de un led o el cambio en la velocidad de un motor.

Al provocar esta variación de frecuencia de pulsos (PWM) a partir de 30 veces por segundo dejaremos de observar el parpadeo del led, en el caso del motor notaremos que gira de forma menos pulsante.

En la imagen de abajo podemos observar la representación gráfica de los pulsos PWM con respecto al tiempo.

onda1

Lo que hacemos para generar los pulsos es mantener un valor logico de "1" durante un tiempo y pasarlo al valor logico "0" durante otro tiempo. La suma de ambos tiempos (tiempo de "1" y tiempo de "0") comprende un ciclo completo.

La imagen superior muestra un 50% de "duty cycle" o ciclo de servicio, la mitad esta a 0 y la otra mitad esta a 1. Para variar el brillo del led debemos variar la proporcion de duty cycle.

onda2

Tal y como vemos en la imagen superior, variamos la duración de uno de los semiciclos diferenciando el tiempo de "1" lógico y "0". De esta forma hacemos que el tiempo de estado bajo "0" sea mayor que el tiempo de estado alto "1" y el efecto sea de disminución de brillo en el caso del led o reducción de velocidad en el caso del motor.

En el proyecto que mostramos a continuación aplicamos esta teoría para regular el brillo de tres leds independientes o de un led RGB. El proyecto esta escrito para que cambie de color en modo secuencial y hemos utilizado dos métodos: por interrupción (con TMR0) y sin ella.

La versión con interrupción permite realizar otras tareas mientras el TIMER0 efectuá el PWM, esto nos da flexibilidad para que podamos hacer mas funciones de software sin estar pendientes de los ciclos de reloj que perdemos al procesar nuestros códigos o rutinas de control.

ESQUEMA ELECTRICO

esquema

IMAGEN DEL PCB

pcb

CODIGO BASADO EN SOFTWARE

'*******************************************************************************
'Creado y verificado por: Julio Montagut
'Web: http://www.jvmbots.es
'
'Mikrobasic PRO Version 3.2.0
'
'-HARDWARE:
' MCU: PIC12F675 - INTRC - 4Mhz
' 3 Leds conectados en:
' GPIO.2 - Led verde
' GPIO.4 - Led azul
' GPIO.5 - Led rojo
'*******************************************************************************

program RGB_DEMO1

'-------------------------------------------------------------------------------
' VARIABlES
'-------------------------------------------------------------------------------
Dim Contador as byte ' Variable contador
LEDR as byte ' Contador Led rojo
LEDA as byte ' Contador Led azul
LEDV as byte ' Contador Led verde
Paso as byte ' Paso de color
Retardo as byte ' Duracion de retraso en cada paso

'-------------------------------------------------------------------------------
' INICIALIZACION
'-------------------------------------------------------------------------------
main:
ANSEL = %00000000 ' Seleccion de entradas analogicas
CMCON = %00000111 ' Deshabilitamos los comparadores
INTCON = %00000000 ' Deshabilitamos las interrupciones
OPTION_REG = %00000000 ' Reset del registro de opciones

TRISIO = %00000000 ' Establecemos el puerto (Entradas o salidas)
GPIO = %00000000 ' Seteamos el valor inicial del puerto

LEDR = 0 ' Inicializacion del Contador rojo
LEDA = 0 ' Inicializacion del Contador azul
LEDV = 0 ' Inicializacion del Contador verde
Paso = 0 ' Inicalizacion del Paso de color
Retardo = 0 ' Duracion de retraso en cada paso

While true
'---------------------------------------------------------------------------
' CODIGO CAMBIO COLORES
'---------------------------------------------------------------------------
Inc(Retardo)
If Retardo>9 then
Retardo=0
Select case Paso
Case 0
Dec(LEDA)
Inc(LEDR)
If LEDR=0xFF then Paso=1 End if
case 1
Dec(LEDR)
Inc(LEDV)
If LEDV=0xFF then Paso=2 End if
case 2
Dec(LEDV)
Inc(LEDA)
If LEDA=0xFF then Paso=0 End if
End select
End if

'---------------------------------------------------------------------------
' CODIGO PWM LEDS
'---------------------------------------------------------------------------
ASM
Movlw 0xFF ' Cargamos el registro W con 255 (hex)
Movwf _Contador ' movemos el valor a contador
Movlw 0x34 ' Hacemos una or de 0x34 a GPIO
Iorwf GPIO, F ' Para setear GPIO.2, GPIO.4 y GPIO.5

LOOP_:

Movf _LEDR, W ' Cargamos el valor del led rojo
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 5 ' enciende el led rojo

Movf _LEDA, W ' Cargamos el valor del led azul
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 4 ' enciende el led azul

Movf _LEDV, W ' Cargamos el valor del led verde
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 2 ' enciende el led verde

Decfsz _Contador,1
Goto LOOP_
END ASM
Wend
end.

CODIGO BASADO EN INTERRUPCION

'*******************************************************************************
'Creado y verificado por: Julio Montagut
'Web: http://www.jvmbots.es
'
'Mikrobasic PRO Version 3.2.0
'
'-HARDWARE:
' MCU: PIC12F675 - INTRC - 4Mhz
' 3 Leds conectados en:
' GPIO.2 - Led verde
' GPIO.4 - Led azul
' GPIO.5 - Led rojo
'*******************************************************************************


program RGB_DEMO2
'-------------------------------------------------------------------------------
' VARIABlES
'-------------------------------------------------------------------------------
Dim Contador as byte ' Variable contador
LEDR as byte ' Contador Led rojo
LEDA as byte ' Contador Led azul
LEDV as byte ' Contador Led verde
Paso as byte ' Paso de color

'-------------------------------------------------------------------------------
' RETARDO DE SOFTWARE
'-------------------------------------------------------------------------------
Sub procedure Esperar(dim tiempo as word)
Do
clrwdt
Delay_ms(1)
Loop until Dec(tiempo)=0
End sub

'-------------------------------------------------------------------------------
' SUB DE INTERRUPCION
'-------------------------------------------------------------------------------
sub procedure interrupt
'-------------------------------------------------------------------------------
' CODIGO PWM LEDS
'-------------------------------------------------------------------------------
ASM
Movlw 52 ' Hacemos una or de 0x34 a GPIO
Iorwf GPIO, F ' Para setear GPIO.2, GPIO.4 y GPIO.5

Movf _LEDR, W ' Cargamos el valor del led rojo
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 5 ' enciende el led rojo

Movf _LEDA, W ' Cargamos el valor del led azul
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 4 ' enciende el led azul

Movf _LEDV, W ' Cargamos el valor del led verde
Subwf _Contador, W ' restamos el valor a contador
Btfss STATUS, W ' si el resultado es 0 no salta y
Bcf GPIO, 2 ' enciende el led verde

Decf _Contador+0, F ' Decrementamos el contador
END ASM

TMR0 = 240
INTCON.T0IF=0
end sub

'-------------------------------------------------------------------------------
' INICIALIZACION
'-------------------------------------------------------------------------------
main:
ANSEL = %00000000 ' Seleccion de entradas analogicas
CMCON = %00000111 ' Deshabilitamos los comparadores

TRISIO = %00000000 ' Establecemos el puerto (Entradas o salidas)
GPIO = %00110100 ' Seteamos el valor inicial del puerto

LEDR = 0 ' Inicializacion del Contador rojo
LEDA = 0 ' Inicializacion del Contador azul
LEDV = 0 ' Inicializacion del Contador verde
Contador = 0 ' Inicializacion del contador
Paso = 0

OPTION_REG = %10000000 ' Prescaler 1:2 asignado a TMR0
TMR0 = 240 ' Preset del Timer0
INTCON = %10100000 ' Interrupcion de TMR0 y Globales

While true
'---------------------------------------------------------------------------
' RUTINA DE CAMBIO DE COLOR
'---------------------------------------------------------------------------
Select case Paso
case 0
Dec(LEDA)
Inc(LEDR)
If LEDR=0xFF then Paso=1 End if
case 1
Dec(LEDR)
Inc(LEDV)
If LEDV=0xFF then Paso=2 End if
case 2
Dec(LEDV)
Inc(LEDA)
If LEDA=0xFF then Paso=0 End if
End select

Esperar(10) ' Tiempo para Paso de color
Wend

end.
DESCARGAS
Última actualización el Martes, 02 de Febrero de 2010 19:39  
English Spanish