Escolar Documentos
Profissional Documentos
Cultura Documentos
CEFET/MG
Guilherme Cristino
Araxá, MG
2015
1. INTRODUÇÃO
Nos últimos anos, os sistemas de controle automáticos têm assumido uma
importância crescente no desenvolvimento e avanço da tecnologia. Praticamente todas as
atividades envolvidas no nosso dia a dia, são efetuadas por algum tipo de sistema de
controle. Estes são encontrados em abundância em setores da indústria, tais como
controle de qualidade e fabricação de produtos, linhas de montagem automática, controle
de ferramentas, tecnologia espacial e de armamento, sistemas de transporte, sistemas de
potência, robôs e muitos outros (OGATA, 1998). O controle, na escala tecnológica,
assume um papel primordial e decisivo dentre os modelos e processos existentes, sejam
eles simples, modestos, robustos ou de estrema complexidade no plano de ação
(SILVEIRA, 2003). E o controle de temperatura é necessário em processos industriais e
comerciais frequentemente observados nas várias linhas de produção, tais como fornos
industriais, centrais de ar condicionado, caldeiras, chocadeiras, estufas e uma infinidade
de aplicações.
A Figura 2 ilustra o gráfico da fonte de Tensão alternada da rede (V) versus Ângulo de
disparo (α). A parte sombreada de cada semiciclo mostra quando o TRIAC está
conduzindo. Portanto, o dispositivo TRIAC comuta em duas posições, ora ligado ora
desligado, disparando a cada semiciclo da onda senoidal. Devido ao deslocamento da fase,
a tensão no gatilho atrasa a tensão da rede por um ângulo entre 0 e 90º. O disparo é
limitado à condução de 180° por ciclo e, ele pode conduzir 360° por ciclo,
disponibilizando controle completo sobre a forma de onda da tensão na carga. Um
controle como este é usado no aquecimento, na iluminação industrial e em outras
aplicações de alta potência (MALVINO, 2008).
Os circuitos de disparo controlado por fase devem ser sincronizados com a rede
elétrica para que não ocorram disparos aleatórios do TRIAC. E a passagem da rede por
zero é uma referência para manter esse sincronismo do pulso toda vez que a tensão passa
por 0 V. Na Figura 3 é mostrado o gráfico de verificação do detector de passagem por zero,
onde é possível perceber a tensão de referência em sincronia com a tensão da rede. A seta
indica exatamente o sincronismo entre as mesmas.
(a) (b)
Figura 5 – Formas de onda de tensão na carga para
α=90º (a) e α=145º (b).
A curva com o formato em S pode ser caracterizada por duas constantes, o atraso L e
a constante de tempo T. O atraso e a constante de tempo são determinados desenhando-
se uma linha tangente no ponto de inflexão da curva com o formato de S e determinando-
se a interseção da linha tangente com o eixo do tempo. O ajuste do controlador PID,
segundo este método, introduz no sistema dois zeros em -1/L se o projeto for feito em
tempo contínuo. A figura 7 apresenta uma tabela para o cálculo dos parâmetros PID.
O PID discreto pode ser obtido por este método, algumas modificações podem ser
realizadas, em vista a melhoria do desempenho do controlador PID.
2. PROCEDIMENTOS EXPERIMENTAIS
I. Cooler 12 vc
II. Fonte 19,5 vc
III. Resistência 110 v / 500 w
IV. Tubo PVC 75 mm
V. Madeira
VI. Sensor de temperatura LM35
VII. Micro controlador Arduino Mega 2560
VIII. Circuito detector de zero
IX. TRIAC
X. Fusível
2.2. MONTAGEM
Figura 11 – Cooler
60
50
40
30 Series1
Poly. (Series1)
20
10
0
0 50 100 150 200 250
Analisando a curva característica, verificamos que a curva possui o perfil s e pode ser
aplicado o método de Ziegler-Nichols em malha aberta.
60
50
40
30 Series1
Poly. (Series1)
20
10
0
0 50 100 150 200 250
Com isso chegamos aos valores dos parâmetros conforme indicado abaixo:
Kp Ki Kd
P 9,5 ∞ 0
PI 8,55 26,66667 0
PID 11,4 16 4
Para nossa aplicação foi utilizado Kp, Ki, Kd, o qual se mostrou eficiente no controle da
planta, conforme gráfico abaixo.
Figura 15 – Resposta do sistema após implementação do PID.
#include <TimerOne.h>
#define triacApin 7
void setup()
{
pinMode(triacApin, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(triacApin, LOW);
digitalWrite(6, LOW);
Serial.begin(9600);
Timer1.attachInterrupt(gateTRIACa);
attachInterrupt(0, detectorzero, FALLING);
Compute();
Serial.println("Digite o Setpoint desejado (Temperatura)");
Serialclear();
delay(1000);
void loop()
{
while((i < 2) && (Serial.available()>0))
{
set[i] = Serial.read();
i++;
}
if(i==2)
{
if(A==0)
{
setpoint = Concatena_Numeros(set[0], set[1]);
Serial.print("Setpoint: ");
Serial.println(setpoint);
delay(1000);
Serial.println("Digite o Sensor desejado: (1) para S1 , (2) para S2 e (3) para S3 ");
Serialclear();
i++;
B=0;
}
else
{
setpoint = Concatena_Numeros(set[0], set[1]);
Serial.print("Setpoint: ");
Serial.println(setpoint);
delay(1000);
Serial.print("Sensor: S");
Serial.println(sensor);
delay(1000);
Serialclear();
i=4;
}
}
if(i==3)
{
while((Serial.available()>0)&& (B==0))
{
set1[0] = '0';
set1[1] = Serial.read();
sensor = Concatena_Numeros(set1[0], set1[1]);
B++;
if((sensor>0) && (sensor<4))
{
Serial.print("Sensor: S");
Serial.println(sensor);
delay(1000);
Serial.println("PARA ALTERAR O SETPOINT INSIRA UM NOVO VALOR A
QUALQUER MOMENTO");
Serialclear();
delay(3000);
i++;
}
else
{
Serial.println("SENSOR INEXISTENTE");
Serialclear();
delay(1000);
i=2;
}
}
}
if(i==4)
{
Serial.print("Temperatura: ");
Serial.println(temperatura_calculo());
delay(1000);
Serial.print("Tempo: ");
Serial.println(Tempo_Onda);
delay(1000);
Serial.print("Setpoint: ");
Serial.println(setpoint);
delay(1000);
Serial.print("Sensor: S");
Serial.println(sensor);
delay(1000);
if(Serial.available()>0)
{
i=0;
A++;
}
}
}
void Serialclear()
{
while(Serial.available()>0)
Serial.read();
return;
}
int Concatena_Numeros(int variavel1, int variavel2)
{
int resultado;
resultado = ((variavel1 - '0') * 10) + (variavel2 - '0');
return resultado;
}
void detectorzero()
{
if (a < 1)
{
Timer1.initialize(Tempo_Onda);
a=1;
}
currentMillis = millis(); //Conta 18s
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
Compute();
}
}
void gateTRIACa()
{
digitalWrite(triacApin, HIGH); // dispara0 o Triac
delayMicroseconds(25); // aguarda 25 microsegundos para garantir disparo do TRIAC
digitalWrite(triacApin, LOW); // desabibilta gate do TRIAC
Timer1.stop();
a = 0;
}
float temperatura_calculo()
{
if (sensor == 1)
return (analogRead(LM35_1) * CELSIUS_BASE);
if (sensor == 2)
return (analogRead(LM35_2) * CELSIUS_BASE);
if (sensor == 3)
return (analogRead(LM35_3) * CELSIUS_BASE);
}
void Compute()
{
double error = setpoint - temperatura_calculo();
errSum += (error * 18000);
double dErr = (error - lastErr) / 18000;
Output = ((Kp*error) + (Ki*errSum) + (Kd*dErr));
lastErr = error;
SetOutputLimits();
}
void SetOutputLimits()
{
if(Output > outMax)
Output = outMax;
if(Output < outMin)
Output = outMin;
Tempo_Onda = 8000-((Output/8000000)*8000);
}
5. REFERÊNCIAS
SILVEIRA, P. R. da S. Automação e Controle Discreto. 5. ed. São Paulo: Érica Ltda 2003.
ALMEIDA. José Luiz Antunes de. Dispositivos Semicondutores: TIRISTORES. 8. ed. São
Paulo, 2003.
MALVINO, A. P. Eletrônica. 4. ed. São Paulo: Pearson Makron Books. Março, 2008.