Autor Tema: PIC DIMMER  (Leído 5371 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
PIC DIMMER
« en: 20 de Agosto de 2011, 00:22:11 »
Buenas a todos hace días empecé a realizar este proyecto de control de potencia que entrego a una lámpara incandescente con un TRIA y un MOC3021 y la verdad no sé qué pasa por que no he tenido buenos resultados bueno lo primero que les comento es que estoy utilizando el PIC16F877A del cual utilizo la interrupción externa para detectar los cruce por cero y el timer1 como contador síncrono con un desbordamiento a 13.1ms y la técnica es:
detecto cuando la señal pasa por cero primero de un flanco de alto a bajo y coloco en estado bajo la salida del PIC que dispara el MOC3021 en ese momento cargo el timer1 con un valor apropiado para que se desborde antes de los 13.1ms y como en el país donde vivo la red comercial tiene 60Hz el desbordamiento debe ser antes de los 8.33ms y además cambio el flanco de disparo para que ahora sea de bajo a alto, cuando ocurre la interrupción por desbordamiento del timer1 conmuto la salida, para luego trabar en el semi ciclo negativo repitiendo de nuevo la técnica lo curioso en que funciona a la perfección en la simulación en Proteus pero cuando voy a la realidad nanai nanai la lámpara incandescente o prende a full potencia o solo queda un nivel medio de iluminación y no consigo estados intermedios de iluminación no sé si el problema es el cruce por cero, un problema de excitación del MOC3021 o un problema de tierras en realidad no se necesitó ayuda adjunto el programa y la simulación, de ante manos muchas gracias. Ha casi se me olvida para detectar el cruce por cero e introducir la señal a la interrupción externa del PIC utilizo un transformador reductor de 110v a 9v par de diodos como circuito recortador sujetador de tensión y un amplificador operacional el LM324


codigo
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
int16 cont_flag=0,timer=30000;

#int_EXT
void  EXT_isr(void)
{
cont_flag++;

if(cont_flag==1){
output_bit(PIN_B7,0);
EXT_INT_EDGE(H_TO_L);
set_timer1(timer);
}

if(cont_flag==2){
output_bit(PIN_B7,0);
EXT_INT_EDGE(L_TO_H);
cont_flag=0;
set_timer1(timer);
}
}

#int_TIMER1
void  TIMER1_isr(void)
{
output_bit(PIN_B7,1);
}





void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   EXT_INT_EDGE(L_TO_H);
for( ;; ){

if(input(PIN_C6)==0){
delay_us(1);
timer++;

}

if(input(PIN_C7)==0){
delay_us(1);
timer--;

}

}

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC DIMMER
« Respuesta #1 en: 20 de Agosto de 2011, 05:58:03 »
Creo que tienes algunas cosas poco claras.
Tienes que detectar cruce por 0 esperar un tiempo, este tiempo depende de la potencia que quieras darle, y cebar el TRIAC. El TRIAC lo cebas donde tu quieras, pero se desceba el solo cuando pasa por 0, siempre y cuando no tenga señal en el gate. Tal y como tienes el esquema tienes que darle un 1 al opto no un 0.
No se de donde te salen los 13.1ms. para 60hz son 8.34 de semiciclo, si desde que detectas el cruce por 0 esperas 4.17ms y cebas el TRIAC durante unos pocos us te conducira los otros 4.17, y tendras el 50%.
Te dejo aqui un enlace a un dimmer (hay mas por el foro) este seguramente fue el primero que se hizo:


http://www.todopic.com.ar/foros/index.php?topic=2246.0

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: PIC DIMMER
« Respuesta #2 en: 20 de Agosto de 2011, 10:48:21 »
No amigo los 13.1ms es el tiempo que dura en desbordarse el timer1 sin cargar ningún valor. Tengo claro que debo hacerlo antes de que se complete cada semiciclo lo he probado también enviándole un uno en vez de un cero pero lo hacía cuando ocurría la interrupción externa y cuando se desbordaba el timer1 lo colocaba a cero, creo que hay esta un primer error modifique el código en la parte de las interrupciones para que cuando ocurra la interrupción cargué el valor del timer1 y cuando acurra el desborde de timer1 coloque la salida que controla al MOC3021 a uno pasado unos us se apague tal como me lo sugeriste, nuevamente funciona en la simulación voy a ver qué ocurre en la vida real. Muchas gracias por tu respuesta.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#int_EXT
void  EXT_isr(void)
{
cont_flag++;

if(cont_flag==1){
output_bit(PIN_B7,0);
EXT_INT_EDGE(H_TO_L);
set_timer1(timer);
}

if(cont_flag==2){
output_bit(PIN_B7,0);
EXT_INT_EDGE(L_TO_H);
cont_flag=0;
set_timer1(timer);
}
}

#int_TIMER1
void  TIMER1_isr(void)
{
output_bit(PIN_B7,1);
delay_us(50);
output_bit(PIN_B7,0);

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC DIMMER
« Respuesta #3 en: 20 de Agosto de 2011, 13:27:33 »
El TIMER1 sin cargarle ningun valor con preescaler de 1/1  a 4Mz da 65.536ms y con preescaler de 8 da 524.3 ms aprox.

En el esquema deberias ponerle una R de 1K entre gate y anodo que va a la carga, como lo ponen aqui.


http://www.todopic.com.ar/foros/index.php?topic=13389.0

No necesitas ponerle la red snubber, y el MOC3021 el que tu le pones es el que vale, el 3041 que lleva en ese esquema NO te vale para regular potencia.

Si quieres darle pongamos 5 niveles de luz, divides los 8.34ms en 5 partes te salen1.67ms. haces que el timer se desborde cada 1.67ms, para el 20% cuentas 4 desbordes de TIMER y activas TRIAC, para el 40% 3 desbordes y asi sucesivamente. No estoy teniendo en cuenta en estos calculos unos pequeños tiempos que el TRIAC no conduce al principio y final de cada semiciclo, que para 230V 50Hz son 0.4ms al principio y otros tantos al final aprox. para 110V 60Hz la verdad que no lo se.