PWM control 4 canales led 16F628A

Hola a todos... Estoy diseñando una especie de porta retrato en el cual cada lado tiene una tira de leds.... Lo que necesito es armar una secuencia en la que se atenúen uno o mas lados dando así un efecto de sombra...
Ademas contar con un pulsador que me permitirá cambiar de "programa", es decir el orden o los lados a priorizar...
Luego de mucha prueba y error logre hacerlo funcionar con el programa que le adjunto abajo...

Problemas:
No puedo lograr que no parpadeen... Probé instalando un capacitor y se reduce en algo pero no mucho...
Como hago para que tarde mas en cumplir el ciclo sin que parpadeen aun mas???


Este es el prog:

Código:
@ DEVICE pic16F628A, XT_OSC ' Opción del Osc Externo
  DEFINE osc 4                ; especifica que es de 4MHz
@ DEVICE pic16F628A, WDT_OFF ' Watchdog Timer ON 
@ DEVICE pic16F628A, PWRT_OFF ' Power-On Timer 
@ DEVICE pic16F628A, BOD_OFF 
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno 
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación 
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF 
@ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
cmcon=7
Trisb=0

FREC VAR BYTE ;variable FREC tamaño 255
FREC2 VAR BYTE
FREC3 VAR BYTE ;variable FREC tamaño 255
FREC4 VAR BYTE
FREC = 10
FREC2 = 10
FREC3 = 10 
FREC4 = 10
DIR var bit
DIR2 var bit
DIR3 var bit
DIR4 var bit
DIR = 1
DIR2 = 1
DIR3 = 1
DIR4 = 1
num var byte
num = 0


PROG:  
        
        IF num > 11 THEN num = 0     ; si es mayor a 10 vuelve a cero
        if porta.3 = 0 then ; suma
        pause 500
       
        num = num + 1
        pause 200 
                if num = 1 then
                FREC = 10
                FREC2 = 90
                FREC3 = 170
                FREC4 = 250
                pause 200
                
                endif
                if num = 2 then
                FREC = 30
                FREC2 = 250
                FREC3 = 250
                FREC4 = 250
                pause 200
                
                endif
                if num = 3 then
                FREC = 250
                FREC2 = 30
                FREC3 = 250
                FREC4 = 250
                pause 200
               
                endif
                
                if num = 4 then
                FREC = 250
                FREC2 = 250
                FREC3 = 30
                FREC4 = 250
                pause 200
                
                endif
                
                if num = 5 then
                FREC = 250
                FREC2 = 250
                FREC3 = 250
                FREC4 = 30
                pause 200
               
                endif
                
                if num = 6 then                ; dos contra dos
                FREC = 30
                FREC2 = 250
                FREC3 = 250
                FREC4 = 30
                pause 200
            
                endif
                
                if num = 7 then
                FREC = 30
                FREC2 = 30
                FREC3 = 250
                FREC4 = 250
                pause 200
               
                endif
                
                if num = 8 then
                FREC = 30
                FREC2 = 250
                FREC3 = 30
                FREC4 = 250
                pause 200
                
                endif
                
                if num = 9 then
                FREC = 250
                FREC2 = 30
                FREC3 = 30
                FREC4 = 250
                pause 200
                
                endif
                
                if num = 10 then
                FREC = 250
                FREC2 = 30
                FREC3 = 250
                FREC4 = 30
                pause 200
                
                endif
                
                if num = 11 then
                FREC = 250
                FREC2 = 250
                FREC3 = 30
                FREC4 = 30
                pause 200
                
                endif
                
                if num = 12 then
                FREC = 10
                FREC2 = 10
                FREC3 = 10
                FREC4 = 10
                pause 200
               
                endif
                
                
        else 
          
        
        
                PWM PORTB.0,FREC,1 ;sacar PWM l
                IF FREC > 249 THEN DIR = 0   ; si mayor 248 resta
                IF FREC < 11 THEN DIR = 1
                
                if DIR = 0 then  ; resta
                FREC = FREC - 1
                endif
                if DIR = 1 then   ; suma
                FREC = FREC + 1
                endif
                
                PWM PORTB.1,FREC2,1 ;sacar PWM 
                IF FREC2 > 249 THEN DIR2 = 0   ; si mayor 248 resta
                IF FREC2 < 11 THEN DIR2 = 1
                
                if DIR2 = 0 then  ; resta
                FREC2 = FREC2 - 1
                endif
                if DIR2 = 1 then   ; suma
                FREC2 = FREC2 + 1
                endif
                
                PWM PORTB.2,FREC3,1 ;sacar PWM 
                IF FREC3 > 249 THEN DIR3 = 0   ; si mayor 248  resta
                IF FREC3 < 11 THEN DIR3 = 1
                
                if DIR3 = 0 then  ; resta
                FREC3 = FREC3 - 1
                endif
                if DIR3 = 1 then   ; suma
                FREC3 = FREC3 + 1
                endif
                
                PWM PORTB.3,FREC4,1 ;sacar PWM 
                IF FREC4 > 249 THEN DIR4 = 0   ; si mayor 248  resta
                IF FREC4 < 11 THEN DIR4 = 1
                
                if DIR4 = 0 then  ; resta
                FREC4 = FREC4 - 1
                endif
                if DIR4 = 1 then   ; suma
                FREC4 = FREC4 + 1
                endif
                 
            endif
            
goto prog
end

Espero sepan alguna solucion...
Gracias...
 
Última edición por un moderador:
Hola:

No sé mucho de pics, sin embargo; te puedo comentar que para generar una señal PWM tienes que dejar una variable en un valor que será el máximo a alcanzar. Esto puede ser por medio de un timer o por simple cuenta en incremento o decremento de una variable.
Después, tus salidas deberán de cambiar de estado al ocurrir la igualdad ante una cuenta y nuevamente cambiar de estado ante el valor máximo(modo up tipo diente de sierra).

espero te sirva de algo

saludos
 
Gracias Dario... Pero no entiendo nada de lenguaje C...
Soy novato y arranque con PBP...
Alguien tiene idea de como modificar mi programa para que funcione sin parpadear tanto????
Graciassss...
 
Gracias Dario... Pero no entiendo nada de lenguaje C...
Soy novato y arranque con PBP...
Alguien tiene idea de como modificar mi programa para que funcione sin parpadear tanto????
Graciassss...
:unsure: Creo que no checaste bien.
El programa esta escrito en PICBASIC desde que salio el tema de ese programa lo segui.
Y creeme que funciona muy bien. Lo que pasa es que esta escrito con Proton.
Pero es PICBASIC No C :eek:pss:
 
Gracias Darbytes por la corrección... Estuve toda la tarde tratando de hacer que funcione sin utilizar el PWM, variando los tiempos de encendido y apagado... pasa que es mas difícil todavía... La idea es que no parpadee tanto... Tené en cuenta de que lo que yo necesito es que estén los 4 canales encendidos y a partir de ahí generar efectos...
Mañana sigo probando lo otro a ver si puedo hacer que funcione...
 
hola por aqui
debes tomar en cuenta la velocidad con la que trabaja el pic y por lo poco que entiendo en tu codigo que expuso, porque en realidad yo programo con otros programas, para que se note bien la degradacion de la luz debe hacerlo por interrupciones y no veo en tu programa las mismas to trate de hacerlo con 12f675 y no hallaba la manera hasta que leyendo di con la solucion, lei por ahi tambien que el ojo humano para notar ese detalle no debe exeder las 30 pulsaciones por segundo, he ahi no veo el pre-escaler

hasta pronto
 
Última edición:
Logre que funcione... Lo que hice fue crear cuatro variables y cuatro sumadores que van sumando y restando en un bucle... El tiempo de apagado lo configuro para que sea el resultado del tiempo total deseado menos el tiempo encendido... de esta manera mantengo la frecuencia constante...
El código lo tengo en la otra compu (sin internet) después se los paso... Siguiendo esa estructura se puede ampliar a gusto y es fácil cambiar las secuencias ya que solo tenemos que cambiar el punto de inicio de cada variable

Yo genere tres canales con 16F628a para una dimmer RGB.. esta facil ampliarlo para cuatro canales, el codigo esta en PIC CCS V 4.114... fijate a ver si te sirve

https://www.forosdeelectronica.com/f24/aporte-mezclador-luz-rgb-65055/


Gracias por el aporte, se ve muy lindo... Pasa que no entiendo nada de lenguaje CCS... Este verano cuando termine de rendir me pongo a aprender... Hay cosas que con PBP quedan en el aire ademas que no se puede hacer correr el programa solo para saber donde esta el error...
Gracias...
 
Última edición:
Atrás
Arriba