TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: johnnybravo en 17 de Septiembre de 2007, 13:03:03
-
Hola amigos
estuve haciendo un efecto para luces ..algo asi como un dimer pero en automatico...( me explico mejor: el efecto que quiero lograr es algo como si tuviera un dimer a la mano y me pusiera a jugar con el potenciometro lentamete le subo la intensidad y luego lentamente le bajo la intensidad y asi sucesibamente,. pero claro esos es solo el efecto en realida el pic deberia hacer todo el efecto automaticamente)
hice un codigo en asm. pero no me satisface el efecto logrado como que no es progresivo, ademas no llega a apagarse por completo y es demasiado rapido.
mas abajo les dejo el codigo aber si me dan una manito, o alguna otra idea de como hacer el codigo.
el codigo esta basado integramente en la teoria del disparo del triac para lograr el efecto del dimer
;Control de la intensidad lumínica de la lámpara mediante el sistema de recorte de fase. Cada 8.33 ms.
;tenemos el paso de la señal rectificada en doble onda porcero. A partir de hay introducimos temporizaciones que al
;acabar nos indicará el instante para disparar el triac, siempre antes de que llegue otro impulso de paso por cero.
;
;Condiciones de funcionamiento según se empiece a transcurrir el tiempo:
;* Al conectarse el montaje la lámpara está apagada.
;* irá aumentado progresivamente de 0% al 100% de la intensidad de luz.
;* Al llegar al 100% ira disminuyendo progresivamente hasta llegar al 0% y nuevamente ira en aumento
LIST P=16f628A
INCLUDE "P16f628A.inc"
ERRORLEVEL -302
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
CBLOCK 0x20
VAR01 ;equ 0x20 variable a modificar para poder variar el brillo de las lamparas
VAR02 ;equ 0x21
VAR03 ;equ 0x22
VAR04 ;equ 0x23
VAR05 ;equ 0x24 señalizador para saber si sube o baja
VAR06 ;equ 0x25 determina la velocidad con que aumenta o disminuye el brillo
ENDC
org 0x00 ;inicio de programa y direccion de interrupcion
goto Inicio
org 0x05
Inicio
org 0x20
call banco1 ;Configurar el puerto B (RB4 salida).
bcf TRISB,4 ;El Puerto RB4 como salida
call banco0
bcf PORTB,4 ;pongo a cero el Puerto RB4
call banco1
bcf OPTION_REG,INTEDG ;Configurar la INT, flanco de bajada de la INT
call banco0
programa
movlw 0xF1
movwf VAR01
clrf VAR05
progra1
btfss INTCON,INTF ;salta si el bit INTF=1 (señalizador de interupcion RB0/INT)
goto progra1
incf VAR06,F
bcf INTCON,INTF ;bajamos la bandera señalisadora INTF
call varia
call disparo
call Sube_Baja
goto progra1
;--------------------------------------------------
;Subrutinas para incrementar y decrementar el brillo
;--------------------------------------------------
Sube_Baja
btfsc VAR05,0 ;testeo del bit 0 del registro VAR05
goto Baja ;si es = 1 baja
goto Sube ;si es = 0 sube
Baja
btfss VAR06,4 ;testeo del bit 4 y si vale uno salto
goto saltu1
clrf VAR06
incf VAR01,1 ;incrementa el registro VAR01
bcf STATUS,C ;corrección para no llegar a 0xFF, solo llego hasta 0xF1
movlw 0x0F
addwf VAR01,W
btfss STATUS,C
goto saltu1
movlw 0xF1
movwf VAR01
bcf VAR05,0 ;bandera abajo =0, indica si sube=0 o baja=1
saltu1
return
Sube
btfss VAR06,4 ;testeo del bit 4 y si vale uno salto
goto saltu3
clrf VAR06
decf VAR01,F ;decrementa el registro VAR01
bcf STATUS,C ;corrección para no llegar a 0x00, sólo llego hasta 0x0F
movlw 0xF1
addwf VAR01,W
btfss STATUS,C
goto saltu2
return
saltu2
movlw 0x0F
movwf VAR01
bsf VAR05,0 ;bandera arriba =1, indica si sube=0 o baja=1
saltu3
return
;------------------------------------
;Disparo del triac: 225 useg. necesarios para activar el triac
;------------------------------------
disparo
bsf PORTB,4
call usg225
bcf PORTB,4
return
usg225
movlw 0x4B
movwf VAR04
sal4
decfsz VAR04,F
goto sal4
return
;-----------------------------------------------
;Retardo variable después de la INT.
;El tiempo de la interrupcion de cruze por cero INTF es de 8.33ms (8333 microsegundos)
;Si un registro (VAR02) lo cargo con un valor comprendido entre 01h y FFh y lo voy decrementando
;hasta llegar a cero con un retardo fijo de unos 25 microsegundos entre medias puedo conseguir
;unos pocos microsegundos o los 8.3 milisegundos
;-----------------------------------------------
varia
movf VAR01,W
movwf VAR02
salte
call usg25
decfsz VAR02,F
goto salte
return
usg25
movlw 0x08 ;retardo de 25 us
movwf VAR03
sal5
decfsz VAR03,F
goto sal5
return
;------------------------------------------
;Subrutinas de cambios de bancos.
;------------------------------------------
banco0
bcf STATUS,RP0
return
banco1
bsf STATUS,RP0
return
END
-
Hola johnnybravo, veo que usas el flag de la interrupción, pero no usas la interrupción, Por que no la usas?
Leo pero no llego a entender a que corresponde el 8.33ms, ¿es uno dividido por el doble de la frecuencia de la red?
Recuerda que por cada semiciclo el triac se dispara solo una ves, y el solo se desconecta si en el gate no hay tensión!!! por otro lado el triac debería trabajar con alterna y no continua pulsante, para continua pulsante están los tiristores que son más aptos, esto lo aclaro por las dudas.
A partir del cruce por cero (momento que comienzas a contar XX tiempo) cuanto más largo sea ese tiempo menos luminosidad tendrá la lámpara
Recuerda que la forma de onda es una sinusoidal, por lo que su potencia RMS no es directamente proporcional al "retardo" de disparo del triac, por lo que para que el encendido sea "aparentemente" progresivo y lineal deberás hacer una "corrección" de la rampa de encendido por medio de la correspondiente tabla.
Espero te sea de ayuda.
Un saludo.
Atte. CARLOS.
-
hola charly si asi es 8.33 ms es el periodo de un semiciclo.. ya que por aqui la frecuencia de la tension AC es de 60HZ
entonces esto queda asi:
f=60Hz
T=16.66ms
T/2= 8.33ms (tiempo que demora un semiciclo, ya sea negativo o positivo)
y si el triac trabaja en alterna
ahora estoy usando la interrupcion solo par saber que se produjo el cruce por cero atraves de la bandera de INT..pero no funciona.... como que quiere pero solo veo parpadeos aveces baj pero con muchos destellos..
hice algunas modificaciones pa usar la totalidda de la interrupcion pero se puso peor... no se uqe estoy haciendo mal......
ahora le puse 225us para exitar el triac ..¡seran suficientes?.. o tal ves sea mucho............. no se que voy hacer ya me estoy volviendo loco... .... pero no me va a ganar seguire intentando.... :mrgreen:
-
Hola johnnybravo, primero que nada el circuito de detección de cruce por cero estás seguro que funciona de manera correcta?
Lo segundo, pasado el tiempo de demora para realizar el control de fase correspondiente, el triac no recibe un pulso, si no que se coloca la salida correspondiente a nivel alto hasta que llegue el proximo cruce por cero, solo ahí pasa a bajo para volver a comenzar a contar el tiempo correspondiente.
Un saludo.
Atte. CARLOS.
-
No sé si te he entendido bien, Chaly: ¿quieres decir que no basta con un pulso para activar el triac?
Yo lo hago así en mi minidimmer, envío un pulso en el momento que toca (por cierto, no espero nada, envío el 1 y a continuación el 0) y el triac permanece encendido hasta el siguiente cruce por 0.
-
Hola Manolo, tienes toda la razón, en teoría un pulso debería de alcanzar y bueno, tu ya lo haz comprobado, pero como cuesta lo mismo a nivel programación y aumenta la seguridad de trabajo es mejor una ves activado el pulso dejarlo en alto hasta que el semi-ciclo termine.
Un saludo.
Atte. CARLOS.
-
hola amigos veo que aun causa debate este tema..
pues si .. el cruce por cero al parecer funciona muy bien ..pero lo cambiare por otro que me parece esta mejor.. ademas le hice unas pruebitas con el osciloscopio..y em bota una señal mas clara de cruce por zero.... ademas tambien estoy teniendo en cuenta lo que me comentas de dejar el pin de activacion del triac en alto y hacer que al interupcion por zero cross lo regrese a cero y de esta manera tanto la puerta del pic como el triac se desactivaran al mismo tiempo...
ademas de todo eso estoy cambiando la frecuencia del pic a una mayor 20MHz.... para asegurarme que ese cambio es veloz
pero acabo de hacerle las modificaciones al programita y recien lo probare.. ademas hice otras modificaciones para hacer pruebas mas rapido.. le voy a poner interuptores en los puertos RB1 a RB7.. y de esta manera ire variando la luminocidad ( a manera de entradas digitales).. bueno con esto ya espero que me funcione
a otro dato mas como ya dije hice algunas pruebas del detector de cruce por zero en el osciloscopio
y el pude sacar el ancho de pulso del detector 0.9ms la frecuencia a la que trabaja la tencion alterna por aqui es 60Hz por lo que me quedo un dibujito mas o menos asi:
8.31ms
----------------------------------------
0.9ms
-----
7.44ms
----------------------------------
_______/-----\________________________/------\______
ahora que el ancho de pulso es 0.9ms.. yo en el programa le dare siempre un retardo de 1ms y eso se reflejara en el maximo valor de intencidad de la bombilla, y de ahi podre ir aumentado mas retardo del disparo del triac para poder disminuir la intencidad..... es la idea que trate de plasmar en el nuevo codigo,
el programita lo pongo mas abajo aber que sale:
ayudenme a probarlo :-/ porfa.. quiero que funcione primero esto para regresar luego a los del automatico
-
aqui van las modificaciones que les comente.. ojala funcionen .. las voy aprobar mas tarde :-/
LIST P=16f628
INCLUDE "P16f628.inc"
ERRORLEVEL -302
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
CBLOCK 0x20
VAR01 ;equ 0x20 variable a modificar para poder variar el brillo de las lamparas
VAR02 ;equ 0x21
VAR03 ;equ 0x22
VAR04 ;equ 0x23
VAR05 ;equ 0x24 Bandera que indica al codigo que se a producido el zero cross
VAR06 ;equ 0x25
ENDC
org 0x00 ;inicio de programa y direccion de interrupcion
goto Inicio
org 0x04
goto Inter
org 0x05
Inter
bcf PORTA,0 ;desactivamos el triac PORTA,1
movlw b'00010000'
movwf INTCON
bsf VAR05,0 ;Se levanta la bandera zero cross
retfie
Inicio
org 0x20
bsf STATUS,RP0 ;Banco 01
bsf OPTION_REG,INTEDG ;Configurar la INT. flanco de bajada de la INT
movlw b'11111111'
movwf TRISB ;El Puerto B como entrada
clrf TRISA ;El Puerto A como salida
bcf STATUS,RP0 ;Banco 00
clrf PORTA ;Limpiamos el Puerto
bsf INTCON,INTE ;Activamos la interrupcon INT externa
programa
nop
bcf INTCON,INTF ;bajamos la bandera señalizadora de INT_EXT
program
btfss INTCON,INTF ;para sincronizar con el pic al iniciar el programa
goto program
bcf INTCON,INTF ;bandera señalizadora de INT_EXT
progra1
call Ret_ZC
disparo
bsf INTCON,GIE ;permiso global de interrupciones
bsf PORTA,0 ;Disparo del triac, hasta que se produsca un cruce por zero
Zero_cross btfss VAR05,0 ;Espera la bandera de zero cross
goto Zero_cross
bcf VAR05,0 ;bajamos la bandera señalisadora de zero cross
goto progra1
;-----------------------------------------------
;la interrupcion lo tomo como flancos de subida INTE.
;El tiempo de la interrupcion del cruze por cero es de 8.31ms
;de disparo del triac varie desde el 0% hasta el 100%..idealmente pero nunca llegara al 100% ya que tenemos un retrazo de
;1ms porque el ancho de pulso del cruce por cero es de 0.9ms, y como ahora si estamos usando la interupcion..es necesario
;-----------------------------------------------
Ret_ZC ; retardo de aproximadamente 1ms, periodo del ancho de pulso del cruce por cero
movlw 0x0B
movwf VAR01
salt
call usg25
decfsz VAR01,F
goto salt
goto Ang_Disp
usg25
movlw 0x96 ;retardo de 91.4 us
movwf VAR02
sal4
decfsz VAR02,F
goto sal4
return
Ang_Disp
movf PORTB,W
movwf VAR06
rrf VAR06,F ;corrige la falta del pin RB0
bcf STATUS,Z ;ponemos en cero bit "Z"
movf VAR06,W ;comprueba si RB1 a RB7 = 0x00
xorlw 0x00
btfsc STATUS,Z
return ;si es = 0x00 retorna al disparo del triac, este es el mayor punto de iluminacion de la bonbilla
movf VAR06,W
movwf VAR03
salte
call usg72
decfsz VAR03,F
goto salte
return
usg72
movlw 0x78 ;retardo de 72.2 us
movwf VAR04
sal5
decfsz VAR04,F
goto sal5
return
END
-
porfin funciona ala perfeccion.. se apaga por completo.. y llega casi al 100% de su intencidad luminosa...bueno ahora quiero darle un efecto mas lineal al moneto de subir y bajar el brillo de la lampar.. alguien tiene una idea de como podria calcular los tiempos .. o alguna manera de hacer esto...
-
¿A qué le llamas un efecto más lineal?
-
bueno.. me refiero a que como la tension es una onda senoidal, pues el incremento o decremeto de la intensidad luminosa no es una funcion lineal si no que seria algo logaritmica... o bueno eso es lo que yo dedusco al estar trabajando con una onda senoidal.... o me estare equivocando :mrgreen:
cuando hice algunas pruebas ... metiendole convinaciones binarias ..pues al principio con los cuatro primeros bits la variacion era como a paso pequeños pero de ahi para adelante con los otro cuatro bits de mas peso pues el incremento fue mas rapido.... y por eso es que digo que no es lineal.... bueno... espero haberme dejado entender.. no soy bueno explicando pero hago el intento..jajajaj .. por el moento ya estoy contento, ya que por fin lo hice funcionar.... :-/
-
Sí, eso es cierto, aunque hay que ser muy fino para darse cuenta. Yo desde luego cuando subo el mío paso a paso no soy capaz de percibir que los micropasos sean más rápidos en una zona que en otra.
-
Hola a todos pregunta de donde puedo sacar el circuito de este proyecto asi lo pruebo gracias saludos :-/