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:
Para identificar os pinos do opto: se vc usar algum 4N (25, 35 etc), ele tem 6 "pernas", conforme a figura abaixo:
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.
120
120
120
...
No próximo post, o circuito de controle de potência, com o respectivo código fonte.
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.
O pino 1 pode ser identificado por um marcador (ponto preto acima) próximo a ele.
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.
Este comentário foi removido pelo autor.
ResponderExcluir"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."
ResponderExcluirMauro essa explicação ta errada... se tiver duvida e te explico por e/mail
Uai, Alex, pode explicar por aqui mesmo, pelos comentários. Se eu concordar, altero o texto, Se não, respondo aqui,
ExcluirComo diria a gravação da TIM: "Sua contribuição é muito importante para nós!" ;)
Este comentário foi removido pelo autor.
ResponderExcluirE ai Mauro tudo bem? Sou o Tiago Struck do LdG...
ResponderExcluirCara, 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
Mauro, só reportando, deu certo...
ExcluirSó 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
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!
ExcluirAnô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.
ExcluirEste comentário foi removido pelo autor.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirO resistor de 33kohms é de quantos watts ? o meu só fica dando "0" no monitor serial.
ResponderExcluirTiago, bom dia.
ExcluirO resistor pode ser desses pequenos, de 1/4 de Watt. Esquisito isso de ficar dando só 0. Vc está usando qual optoacoplador?
agora consegui.
Excluirestou 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.
Legal que vc resolveu e postou a solução aqui.
ExcluirEste comentário foi removido pelo autor.
ResponderExcluirOlá, 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?
ResponderExcluirOlá, anônimo.
ExcluirNã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.
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.
ResponderExcluirMas mesmo assim, muito bom, parabéns!
Mauro quando vc fez dava sempre esse mesmo valor de 120?
ResponderExcluirSds.
João,
ExcluirPode 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?
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.
ExcluirO meu está sempre dano 0, alguem sabe me informar o pq? Estou usando um 4n35, montei igual a imagem, e não deu!
ResponderExcluirEu 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
ResponderExcluirLegal, parabéns! Eu já apanhei desse troço de medir corrente alternada com o Arduino.
ExcluirResolvi o problema do "0" trocando o optoacoplador MOC3021 por um optoacoplador npn genérico (utilizei o simulador Proteus) e funcionou perfeitamente após isso.
ResponderExcluirBom trabalho, parabéns
Ótimo que resolveu, obrigado.
ExcluirRESUELTO EL TEMA DEL CERO!!!!
ResponderExcluirpara contar durante un segundo :
while((millis()-t) <= 1000)
y así cuenta los pulsos durante un segundo
??
Excluirpessoal 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
ResponderExcluirBoa 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.
ResponderExcluirdesde ja obrigado
O problemas estava na placa, efetuei a troca e funcionou perfeitamente.. valeuuu
ExcluirFiz o teste aqui em casa e o valor que apresenta é 60, alguém sabe me dizer pq?
ResponderExcluir