Postagem em destaque

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

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

sexta-feira, 17 de maio de 2013

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.