Ir ao conteúdo

Posts recomendados

Postado

Boa tarde meus amigos do FORUM !!!!!!!!!!

Estou estudando o PIC da família 18F, mais precisamente o PIC18F45k22, estou elaborando um protejo de um DIMMER, porém a dias estou tropeçando em algum detalhe que não consigo enxergar.

Gostaria de obter ajuda no tocante a orientação dos colegas mais experientes nesse assunto.

Segue os dados do protejo e desde á agradeço a todos.

*****************************************************************************************************************************************************

Estou utilizando o MIKOC Pro For PIC 

Microcontrolado 18f45K22

Oscilador externo de 8MHz 

 

**************************************************************************************************************************************************************************************************** 

#define controle PORTD.RD0

unsigned short tempo_H = 0x00; // variável para o tempo mais significativo do TIMER1
unsigned short tempo_L = 0x00; // variável para o tempo menos significativo do TIMER1

void interrupcao_high() iv 0x0008 ics ICS_AUTO // Rotina especial de interrupção gerado pelo MIKROC

{
 if(INTCON.INT1IF == 1)             // Houve interrupção exertna no pino RC0 ?
   {                        // Houve !
    INTCON.INT1IF= 0x00;      // Limpa a flag de sinalização
    PIR1.TMR1ON = 0x01;     // Liga o TIMER 1
   }
   
 if(PIR1.TMR1IF == 1)       // Houve estouro no ovf ?
   {                        // sim !
    PIR1.TMR1IF = 0;        // Limpa a flag
    TMR1H = tempo_H;        // Carrega o valor de High
    TMR1L = tempo_L;        // Carrega o tempo de Low
    controle = 0x01;           // Aciona controle no pino RD0
    delay_ms(200);          // Um tempinho
    controle = 0x00;           // Desliga o controle
    PIR1.TMR1ON = 0x00;     // Desliga o TIMER 1
   }// fecha int1if
}//fecha interrupção
void main() 
{
  ANSELC = 0;                // Todos os pinos da PORTA C configurdo como digital
  ANSELD = 0;                // Todos os pinos da PORTA D configurdo como digital
  TRISC.RC0 = 0x01;          // Apenas o pino RC0 configurado como entrada, pois parao pulso externo é necessário configurar esse pino
  PORTC.RC0 = 0x01;          // Nem era preciso !
  TRISD = 0;                 // Configurado para todos os pinos da PORTA D como saída
  PORTD = 0;                 // Nem era preciso !
  
  T1CON = 0b00000011;
  // config T1CON:
  /* RD16 = 0 -> leitura e escrita em 8 bits;
  T1RUN = 0 -> Oscilador do TIMER 1 não é sinal de clock;
  T1CKPS1 E T1CKPS0 = 0 -> prescaler 1:1;
  T1OSCEN = 0 -> Oscilador externo desabilitado;
  T1SYNC = 1 -> Sincronismo desligado;
  TMR1CS = 1 -> Incremento pelo sinal externo;
  TMR1ON = 1 -> Habilita o TIMER1.*/
  
  PIR1.TMR1IE = 1;       // Habilita a interrupção do TIMER1
  INTCON.GIEH = 1;       // Habilita interrupções global
  INTCON.PEIE = 1;       // Habilita interrupções por periféricos
  INTCON2.INTEDG1 = 1;   // Habilita borda de subida
  INTCON3.INT1IE = 1;    // Habilta a interrupção externa INT1
  /*inicializa o TIMER1 para contar até 8333 us (16bits - 8333 = 57203d; DF73h)*/
  TMR1H = 0xDF;          // Carrrega o valor com bit mais significativo em HIGH
  TMR1L = 0x73;          // Carrrega o valor com bit menos significativo em LOW
  
  controle = 0x00;       // Controle inicializa em zero
  
  while(1)
  {}                     //implementação futura
}//fecha void

 

A expectativa é gerar um sinal como mostra a figura abaixo

 

osc_controle_ent_sai.jpg.4b05c4c6cb0663ab4b957eb2039e928a.jpg

 

Mas a realidade é que estou gerando apenas o sinal de entrada no PINO RC0 e não está gerando o sinal de saída no PINO RD0, no canal dois do osciloscópio,como mostra a figura abaixo :

 

osc_controle_ent_sai_sem_exito.jpg.0dd1b0ad7534ccc62abc872e3f4053bc.jpg

 

A figura a baixo está o esquema do início do protejo gerado pelo PROTEUS 8 PROFISSINAL :

 

esquema_1.jpg.18e3b02f3a9a1e5f82e580f5f91f8b14.jpg

 

Queiram ignorar o LCD e o BUTTON !

  • Membro VIP
Postado

O que seu fonte me diz é que um pulso no pino causa um pulso de 200mS em outro e isso não está ocorrendo certo? No seu esquema não está conectado o botão ao pino RC0 do mc e nem seu osc mostra o pulso. Verifique também se o pino está configurado como entrada digital pois há caso em que algum nasce como analógico.

 

Permita-me uma tradicional incorporada da dura realidade daqui de fora 🤪...: o que sempre recomendo pros meus "alunos do mundo real" é que antes de qualquer projeto com mc consulte o item mais importante: o preço bem como o 2º mais: a disponibilidade. Minha (minha) referência é a digikey p.ex. https://www.digikey.com/short/31c2p538

Mas se for pra brincadeiras (sem ofensa), passa tempo, aprendizados e tal ou pra aproveitar alguma peça que você tem a disposição, sem crise 😁

 

Postado

@.if Boa tarde !

O pino RC0 está recebendo o "sinal " no caso uma frequência de 120Hz, é uma simulação de um pulso quadrado.

O pino RC0 se der uma olhada no algorítmico irá perceber que TRISC.RC0 = 0x01; // Apenas o pino RC0 configurado como entrada, o ANSELC responsável por habilitar os pinos em digitais.

 

Acredito que tem algo que não consegui configurar,mas não estou conseguindo ver o erro !

  • Membro VIP
Postado

Ahhh .. vi agora que o RC0 é o de cima ..achei que era o de baixo... 🥴 mals. De fato este pino tem mais de meia dúzia de funções. Verifique se está como digital I/O. Verifique se não precisa de pullup.

Tente algo como

PORTD.RD1=PORTC.RC0; //pra ver se tá lendo o pino. 

Consulte também o d.s. https://ww1.microchip.com/downloads/en/DeviceDoc/40001412G.pdf pra ver se tem mais registros de controle de interrupção

53 minutos atrás, CLEUBER disse:

algo que não consegui configurar

Depois de resolver, não te esqueças de retornar o resultado/solução, ok? 🙂

Postado

@.if Obrigado mais uma vez !

Pois é, estou revirando o data dele, configurei como manda o escript. porém nada de sair um sinal no osciloscópio.

Já fiz um teste mandando o pulso externo através de um botão, no modo contador, ele conta os pulsos certinho, mas quando mando o pulso de 5v com frequência de 120 Hrz ele não funciona !

  • Membro VIP
Postado

Como você foi simpático, vejamos algumas análises a+ que fiz no seu fonte...

 

22 horas atrás, CLEUBER disse:
unsigned short tempo_H = 0x00; // variável para o tempo mais significativo do TIMER1
unsigned short tempo_L = 0x00; // variável para o tempo menos significativo do TIMER1

 

22 horas atrás, CLEUBER disse:
TMR1H = tempo_H;        // Carrega o valor de High
    TMR1L = tempo_L;        // Carrega o tempo de Low

você realimenta o timer com valor zero... ou seja fica o tempo máximo da contagem esperando o ovl.

 

22 horas atrás, CLEUBER disse:
TMR1H = 0xDF;          // Carrrega o valor com bit mais significativo em HIGH
  TMR1L = 0x73;          // Carrrega o valor com bit menos significativo em LOW

Já no main você carrega o valor supostamente correto mas ele é feito 1 vez só...

 

Não vi onde está habilitada a interrupt do timer1. Seria em T1CON?

22 horas atrás, CLEUBER disse:
T1CON = 0b00000011;

 

E tem + ... penso que você não precisa de interrupção de timer pra dimerizar. Basta a do 120Hz. A cada pulso você espera 1 tempo antes de disparar o tiristor. Quanto mais espera (aí sim pode usar o timer), menos energia ele transfere.

22 horas atrás, CLEUBER disse:

um protejo de um DIMMER

 

Postado

@.if Boa discussão referente ao caso, obrigado !

 

A interrupção do TIMER 1 está no registrador INTCON3, o bit INT1IE é responsável pela habilitação de interrupção externa do TMR1 (=1)

O pino é o PORTC.RC0 /  T13CKI  

 

Agora para esse protejo quero poder controlar o tempo de disparo no TRIAC.

Pelo que está no algoritmo, ainda não consigo controlar, pois ainda não foi implementado, mas já era para poder aparecer uma saída no canal dois.  

 

  • Membro VIP
Postado
38 minutos atrás, CLEUBER disse:

A interrupção do TIMER 1 está no registrador INTCON3, o bit INT1IE é responsável pela habilitação de interrupção externa do TMR1 (=1)

Olá amigo. Dei uma olhadela na página 111 e não consegui ver rapidão a relação destes bits com o timer1. Agora dá uma olhadela na página 162 onde mostra os bits que devem ser setados pra uma interrupção.

 

44 minutos atrás, CLEUBER disse:

Agora para esse protejo quero poder controlar o tempo de disparo no TRIAC

Entendi. Diga também se você entendeu isso...

1 hora atrás, .if disse:

A cada pulso você espera 1 tempo antes de disparar o tiristor. Quanto mais espera (aí sim pode usar o timer), menos energia ele transfere.

Olha este minimalismo em c que digito online
 

unsigned int tmp,tmp1;

for(;;)
{
if (!RC1) tmp1++; //botões de controle
if (!RC2) tmp1--;
tmp=tmp1;
while(!RC0);//espera pulso
while(tmp--);//espera 1 pouco
RD0=1;RD0=0; //pulso no gate
}

Zero zero interrupt & zero timer. Dá até pra fazer com pic10f2xx... Pode não lhe ser totalmente inútil

 

Postado
18 minutos atrás, .if disse:

Olá amigo. Dei uma olhadela na página 111 e não consegui ver rapidão a relação destes bits com o timer1. Agora dá uma olhadela na página 162 onde mostra os bits que devem ser setados pra uma interrupção.

Acredito que :

Como tenho um interrupção externa devo habilitar o pino da interrupção externa.

Porém estou habilitando o PINO RC0 para que ocorra a interrupção na borda de subida, então possa ser isso que esteja fazendo errado !

Habilitando os dois passa estar havendo um conflito.

 

21 minutos atrás, .if disse:

Entendi. Diga também se você entendeu isso...

Na verdade não acompanhei seu raciocínio;

 

22 minutos atrás, .if disse:
unsigned int tmp,tmp1;

for(;;)
{
if (!RC1) tmp1++; //botões de controle
if (!RC2) tmp1--;
tmp=tmp1;
while(!RC0);//espera pulso
while(tmp--);//espera 1 pouco
RD0=1;RD0=0; //pulso no gate
}

Claro, tenho um algoritmo parecido com esse, só estou esperando para acertar a saída para controlar o triac e depois vou implementar o algoritmo de controle do ângulo , obrigado por essa dica.

Vou fazendo por aqui e vou atualizando o projeto com você.

25 minutos atrás, .if disse:

Zero zero interrupt & zero timer. Dá até pra fazer com pic10f2xx... Pode não lhe ser totalmente inútil

Na verdade o que estou querendo é assim: 

Temos a nossa senoide vindo da rede elétrica, temos que tratar esse sinal de modo que consiga mandar um sinal a cada passagem por zero para o MC, pois bem, feito isso a cada passagem por zero, o MC entende que existe um interrupção externa, por essa vez acontece a habilitação da ocorrência e aciona o TIMER 1, sendo assim, existe a contagem em 16 bits o qual é dividido em TMR1H e TMR1L, quando isso ocorre ele dispara a saída do MC podendo controlar o ângulo de disparo e com isso consigo regular o quanto de energia quero para acionar o objeto.

Mas essa é a primeira parte do projeto !

Tem muito para rachar a cuca.

Postado

@CLEUBER ,

 

Em 30/08/2022 às 17:37, CLEUBER disse:

Temos a nossa senoide vindo da rede elétrica, temos que tratar esse sinal de modo que consiga mandar um sinal a cada passagem por zero para o MC, pois bem, feito isso a cada passagem por zero, o MC entende que existe um interrupção externa, por essa vez acontece a habilitação da ocorrência e aciona o TIMER 1, sendo assim, existe a contagem em 16 bits o qual é dividido em TMR1H e TMR1L, quando isso ocorre ele dispara a saída do MC podendo controlar o ângulo de disparo e com isso consigo regular o quanto de energia quero para acionar o objeto.

Mas essa é a primeira parte do projeto !

 

Primeiro, como é o circuito que gera o pulso de passagem por zero ?

Precisa saber se usará subida / descida ou mudança de nível .

Cá entre nós, usar um Timer de 16 bits para controle de disparo de um Triac ???? 

Já pensou no erro de ângulo de disparo que o seu circuito irá causar para gerar  o pulso ?

 

Paulo

 

Postado

@aphawk Paulo obrigado por contribuir, fico feliz de fazer parte desse universo de pensadores !

 

Então pensei no pulso de entrada no INT0 do PIC quando acusa a interrupção externa ele aciona o TIMER no ovf, quanto a 16 bists, pelo que ando estudando e pesquisando 16 bits pelo fato de haver a divisão do cálculo do tempo de estouro do timer.

Na verdade a rede eléctrica AC aqui no BRASIL é de 60Hrz quando é feita o tratamento do sinal, esse rebate e soma os 60Hrz + 60Hrz totalizando os 120. como isso se acha o período dando início ao cálculo que no final se resulta em 8333 us. 

Então resumindo :

 

16bits = 65563 - 8333 = 57203 em decimal 

                                       DF73 em hexadecimal - com isso a parte HIGH fica DF 

                                                                                                parte  LOW  fica 73 

 

Como estou engatinhando nesse mundo,acredito que seja essa a ideia !

 

Quanto ao circuito de passagem por zero estou usando um 4023 .

 

Paulo agradeço mais uma vez !

 

@vtrx Brother !!!!!!!!!!!!!

 

Gostei demais do exemplo, vou estudar ele e adaptar para o mikroC .

 

Testei no Proteus e as ondas são perfeitas.

 

Muito obrigado por contribuir para meu conhecimento . 

Postado

@CLEUBER ,

 

Bom, 4023 que eu conheço é uma simples porta Nand de 4 entradas ..... não vejo como usar isto de maneira a ter um preciso detector de passagem por zero... 

 

Existem duas maneiras básicas : um circuito que simplesmente muda de 0 para 1 quando a tensão cruza o zero na subida da senóide e muda de 1 para 0 quando cruza na descida. Neste caso, você tem programar a interrupção por mudança de nível ( change ); e a outra maneira é um circuito mais complexo que gera um pulso a cada transição. Ambos tem prós e contras, e ambos possuem um erro na detecção do instante da passagem por zero.

 

Idealmente usa-se um optoacoplador para fazer essa detecção, o qual acrescenta um delay que pode chegar a 9% do tempo do período da senóide, portanto se você está procurando precisão, tem de considerar esse erro nos cálculos. Pode-se também usar um transformador isolador, e um circuito simples com resistor e zener fornece um erro menor. 

 

Lembre-se que basta apenas uma referência a cada ciclo da senóide.... não precisa saber quando que ela sobe e quando que ela desce, você pode saber apenas umas das situações, e inferir o próximo instante, somando o tempo correspondente a meia senóide !

 

Por estes motivos é que te perguntei qual o circuito que você vai usar, justamente para eu poder calcular o erro que você terá para considerar em seus cálculos...

 

Dá uma lida aqui :

 

https://www.clubedohardware.com.br/forums/topic/1291559-zero-crossing-detector-circuit-detector-por-cruzamento-de-zero-da-corrente/

 

Paulo

 

Postado
8 horas atrás, CLEUBER disse:

Testei no Proteus e as ondas são perfeitas.

Na época eu utilizei um18F2550 para controlar 8 lâmpadas para acompanharem o ritmo de uma musica com cada lâmpada respondendo a uma frequência da musica.

O circuito funciona perfeito com lâmpadas incandescentes,no caso do exemplo ele controla 2 canais,pena que hoje em dia lâmpadas PAR estão sendo feitas com Leds e não são controláveis deste modo,mesmo assim ainda da para controlar motores etc.

Tenho um vídeo da época que usa os circuitos do exemplo que postei (moc.jpg,zero_cross.jpg),como não tinha dinheiro para desperdiçar,usei duas lâmpadas,uma no primeiro canal e a outro no ultimo.

 

Postado

@aphawk Bom dia Paulo !

 

Obrigado pelos sábios conselhos, vou me aprofundar mais no projeto, evoluindo vou mandando mensagem.

 

 

Obrigado

@vtrx Top demais.

Já estou estudando o exemplo que me passou.

 

Obrigado !

  • Curtir 1

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...