[Aporte] Dimmer para led con PWM en assembler

Una manera sencilla de lograr el efecto fading en los leds por medio de pic es por el PWM sin tener que usar circuito adicional o un DAC.

Sabemos que el voltaje promedio varia al variar el ancho de pulso de una señal de reloj como se observa en la siguiente imagen

pwm.jpg


Luego necesitamos variar el ancho de pulso de una señal de reloj.
Para una frecuencia entre 500Hz a 400Hz se consigue un buen dimmer para leds

Utilizamos un cristal de 10MHz que genera 10/4 = 2.5MHz para trabajar las instrucciones esto es 1/2.5 = 0.4us por instruccion , el loop de retardo utiliza como 5 pasos por 1 cuenta de decremento entonces
5*0.4us = 2us por un decremento en el loop de retardo
En total utilizamos 4FFh para la cantidad maxima total en tiempo alto y bajo del led
4FFh = 1279D
Por la demora en cada decremento
2*1279 = 2558us
Que vendria a ser el periodo de nuestra señal PWM
La frecuencia es 1/2558 = 390.93Hz

Ahora veamos el modo de generar el PWM:



De la imagen, A=FFh y B=04h entonces BA = 4FFh
Comenzamos con un retardo inicial "Y" aparte del pwm, en estado bajo para el led, luego iniciamos el pwm , de la imagen aumentamos "x" hasta que el tiempo en bajo sea cero luego decrementamos "x" hasta cero y nuevamente el retardo inicial "Y" para comenzar otra vez con el PWM, pero esto lo hacemos con numeros concatenados para obtener una cuenta mayor a FFh , y la dimmerizacion sea mas observable con un mayor efecto.

Todo el efecto de aumento y disminucion de luz se da en 1279*2558us = 3271682us = 3.2s tiempo de aumento y la disminucion es el mismo tiempo entonces todo el efecto se observara en 6.4s pero en las pruebas se observa que es alrededor de 5s.

El efecto puede ser observado en multisim y en proteus por medio del osciloscopio

Se aceptan comentarios y sugerencias para mejorar el efecto o pulir el codigo ya que recien estoy comenzando con pic aunque manejo un poco de assembler
Tambien sobre los calculos realizados.

gracias :cool:
 

Adjuntos

  • Dimmer por PWM Assembler.txt
    3.9 KB · Visitas: 147
Última edición:
Hola, tu programa es muy bueno, sólo me pregunto como podría hacerle para hacerlo variar acorde a una fotoresistencia o potenciometro
Saludos
 
hola gracias por mandarme al tutorial, pero en si no entiendo como se programa, en si como se empieza la rutina para que se pueda regular la intensidad del led, por ejemplo con un potenciometro? como se iniciaría la programacion?
 
El codigo propuesto es para lograr un control automatico de la intensidad de luz en el led, para poder controlarlo mediante un potenciometro solo tendrias que mantener fijo el ciclo de trabajo que dependeria del valor analogico del potenciometro.
Puedes guiarte del codigo para empezar, luego añades el valor analogico y haces los cambios necesarios.

pd: Postea el codigo que obtengas despues, si necesitas ayuda.
 
Se puede gestionar varias salidas, pines, pero todos estos pines estaran sincronizados. La lógica no esta desarrollada para que un pin este a 80%DT y otro pin a 50%DT.

Para que un puerto (puerto B por ejemplo) este con PWM cambias:
bcf PORTB,0 por clrf PORTB
y luego
bsf PORTB,0 por PORTB = 0xFF en assembler claro

Para que pines específicos y no todo el puerto tengan PWM:
Sea que tengas en el puerto B el valor 01001100
añades tu variable para especificar que pines tendran PWM:
varP = 11100010 los ultimos tres bits y el segundo bit tendran PWM
bcf PORTB,0 por PORTB = PORTB AND complemento(varP) en assembler
bsf PORTB,0 por PORTB = PORTB OR varP en assembler

los otros pines no especificados con PWM mantienen su valor.

salu2
 
buenas hermano podria montar el diagrama del circuito ? y tomando como ejemplo este codigo se podria controlar el angulo de fase para controlar una lampara incandescente ? se es asi que consideraciones se deberían tomar ?
 
Atrás
Arriba