Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte II

O primeiro post que escrevi sobre esse assunto descreve a primeira parte da teoria por trás do controle de potência com Arduino. Lá está escrito que o Arduino deve controlar a forma da senóide de tensão de corrente alternada para que possa ter um controle preciso da energia enviada ao circuito a ser controlado.

Agora vamos ver o circuito que faz esse controle. O circuito é dividido em duas partes:

1) um "sensor de zero", que informa ao Arduino onde a senóide começa (ou seja, a passagem da curva senóide pelo ponto zero).

2) um circuito de controle que permita, comandado pelo Arduino, que apenas uma determinada parte da onda senóide seja enviada ao circuito a ser controlado (que pode ser uma resistência, lâmpada, motor etc).

Abaixo, a parte do circuito responsável pelo item 1:


Como vcs podem ver, é um circuito muito simples, composto de um optoacoplador e dois resistores.

O optoacoplador por sua vez é composto de um fotodiodo e de um fototransistor, como na figura abaixo:


Ele funciona da seguinte forma: toda vez que a tensão entre os pólos do fotodiodo (em vermelho) chega a um determinado valor positivo, que varia com o modelo de opto, o diodo passa a conduzir eletricidade e consequentemente a emitir luz. Assim que ele passa a emitir luz o fototransistor passa a conduzir entre o coletor e o emissor. Assim, a gente fica tendo um circuito onde a presença de uma tensão do lado esquerdo é detectada pelo lado direito apenas pela passagem da luz, e não de corrente elétrica, o que significa que se houver uma sobretensão do lado esquerdo essa não vai se propagar para o lado direito, preservando o circuito mais sensível.

Assim, o optoacoplador serve para acoplar oticamente (ou desacoplar eletricamente) dois circuitos. Nesse caso, o circuito de baixa tensão (lado direito) está conectado ao lado esquerdo pelo opto sem que haja passagem de corrente de um lado pro outro, conforme descrito acima.

No nosso caso, usaremos o optoacoplador para informar ao Arduino a passagem por zero da senóide. A ideia é que, a toda vez que a senóide da rede elétrica passar pelo ponto zero, seja gerado um pulso elétrico no pino 2 do Arduino. Foi usado o opto 4N25.

Para isso, ligamos o sinal de alta tensão ao fotodiodo, através de um resistor de 33 kohms Se for um circuito 110V, ligamos o fase e neutro aos terminais, se for 220V ligamos as duas fases. Em seguida, montamos o circuito de baixa conforme o esquema acima, usando um resistor de 1 a 10kohms e conectando o pino 5 do opto ao pino 2 digital do Arduino e ao resistor. A outra ponta do resistor vai no +5V do Arduino.

Para identificar os pinos do opto: se vc usar algum 4N (25, 35 etc), ele tem 6 "pernas", conforme a figura abaixo:


O pino 1 pode ser identificado por um marcador (ponto preto acima) próximo a ele.

O código é bem simples, mas usa um recurso que aparece pouco em circuitos com Arduino, apesar da grande utilidade. Aprender a usar as interrupções simplifica muito os nossos códigos.

Basicamente o recurso consiste em fazer com que uma rotina seja chamada quando um pino do Arduino muda de estado (de 0 para 5V ou vice-versa). Nesse caso, a rotina é executada a cada mudança de estado.  Abaixo, o fonte devidamente comentado.
// Programa que conta os "meio-ciclos" da onda senoidal fornecida pela
//concessionária de energia elétrica.
 
// Variável que armazena os pulsos. Como será chamada dentro da rotina
// ContaPulsos(), que é uma rotina de interrupção,
// tem que ter o comando volatile.
volatile unsigned int pulsos = 0;
 
// Rotina que é chamada a cada meio ciclo, incrementando a variável pulsos.</pre>
void ContaPulso()
{
   pulsos++;
}
 
void setup()
{
   Serial.begin(9600);
// Essa instrução faz com que, a cada vez que o pino 2 passa muda de 0 para 5V
// (RISING), a rotina ContaPulso() é chamada. O número 0 define o pino 2,
// o número 1 define o pino 3. 
   attachInterrupt(0, ContaPulso, RISING);
}
 
void loop()
{
   volatile unsigned long t=millis();
// Espera um segundo...
   while((millis()-t) <= 1000)
   {
   }
// Durante a espera, a interrupção ocorre a cada vez que o pino 2 muda de
    
// zero para 5V. Como isso acontece a cada meio ciclo, após um segundo</pre>
// a variável pulsos vai conter o valor 120, que será impresso repetidas</pre>
// vezes. 
   Serial.println(pulsos);
// Zera a variável para contar os pulsos do próximo ciclo.
   pulsos=0;
}

Quando executamos esse programa, o sistema conta as passagens por zero a cada segundo, que são 120, duas por ciclo. Assim, a saída mostrada no Serial Monitor é algo como:

120
120
120
...

No próximo post, o circuito de controle de potência, com o respectivo código fonte.

Comentários

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
  2. "Ele funciona da seguinte forma: toda vez que a tensão entre os pólos do fotodiodo (em vermelho) chega a um determinado valor próximo de 0V, que varia com o modelo de opto, o diodo passa a conduzir eletricidade e consequentemente a emitir luz. Assim que ele passa a emitir luz o fototransistor passa a conduzir entre o coletor e o emissor. Assim, a gente fica tendo um circuito onde a presença de uma tensão do lado esquerdo é detectada pelo lado direito apenas pela passagem da luz, e não de corrente elétrica, o que significa que se houver uma sobretensão do lado esquerdo essa não vai se propagar para o lado direito, preservando o circuito mais sensível."

    Mauro essa explicação ta errada... se tiver duvida e te explico por e/mail

    ResponderExcluir
    Respostas
    1. Uai, Alex, pode explicar por aqui mesmo, pelos comentários. Se eu concordar, altero o texto, Se não, respondo aqui,
      Como diria a gravação da TIM: "Sua contribuição é muito importante para nós!" ;)

      Excluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. E ai Mauro tudo bem? Sou o Tiago Struck do LdG...

    Cara, estou quebrando a cabeça aqui... Nesse exemplo que tu passou, o meu não sai de 0 a variável pulsos.
    Estou ligando uma rede 220V na entrada... já até troquei para um resistor de 100K na entrada, troquei o 4n25 por outro... Enfim, já fiz alguns testes e nada.
    Pode me ajudar?

    Abraços

    ResponderExcluir
    Respostas
    1. Mauro, só reportando, deu certo...
      Só inclui a linha digitalWrite(2, LOW); na function setup e rodou legal.

      Já estou com os 6 Dimmers rodando, postei la no LdG o código que estou usando, valeu pela ajuda!!

      Abraços

      Excluir
    2. O meu nao deu certo, testei e o monitor serial nao mostra outro valor a nao ser 0. mesmo ligando o pino 0 do arduino em 5v. O que pode ser? Obrigado!

      Excluir
    3. Anônimo, eu não entendi, o circuito e o fonte acima não tem nada a ver com pino 0. O circuito de detecção de 0 está conectado ao pino 2 do Arduino, que corresponde à interrupção 0.

      Excluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Este comentário foi removido pelo autor.

    ResponderExcluir
  7. O resistor de 33kohms é de quantos watts ? o meu só fica dando "0" no monitor serial.

    ResponderExcluir
    Respostas
    1. Tiago, bom dia.
      O resistor pode ser desses pequenos, de 1/4 de Watt. Esquisito isso de ficar dando só 0. Vc está usando qual optoacoplador?

      Excluir
    2. agora consegui.
      estou usando o 4n35. mudei a linha
      attachInterrupt(0, zero_crosss_int, CHANGE);
      pois como o 4n35 só pega meio ciclo , mudei para CHANGE conseguindo pegar o zero da senoide na subida e na descida.

      Excluir
    3. Legal que vc resolveu e postou a solução aqui.

      Excluir
  8. Este comentário foi removido pelo autor.

    ResponderExcluir
  9. Olá, fiz o circuito acima com o código fonte, mas no serial monitor somente '0'. Estou con uma entrada de 110VAC. Nos pinos 1 e 2 do 4N25 tem 50VAC e nos pinos 4 e 5 tem 2,8VDC. O que está errado?

    ResponderExcluir
    Respostas
    1. Olá, anônimo.
      Não sei porque isso está acontecendo. Terei que ligar o circuito em 110V para testá-lo. O problema é que estou viajando, só volto à cidade onde tenho o circuito montado no dia 10/9. Me mande uma mensagem nessa data para que eu me lembre de testar com vc, caso vc não consiga resolver sozinho. Se conseguir, por favor poste a solução aqui.

      Excluir
  10. Acho que seria apropriado colocar um diodo em anti-paralelo ou em série com o "LED" do optoacoplador para protegê-lo da tensão reversa da rede, já que o mesmo só aguenta 5V de tensão reversa. No meu ponto de vista, este optoacoplador deveria ter queimado.

    Mas mesmo assim, muito bom, parabéns!

    ResponderExcluir
  11. Mauro quando vc fez dava sempre esse mesmo valor de 120?
    Sds.

    ResponderExcluir
    Respostas
    1. João,

      Pode variar um pouco, em função da variabilidade dos componentes, mas sempre valores muito próximos a 120. O que está acontecendo no seu caso?

      Excluir
    2. Desculpa a demora em responder Mauro. Tive que fazer umas pequenas mudanças no circuito, coisa simples e tbm havia muito mal contato. Outro problema que eu estou encontrando é com o sistema pronto, por algum motivo, depois que o sistema atinge e passa do valor do setpoint escolhido, ele simplesmente trava Mauro. Andei pesquisando e fazendo alguns testes e tenho quase certeza que é devido a interrupção, só não sei ainda como resolver esse impasse.

      Excluir
  12. O meu está sempre dano 0, alguem sabe me informar o pq? Estou usando um 4n35, montei igual a imagem, e não deu!

    ResponderExcluir
  13. Eu fis um medidor com uma bobina toroidal e o optoacoplador a bobina em volta do fio da minha fonte caseira e o Arduíno medindo a corrente fico legal

    ResponderExcluir
    Respostas
    1. Legal, parabéns! Eu já apanhei desse troço de medir corrente alternada com o Arduino.

      Excluir
  14. Resolvi o problema do "0" trocando o optoacoplador MOC3021 por um optoacoplador npn genérico (utilizei o simulador Proteus) e funcionou perfeitamente após isso.
    Bom trabalho, parabéns

    ResponderExcluir
  15. RESUELTO EL TEMA DEL CERO!!!!
    para contar durante un segundo :

    while((millis()-t) <= 1000)

    y así cuenta los pulsos durante un segundo

    ResponderExcluir
  16. pessoal criei uma programação usando uma resistencia ligada no rele e a programação é a seguinte.usando o sensor dht11, quando a temperatura chega em 36 graus a resistência liga, quando a resistencia chega em 38 desliga a resistencia.gostaria de fazer essa programação usando PID. alguem pode me ajudar

    ResponderExcluir
  17. Boa tarde Mauro, primeiramente parabens pelo artigo, esta sendo de grande utilidade, mesmo que ja o tenha escrito a tanto tempo, estou com um probleminha, meu arduino chega ao valor de 120 porem sem o acoplador estar conctado nele, toda vez que eu conecto o pino 2 a placa do optoacoplador a mesmas fica marcando "0" no serial monitor.detalhe sem conectar o 5v e o 0v, apenas quando ligo o pino 2 ele fica marcando'0', quando retiro esse sinal fica marcando 120, ate então não consigo entender o que ele esta contando, se tiver alguma dica fico agradecido.
    desde ja obrigado

    ResponderExcluir
    Respostas
    1. O problemas estava na placa, efetuei a troca e funcionou perfeitamente.. valeuuu

      Excluir
  18. Fiz o teste aqui em casa e o valor que apresenta é 60, alguém sabe me dizer pq?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte III

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Dividindo um programa (sketch) do Arduino em mais de um arquivo