Ir ao conteúdo
  • Cadastre-se

PIC Detector de Passagem por Zero COM PIC 12F1822


Posts recomendados

Olá, pelo que entendi o cruzamento zero é normalmente usado para acionamento suave de cargas, aumentando sua vida útil. Alguém já fez um circuito com pic que permite identificar o momento em que a tensão da rede elétrica AC cruza a linha de zero volt. Preciso ligar um relé e não sei como fazer o código, não usarei amplificadores, optoacopladores. O circuito já está pronto,  será usado apenas o pino 4 (RA3) do pic 12f1822 .

ESQUEMA.PNG

Link para o comentário
Compartilhar em outros sites

@Poseidon. ,

 

Tive um Deja-vú  com esse esquema.... alguém publicou ele fazem alguns meses, duvida era parecida também ....

 

Sobre o detector de cruzamento por zero, ele serve para sabe o instante em que você deve acionar o Triac, em teoria logo quando a tensão sobre a carga começa a subir, tendo passado por zero volts.

 

Mas como você consegue ver na simulação do Proteus, existe uma defasagem causada por C1 e RX e também R4/C2, que cria um erro significativo no instante da passagem por zero. Ou seja, quando você acionar a carga, a tensão sobre ela já estará acima de 20V ou até mais, que pode causar um "tranco"  na carga, principalmente se ela for indutiva.

 

Aliás, um bom exercício escolar é entender como aparece esse sinal de cruzamento por zero, em relação ao terra do circuito.....

 

Paulo

Link para o comentário
Compartilhar em outros sites

Em 08/08/2021 às 19:36, vtrx disse:

Tenho um projetoccs dimmer.rar que talvez te ajude.

Boa noite, agradeço sua ajuda, entendo  pouco  de programação, e para piorar tenho apenas um pino pra usar nessa passagem por zero, não posso alterar nada nela porque a placa já está pronta, é de algumas  fotocélulas que está com defeito (sem programa). Vou postar  parte do código em ccs c compiler e a  forma de onda na entrada e saída do pic 12f1822 sem modificar nada e modificando. Mas não fica legal, quero ligar na passagem do zero, no código que fiz ele liga antes do nível lógico alto passar  pelo zero.

 

#include <main.h>
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


//int16 minuto = 0;
            
#fuses NOMCLR INTRC_IO PLL_SW
#device ADC = 10

#use delay(clock=32000000)
//#use fast_io(a)
//int32 cnt = 0;

#INT_TIMER1
void  TIMER1_isr(void) 
{
clear_interrupt(int_timer1);
set_timer1(15536); // 0,05 segundo para  32MHZ
//set_timer1(3036); // 0,5 segundo para  4MHZ
              //cnt++;
//if(contador==1)

//output_toggle(pin_a5);
//min++;   //;;;;;;;;;;;;;;;;;;;;;;;;;;;
//contador = 0;


//contador++;
//set_timer1(15536); // 0,05 segundo para  32MHZ
//set_timer1(3036); // 0,5 segundo para  4MHZ
//clear_interrupt(int_timer1);

}


void main()
{
     setup_adc_ports(sAN1|sAN2|sAN3);
     setup_adc(ADC_CLOCK_INTERNAL);
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //524 ms overflow
     set_timer1(15536);    // 0,05 segundo para  32MHZ
     //set_timer1(3036);  // 0,5 segundo para  4MHZ
     setup_oscillator(OSC_8MHZ | OSC_PLL_ON);   // Set internal oscillator to 32MHz (8MHz and PLL)
    // set_tris_a  (0b00011110 );   //(0b00011110);      // HEX 1E  RA Tris  76543210  0X1E
    //set_tris_a  (0x1E);
     clear_interrupt(int_timer1);
     enable_interrupts(INT_TIMER1);
     enable_interrupts(GLOBAL);
     output_high(pin_a0);
     output_low(pin_a5);


 while(TRUE){
 
 if (!input(pin_a3) )
 {
 output_high(pin_a5);
//output_toggle(pin_a5);
}
 else 
  {
  output_low (pin_a5);
  }
   }
    }
  
  
  /* {
    
    if (cnt >= 1200 )       //passou 1 minuto                    
    {
      cnt = 0;
      minuto++;
    } 
 if (!input(pin_a3) ) && (minuto < 10)  
 {
 output_high(pin_a5);

 }
 
   if (!input(pin_a3) ) && (minuto >= 10)                     
{
 output_low(pin_a5);

 } 
  
  if(minuto >= 20)
{
 
minuto = 0;
 }  
  
  }
   }


   */

 

 

 

Ondas opto.PNG

Ondas.PNG

Link para o comentário
Compartilhar em outros sites

8 horas atrás, Poseidon. disse:

agradeço sua ajuda, entendo  pouco  de programação

O problema é que vai ter que usar interrupção,e se entende pouco de programação vai ser mais difícil para voce,além disso,se vai ser uma adaptação,teria que postar todo o esquema.

Link para o comentário
Compartilhar em outros sites

3 horas atrás, vtrx disse:

O problema é que vai ter que usar interrupção,e se entende pouco de programação vai ser mais difícil para voce,além disso,se vai ser uma adaptação,teria que postar todo o esquema.

Bom dia, esse é o esquema da fotocélula, uma correção,  o trimpot RV1 e  RV2 é de 100k, capacitor C2  é de 5nF e diodo zener Z1 24 volts, Z3 56 volts Z2 5 volts.

 

 

 

Esquema fotocélula.PNG

Link para o comentário
Compartilhar em outros sites

Em 09/08/2021 às 19:23, aphawk disse:

@Poseidon. ,

 

Tive um Deja-vú  com esse esquema.... alguém publicou ele fazem alguns meses, duvida era parecida também ....

 

Sobre o detector de cruzamento por zero, ele serve para sabe o instante em que você deve acionar o Triac, em teoria logo quando a tensão sobre a carga começa a subir, tendo passado por zero volts.

 

Mas como você consegue ver na simulação do Proteus, existe uma defasagem causada por C1 e RX e também R4/C2, que cria um erro significativo no instante da passagem por zero. Ou seja, quando você acionar a carga, a tensão sobre ela já estará acima de 20V ou até mais, que pode causar um "tranco"  na carga, principalmente se ela for indutiva.

 

Aliás, um bom exercício escolar é entender como aparece esse sinal de cruzamento por zero, em relação ao terra do circuito.....

 

Paulo

Boa noite, não posso modificar o circuito mas caso modificasse talvez daria certo se fizesse igual esse esquema que usa 2 optoacopladores, como mencionei não posso modificar o circuito e tenho apenas um pino de entrada  para  detectar a passagem por zero.

Esquema 2 opto.PNG

Onda 2 opto.PNG

Link para o comentário
Compartilhar em outros sites

@Poseidon. ,

 

Esse esquema já foi objeto de uma discussão aqui no CDH fazem vários anos .... nada como uma velha lembrança !

 

Supondo que R1 seja de 5k :

 

Corrente de coletor dos optos ignorando Vsat dos optos = 5/5k =1 mA.

Pagina 7 figura 12 do datasheet : para IC= 1 mA, corrente de entrada If no led = 1 mA (aproximado)

portanto ....

se R3 = 100k , para ter corrente sobre ele de 1mA temos que a tensão sobre ele, ignorando Vled, é de 100.000 x 0,001 = 100 Volts.

 

Portanto, o detetor de passagem por zero sem levar em conta Q1 tem um erro de 100V ... ou seja, seu Triac vai acionar a carga quando a tensão for de 100V sobre ela !!!!. 

Mas sua sorte é que existe Q1 no circuito !

 

Na prática, o Opto vai conduzir antes , porque com cerca de 0,1 mA no Led  já existe uma certa corrente de coletor no transistor do opto, e Q1 amplifica essa corrente e entra em saturação, mas náo dá para afirmar o instante exato em que  isso ocorre devido à tolerância de todos os componentes.

 

Se você tiver sorte e seu Q1 tiver ganho alto, tipo 300 , o erro será bem menor.

Mas se tiver em Q1 um transistor com bem menos ganho, tipo 50, o erro pode ser significativo.

 

Paulo

 

datasheet pc817

 

Link para o comentário
Compartilhar em outros sites

Em 10/08/2021 às 21:58, aphawk disse:

@Poseidon. ,

 

Esse esquema já foi objeto de uma discussão aqui no CDH fazem vários anos .... nada como uma velha lembrança !

 

Supondo que R1 seja de 5k :

 

Corrente de coletor dos optos ignorando Vsat dos optos = 5/5k =1 mA.

Pagina 7 figura 12 do datasheet : para IC= 1 mA, corrente de entrada If no led = 1 mA (aproximado)

portanto ....

se R3 = 100k , para ter corrente sobre ele de 1mA temos que a tensão sobre ele, ignorando Vled, é de 100.000 x 0,001 = 100 Volts.

 

Portanto, o detetor de passagem por zero sem levar em conta Q1 tem um erro de 100V ... ou seja, seu Triac vai acionar a carga quando a tensão for de 100V sobre ela !!!!. 

Mas sua sorte é que existe Q1 no circuito !

 

Na prática, o Opto vai conduzir antes , porque com cerca de 0,1 mA no Led  já existe uma certa corrente de coletor no transistor do opto, e Q1 amplifica essa corrente e entra em saturação, mas náo dá para afirmar o instante exato em que  isso ocorre devido à tolerância de todos os componentes.

 

Se você tiver sorte e seu Q1 tiver ganho alto, tipo 300 , o erro será bem menor.

Mas se tiver em Q1 um transistor com bem menos ganho, tipo 50, o erro pode ser significativo.

 

Paulo

 

datasheet pc817

 

Boa noite, a dúvida é como foi feita a detecção da passagem por zero nessse circuito, esse é o esquema do mesmo, foram usados poucos componentes para  a tal função, uma correção,  o trimpot RV1 e  RV2 é de 100k, capacitor C2  é de 5nF e diodo zener Z1 24 volts, Z3 56 volts Z2 5 volts.

Esquema fotocélula.PNG

Link para o comentário
Compartilhar em outros sites

@Poseidon. ,

 

A detecção é feita pela variação da tensão no pino 4, quando ela passa de nível 0 para nível 1 indica que a tensão senoidal na entrada do circuito passou por um nível de 0 volts, mas essa informação chega com um erro de possíveis milissegundos, então o programa deve considerar esse erro para poder calcular qual foi o instante real da passagem por zero.

 

Coloque o osciloscopio virtual uma ponta numa das entradas de alimentação,  e outra ponta na junção de R6 com R5 medindo nível DC, vai ver algo interessante ....

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O que te impede de usar um moc zero crossing? clique

 

Seu esquema tá perturbador.. não consigo conectar o gnd à rede...

Em 12/08/2021 às 08:28, aphawk disse:

é feita pela variação da tensão no pino 4, quando ela passa de nível 0 para nível 1 indica que a tensão senoidal na entrada do circuito passou por um nível de 0 volts, mas essa informação chega com um erro de possíveis milissegundos

Este suposto atraso que Paulão menciona é causado por C2. Caso ocorra e seja significativo, você pode diminuir C2 ou removê-lo.

E claro, a própria mecânica do relé vai causar mais atraso no acionamento. Não sei se consegue ver isso no mundo virtual da sua simulação.

Link para o comentário
Compartilhar em outros sites

22 minutos atrás, .if disse:

E claro, a própria mecânica do relé vai causar mais atraso no acionamento. Não sei se consegue ver isso no mundo virtual da sua simulação.

 

Eu nem tinha reparado que o acionamento é via relé ! Que coisa mais mal-feita ....

 

Isso inutiliza todo o processo de zero-crossing, já que existe um tempo que varia com a idade do relé para o acionamento e desacionamento ....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

#include <main.h>
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


//int16 minuto = 0;
            
#fuses NOMCLR INTRC_IO PLL_SW
#device ADC = 10

#use delay(clock=32000000)
//#use fast_io(a)
//int32 cnt = 0;

#INT_TIMER1
void  TIMER1_isr(void) 
{
clear_interrupt(int_timer1);
set_timer1(15536); // 0,05 segundo para  32MHZ
//set_timer1(3036); // 0,5 segundo para  4MHZ
              //cnt++;
//if(contador==1)

//output_toggle(pin_a5);
//min++;   //;;;;;;;;;;;;;;;;;;;;;;;;;;;
//contador = 0;


//contador++;
//set_timer1(15536); // 0,05 segundo para  32MHZ
//set_timer1(3036); // 0,5 segundo para  4MHZ
//clear_interrupt(int_timer1);

}


void main()
{
     port_A_pullups(0x08);
     setup_adc_ports(sAN1|sAN2|sAN3);
     setup_adc(ADC_CLOCK_INTERNAL);
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //524 ms overflow
     set_timer1(15536);    // 0,05 segundo para  32MHZ
     //set_timer1(3036);  // 0,5 segundo para  4MHZ
     setup_oscillator(OSC_8MHZ | OSC_PLL_ON);   // Set internal oscillator to 32MHz (8MHz and PLL)
    // set_tris_a  (0b00011110 );   //(0b00011110);      // HEX 1E  RA Tris  76543210  0X1E
    //set_tris_a  (0x1E);
     clear_interrupt(int_timer1);
     enable_interrupts(INT_TIMER1);
     enable_interrupts(GLOBAL);
     output_high(pin_a0);
     output_low(pin_a5);


 while(TRUE){
 
 if (!input(pin_a3) )
 {
  
   output_high(pin_a5);
  
//output_toggle(pin_a5);
}
 else 
  {
  output_low (pin_a5);
  }
   }
    }
  
  
  /* {
    
    if (cnt >= 1200 )       //passou 1 minuto                    
    {
      cnt = 0;
      minuto++;
    } 
 if (!input(pin_a3) ) && (minuto < 10)  
 {
 output_high(pin_a5);

 }
 
   if (!input(pin_a3) ) && (minuto >= 10)                     
{
 output_low(pin_a5);

 } 
  
  if(minuto >= 20)
{
 
minuto = 0;
 }  
  
  }
   }


   */

 

11 horas atrás, .if disse:

O que te impede de usar um moc zero crossing? clique

 

Seu esquema tá perturbador.. não consigo conectar o gnd à rede...

Este suposto atraso que Paulão menciona é causado por C2. Caso ocorra e seja significativo, você pode diminuir C2 ou removê-lo.

E claro, a própria mecânica do relé vai causar mais atraso no acionamento. Não sei se consegue ver isso no mundo virtual da sua simulação.

Boa noite, não tinha pensado nisso "E claro, a própria mecânica do relé vai causar mais atraso no acionamento"

O que te impede de usar um moc zero crossing?

Porque a placa estão prontas,  são algumas  fotocélulas com defeito que caíram em minhas mãos. O esquema postado até o momento foi corrigido por colega porque o meu estava uma desordem, vou postar o meu esquema e as formas de ondas e o código usado nos testes,  habilitando port_A_pullups(0x08) ; teve uma mudança na forma de onda, lembrando que essa fotocélula liga próximo ao zero da rede.

 

Fotocélula..PNG

Esquema..PNG

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sendo uma fotocelula supõe-se que vai ligar no máximo uma lâmpada, portanto carga bem baixa. Assim sendo, penso que o lance do zero crossing passa a ser irrelevante - não vale o gasto de 'energia' com isso.

Se fosse algo como um dimmer, aí sim compensa debruçar sobre o assunto. Há alguns anos, pra descontrair, criei um virtual com pic10fxxx. Anos depois e há alguns anos atrás publiquei neste ou outro forum... preguiça de procurar... caso contrário a qualquer momento atualizo o post...

edit... achei rapidão... de novo...

como os anos passam rápido...

edit - II ... consegui editar aquele post cujo fonte estava 'inanalizável'... atualização do forum pode ter zoado ele...

 

passado sempre presente

Link para o comentário
Compartilhar em outros sites

21 horas atrás, aphawk disse:

Pessoal, 

 

Agora que entendi ... o pino RA4 fornece A BASE DE TEMPO, não o sinal de zero crossing .....

 

Paulo

 

É isso mesmo o pino RA4 fornece A BASE DE TEMPO (1h, 2h, 3h, 4h, 6h, 8h, 10h, 12h),os pinos RA1 e RA2 trabalham juntos, RA0 e RA5 do transistores,  só sobrou o pino RA3 para fazer a detecção sinal de zero crossing, como você mencionou a carga está conectada aos contatos do relé, nesse caso, a comutação cruzando o zero da rede não faz sentido, porque há muito tempo de atraso entre a ativação da bobina do relé e o fechamento do contato do relé. O tempo não é muito preciso e varia com o tempo, remanência, envelhecimento, etc, será que o responsável não pensou nisso ou fez o  programa já pensando nesse atraso?

Link para o comentário
Compartilhar em outros sites

@Poseidon. ,

 

Para uso de cargas comuns, o relé atende perfeitamente.

 

A função do pino RA4 é fornecer uma amostra da frequência da rede, a cada passagem de 0 para 1 começa um ciclo de 60 hertz, portanto em cada segundo ocorrem 60 pulsos; em 1 hora a contagem será de 60 x 3600 = 216.000 pulsos.

 

Assim, basta ir contando esses pulsos, e comparando com o ajuste de RV2, o qual dependendo da tensão nele indica o tempo desejado, por exemplo se rv2 estiver entre 0 e 12,5% do valor dele , a contagem desejada será de 216.000 . Quando for atingida, o relé aciona.

 

RV1 é o ajuste de luminosidade mínima; quando ela for atingida, inicia-se a contagem dos pulsos de RA4.

 

Minha opinião é que o tempo é controlado de maneira bem precisa, e o autor do projeto não se preocupou com o acionamento da carga no instante da passagem por zero, ele simplesmente fez o básico...

 

Só não entendi o porque de usar RA0 e RA5 para acionar o relé .... para mim bastava um só !

 

Paulo

Link para o comentário
Compartilhar em outros sites

Em 15/08/2021 às 22:12, aphawk disse:

@Poseidon. ,

 

Para uso de cargas comuns, o relé atende perfeitamente.

 

A função do pino RA4 é fornecer uma amostra da frequência da rede, a cada passagem de 0 para 1 começa um ciclo de 60 hertz, portanto em cada segundo ocorrem 60 pulsos; em 1 hora a contagem será de 60 x 3600 = 216.000 pulsos.

 

Assim, basta ir contando esses pulsos, e comparando com o ajuste de RV2, o qual dependendo da tensão nele indica o tempo desejado, por exemplo se rv2 estiver entre 0 e 12,5% do valor dele , a contagem desejada será de 216.000 . Quando for atingida, o relé aciona.

 

RV1 é o ajuste de luminosidade mínima; quando ela for atingida, inicia-se a contagem dos pulsos de RA4.

 

Minha opinião é que o tempo é controlado de maneira bem precisa, e o autor do projeto não se preocupou com o acionamento da carga no instante da passagem por zero, ele simplesmente fez o básico...

 

Só não entendi o porque de usar RA0 e RA5 para acionar o relé .... para mim bastava um só !

 

Paulo

Para acionar o relé usa o RA5, RA0 quando em nível lógico alto polariza a base de Q1, fazendo com o diodo Z3 fique em curto, tendo portando uma tensão de +ou-  24 volts ou 56 volts depedendo do nível lógico em Q1, não sei se é para compensar a carga (relé), ou seja,  usa 56 volts com relé acionado e 24 com relé desacionado, por ser uma  fonte sem trafo qualquer carga dá uma queda grande de corrente. Vou mandar os esquemas simulando Q1 no corte e na saturação usando Push Button (Chave Táctil) colocando em curto D7.

FST..PNG

FST.PNG

Link para o comentário
Compartilhar em outros sites

Em 13/08/2021 às 10:35, aphawk disse:

 

Eu nem tinha reparado que o acionamento é via relé ! Que coisa mais mal-feita ....

 

Isso inutiliza todo o processo de zero-crossing, já que existe um tempo que varia com a idade do relé para o acionamento e desacionamento ....

 

Paulo

Como mencionado a carga conectada aos contatos do relé na comutação cruzando zero não faz sentido, porque há muito tempo de atraso entre a ativação da bobina do relé e o fechamento do contato do relé.

O tempo não é muito preciso e varia com o tempo, remanência, envelhecimento, porém vejo circuito usando relé e fico sem entender, como exemplo de um circuito com C.I.CD4013 que vou postar com os dizeres “Exclusivo sistema de comutação próximo ao zero da rede (senóide) aumentando a vida útil da carga e do relé,” quem trabalha com elétrica já teve oportunidade de ver várias fotocélulas desse tipo.

 

Fotocélula SP.PNG

Link para o comentário
Compartilhar em outros sites

22 horas atrás, Poseidon. disse:

Como mencionado a carga conectada aos contatos do relé na comutação cruzando zero não faz sentido, porque há muito tempo de atraso entre a ativação da bobina do relé e o fechamento do contato do relé.

O tempo não é muito preciso e varia com o tempo, remanência, envelhecimento, porém vejo circuito usando relé e fico sem entender, como exemplo de um circuito com C.I.CD4013 que vou postar com os dizeres “Exclusivo sistema de comutação próximo ao zero da rede (senóide) aumentando a vida útil da carga e do relé,” quem trabalha com elétrica já teve oportunidade de ver várias fotocélulas desse tipo.

 

Tinha um curto em R1 no esquema anterior porque  estava sendo testado em 24 volts, vou postar o novo esquema corrigido e não tem resistor na base de Q1 no esquema postado porque é um transistor de código A8C  com resistor de 47k integrado em sua base e outro na base e emissor de  47k.

Fotocélula SP..PNG

Link para o comentário
Compartilhar em outros sites

14 horas atrás, aphawk disse:

@Poseidon. ,

 

Faz um favor se puder :

Poste esse arquivo feito no Proteus para dar uma simulada aqui.

 

Paulo 

Não sei como postar arquivo do proteus para simulação, postei um link, não consegui  simular bem o circuito  no proteus.

https://storage.ning.com/topology/rest/1.0/file/get/9458559075?profile=original

18 horas atrás, Poseidon. disse:

Tinha um curto em R1 no esquema anterior porque  estava sendo testado em 24 volts, vou postar o novo esquema corrigido e não tem resistor na base de Q1 no esquema postado porque é um transistor de código A8C  com resistor de 47k integrado em sua base e outro na base e emissor de  47k.

Fotocélula SP..PNG

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!