Вы находитесь на странице: 1из 16

PID ARDUINO

Controle PID de Potncia em Corrente Alternada -


Arduino e TRIAC - Parte I
Este post o primeiro de uma srie de seis que escrevi tratando de controle de potncia e PID
(controle proporcional, integral e derivativo) com o Arduino.

Os posts so os seguintes:

Controle de Pot. em CA - PID, Arduino e TRIAC - Parte I


Controle de Pot. em CA - PID, Arduino e TRIAC - Parte II
Controle de Pot. em CA - PID, Arduino e TRIAC - Parte III
Controle de Pot. em CA - PID, Arduino e TRIAC - Parte IV
Controle de Pot. em CA - PID, Arduino e TRIAC - Parte V
Controle de Pot. em CA - PID, Arduino e TRIAC - Parte VI

Quem estiver interessado em controle de potncia por ngulo de fase pode ler s a parte
correspondente (posts I, II e III). Quem quiser aprender sobre PID deve ler a srie toda, para
poder entender os exemplos da parte de PID.

Procurei descrever de forma simples ambos os processos, mas usando a terminologia correta
que se usa em Engenharia de Controle e Automao. Acho esses tpicos dos mais
importantes em mecatrnica, e na net no tem muita coisa em portugus. Mesmo em ingls
no tem material prtico e que ao mesmo tempo explique a teoria por trs desses tpicos.
Boral?

Um grupo de alunos da FATESF me procurou para ajud-los com um trabalho muito


interessante na rea de controle. Como o processo envolvia controle de temperatura de uma
resistncia ligada em 220V, resolvi estudar a ideia de como controlar potncia com o Arduino.

Para se controlar corrente alternada, temos duas alternativas:

- A primeira seria colocar um rel ou algo parecido que ligasse e desligasse a energia na
resistncia comando pelo Arduino. Esse tipo de controle, bem simples, deveria funcionar para
controle de temperatura. o tipo de controle da geladeira: o motor (compressor) ligado
sempre que a temperatura sobre acima de um determinado valor e desliga quando a
temperatura cai abaixo de outro valor.
Como no caso do projeto a ideia controlar uma resistncia (que foi adaptada de um chuveiro,
inclusive), esse controle tipo rel daria pro gasto, eu acho. Mas como um TCC, foi indicado
pelo professor que se utilizasse uma forma de controle mais sofisticada: o chamado Controle
Proporcional-Integral-Diferencial, ou PID para os mais chegados.

- O PID basicamente o que a gente faz com o chuveiro da casa da gente quando est
fazendo frio, o que alis o caso por esses dias aqui em So Jos dos Campos: se a gua t
fria a gente fecha um pouco a torneira e ela esquenta mais, se fica quente demais a gente abre
a torneira, tentando manter a temperatura num valor confortvel (o "set point", na linguagem
tcnica). Ou seja, nesse caso, em vez de ficar desligando e ligando a resistncia do chuveiro a
gente fica tentando ajustar o fluxo de gua de maneira que seja atingido o equilbrio prximo ao
set-point. Normalmente a gente consegue, ou seja, conseguimos achar um ponto de equilbrio
entre a quantidade de gua que entra no chuveiro e a temperatura da gua na sada. A o
banho rola sossegado.
Eventualmente a gente fica o banho todo abrindo e fechando a torneira, o "relgio cai"
(disjuntor desarma, em engenheirs) e a gente passa aperto etc. Isso pode acontecer com
esse tipo de controle quando ele no est bem ajustado ou as condies para o controle so
muito adversar (por exemplo, o dia est muito frio).
Para implementar isso precisamos de um mecanismo de controle que nos permita variar a
quantidade de energia enviada resistncia, de maneira a variar a taxa de aquecimento dela,
ou seja, a rapidez com que ela vai esquentar (e a temperatura que ir atingir) precisam ser
devidamente controlados.

Ocorre que o fato da resistncia ser ligara rede de distribuio de energia (220V em SJC),
traz as seguintes implicaes.

1) IMPORTANTE: A TENSO DE 220V MATA! Se vc resolver, a partir das informaes que


leu aqui montar um circuito igual ou semelhante, preste muita ateno ao que for fazer, e pea
ajuda a profissionais mais experientes caso no se sinta confortvel com o desafio. Se ocorrer
algum acidente vc pode se machucar seriamente, e certamente vai danificar algum
equipamento que j estiver ligado ao circuito (incluindo o seu computador).
O circuito que eu vou sugerir seguro, tem opto-acopladores para isolar a parte de potncia
(onde rolam os 220V) da parte de controle, onde estaro conectados o Arduino e
consequentemente o seu PC, ou seja, fazendo com o devido cuidado no dever haver
surpresas.

2) Alm da tenso ser alta, ela CA (corrente alternada). Isso complica um bocado o
mecanismo de controle. Par entender como vai funcionar a bagaa, precisamos de um pouco
de teoria.

No grfico acima, temos a relao entre o tempo e a tenso em corrente alternada. D pr ver
que a tenso fica variando, num mesmo fio, entre +220V e -220V, passando por 0V no meio do
caminho. Isso significa, grosso modo, que a tenso se alterna entre "indo e voltando" pelo fio.
O caminho percorrido de 0V at o prximo 0V corresponde a meio ciclo, ou seja, duas
passagens pelo eixo X compem um ciclo.

No rede eltrica brasileira esses ciclos acontecem 60 vezes por segundo. Por isso se diz que a
frequncia da corrente alternada no Brasil de 60 ciclos/segundo, ou 60 Hertz (Hz).

O que tem isso a ver com o nosso projeto? que, para controlar efetivamente a energia
enviada resistncia (ou qualquer outra carga, uma lmpada, por exemplo), temos que cortar,
proporcionalmente ao controle que queremos fazer, um "pedao" da onda. Veja nas fotos
abaixo. Elas foram tiradas da tela de um osciloscpio, que um equipamento que permite que
a gente examine a forma de onda de pontos de um circuito eltrico.
Essa a onda completa, ou seja, quase como vem na tomada de energia das nossas casas.
Ela tem uma pequena flutuao perto do zero (que no ocorre na energia da concessionria,
s dentro desse tipo de circuito), depois eu explico porque.

Aqui vc v a onda onde apenas em mais ou menos metade de cada meio ciclo tem energia, ou
seja. a tenso cai em direo ao zero e permanece a por um quarto de ciclo, em seguida
dando um salto para -220V e seguindo em direo a zero. O mesmo acontece com o meio ciclo
positivo.
Aqui a forma de onda onde a quantidade de energia enviada ao resistor bem baixa, ou seja,
a tenso fica em zero quase todo tempo, dando apenas um pequeno pico ao final de cada meio
ciclo.

Bom, e como que se faz esse controle?

Primeiro a gente tem que fazer um circuito que faa com que o Arduino seja informado a cada
ciclo, para que um segundo circuito comandado pelo Arduino faa o controle da forma da onda.

O primeiro post que escrevi sobre esse assunto descreve a primeira parte da teoria por trs do
controle de potncia com Arduino. L est escrito que o Arduino deve controlar a forma da
senide de tenso 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 senide comea (ou seja, a passagem
da curva senide pelo ponto zero).

2) um circuito de controle que permita, comandado pelo Arduino, que apenas uma determinada
parte da onda senide seja enviada ao circuito a ser controlado (que pode ser uma resistncia,
lmpada, motor etc).

Abaixo, a parte do circuito responsvel 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 tenso entre os plos 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 presena de uma tenso do lado esquerdo detectada pelo lado direito apenas
pela passagem da luz, e no de corrente eltrica, o que significa que se houver uma
sobretenso do lado esquerdo essa no vai se propagar para o lado direito, preservando o
circuito mais sensvel.

Assim, o optoacoplador serve para acoplar oticamente (ou desacoplar eletricamente) dois
circuitos. Nesse caso, o circuito de baixa tenso (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
senide. A ideia que, a toda vez que a senide da rede eltrica passar pelo ponto zero, seja
gerado um pulso eltrico no pino 2 do Arduino. Foi usado o opto 4N25.

Para isso, ligamos o sinal de alta tenso ao fotodiodo, atravs 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) prximo a ele.

O cdigo bem simples, mas usa um recurso que aparece pouco em circuitos com Arduino,
apesar da grande utilidade. Aprender a usar as interrupes simplifica muito os nossos
cdigos.

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 mudana de estado. Abaixo, o fonte devidamente comentado.
?
1 // Programa que conta os "meio-ciclos" da onda senoidal fornecida pela
2 //concessionria de energia eltrica.
3
4 // Varivel que armazena os pulsos. Como ser chamada dentro da rotina
// ContaPulsos(), que uma rotina de interrupo,
5 // tem que ter o comando volatile.
6 volatile unsigned int pulsos = 0;
7
8 // Rotina que chamada a cada meio ciclo, incrementando a varivel
9 pulsos.</pre>
void ContaPulso()
10 {
11 pulsos++;
12 }
13
14 void setup()
15 {
Serial.begin(9600);
16 // Essa instruo faz com que, a cada vez que o pino 2 passa muda de 0 para
17 5V
18 // (RISING), a rotina ContaPulso() chamada. O nmero 0 define o pino 2,
19 // o nmero 1 define o pino 3.
attachInterrupt(0, ContaPulso, RISING);
20 }
21
22 void loop()
23 {
24 volatile unsigned long
25 t=millis();
int c=0;
26 // Espera um segundo...
27 while((millis()-t) >= 1000)
28 {
29 }
30 // Durante a espera, a interrupo ocorre a cada vez que o pino 2 muda de
31
32 // zero para 5V. Como isso acontece a cada meio ciclo, aps um segundo</pre>
// a varivel pulsos vai conter o valor 120, que ser impresso
33 repetidas</pre>
34 // vezes.
35 Serial.println(pulsos);
36 // Zera a varivel para contar os pulsos do prximo ciclo.
pulsos=0;
37 }
38
39
40
41
Quando executamos esse programa, o sistema conta as passagens por zero a cada segundo,
que so 120, duas por ciclo. Assim, a sada mostrada no Serial Monitor algo como:

120
120
120

IMPORTANTE: como o segundo circuito abaixo taca gerando muita confuso, troquei-o para
um desenho mais simples.

No primeiro post a respeito desse assunto, escrevi sobre a teoria por trs do controle de
potncia em corrente alternada. No segundo post, mostrei o circuito e o programa
responsveis pela indicao de zero na onda senide de CA.

Agora vamos ver o circuito para controle de uma carga 110 ou 220V. Para fazer isso, usaremos
um circuito baseado em TRIAC. O software que roda no Arduino conta com um mecanismo de
interrupo semelhante ao descrito no outro post, que monitora a passagem por zero no ciclo.
Dentro da rotina que executada a cada zero, o sistema liga o TRIAC em instantes distintos,
de acordo com tenso que deseja-se enviar carga. O TRIAC se desliga sozinho na prxima
passagem pelo zero.
Acima, fritzing dos dois circuitos, o de zero (esquerda) e o de controle (direita).

Lista de componentes:
CI MOC3020
TRIAC BTA12-600
CI H11AA1
Resistores de 180, 2,4k, 10k, 33k.
Capacitor de 0,01 uF, 400 V, de polister ou outro material. No pode ser eletroltico.

ATUALIZAO: esse CI, o H11AA1, funciona como um "sensor de zero de onda completa".
Ele tem dois diodos, ligados em contraparalelo, que conseguem captar a passagem da
corrente por zero nos dois sentidos. Aqui no datasheet vc pode ver como funciona.

Acontece que esse CI no muito fcil de se achar. Como alternativa, segue abaixo outro
circuito que usa como opto o 4N25 (pode ser usado tb o 4N35). Esse CI mais fcil de ser
encontrado (datasheet). Por outro lado, ele de meia-onda, ou seja, para que vc monitore as
duas passagens por zero de um ciclo necessrio o uso de uma ponte retificadora antes do
4N. Abaixo, esquema do circuito com o 4N35, incluindo a ponte. A ponte tb bem fcil de ser
encontrada, e bem barata.

Nesse circuito, a sada que informa a passagem por zero a Zerocrossing signal output, que
deve ser conectada ao pino 2 digital do Arduino. J a entrada do sinal de disparo do
dimmer,dimmer signal in, deve ser conectada ao pino 4, para ficar compatvel com o cdigo
abaixo. O circuito funcionar tambm para 110 V.

Esse LED que tem na entrada de sinal do dimmer pode ser excludo (nesse caso, claro, vc
deve conectar a entrada direto no positivo da entrada do MOC). Se vc us-lo e a sua lmpada
e/ou ele ficarem piscando, tire fora.

Na figura:

T1 - TRIAC TIC206 ou BR136 (ou algum outro equivalente)


BR1 - ponte retificadora 400V, ou ento vc pode montar uma ponte com 4 1N4004 ou
equivalentes. D um Google e vc acha como fazer uma, caso no ache a ponte
pronta. Aqui tem algo sobre.
Agora, o cdigo:

?
1
2
3
4 #define loadR 4
5
6 volatile int power = 100;
7
8 void zero_crosss_int()
{
9 // Clculo do ngulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
10 // (8333us - 8.33us) / 256 = 32 (aprox)
11 int powertime = (32*(256-power));
12 // Mantm o circuito desligado por powertime microssegundos
delayMicroseconds(powertime);
13 // Envia sinal ao TRIAC para que ele passe a conduzir
14 digitalWrite(loadR, HIGH);
15 // Espera alguns microssegundos para que o TRIAC perceba o pulso
16 delayMicroseconds(8.33);
17 // Desliga o pulso
digitalWrite(loadR, LOW);
18 }
19
20 void setup()
21 {
22 Serial.begin(9600);
pinMode(loadR, OUTPUT);
23 // Inicializa interrupo. O nmero zero indica a porta 2 do Arduino,
24 // zero_crosss_int a funo que ser chamada toda vez que o pino 2
25 // "subir" (RISING) de valor de 0 para 1.
26 attachInterrupt(0, zero_crosss_int, RISING);
27 }
28
void loop()
29 {
30 // Seta a potncia para diferentes nveis. Se o sistema estiver conectado a uma
31 lmpada,
32 // esta vai variar de brilho.
power=10;
33
delay(10000);
34 power=60;
35 delay(10000);
36 power=120;
37 delay(10000);
power=180;
38 delay(10000);
39 power=240;
40 delay(10000);
41 }
42
43
44

Agora sim, vamos entrar no assunto principal dessa srie de posts: o Controle Proporcional ,
Integral Derivativo, PID. A ideia explicar a teoria da coisa e dar pelo menos um exemplo de
como usar o PID na prtica. O texto abaixo quase uma traduo de parte do texto sobre PID
da Wikipedia em ingls, ento sugiro que aqueles que conseguem ler bem na lngua de Sir
Paul McCartney que leiam o texto por l.

O controle PID um mecanismo genrico de controle do tipo "loop feedback", ou seja, um


sistema que leva em conta a resposta do processo durante o ajuste para modificar o seu
comportamento. muito usado em sistemas de controle industriais. O PID calcula um erro, que
a diferena entre o valor corrente da varivel a ser controlada no tempo t e o set point. Ele
tenta ento minimizar o erro ajustando o input do processo de controle.

O algoritmo envolve o clculo de trs parmetros, o que faz com que o PID tambm seja
chamado de controle de trs termos: os termos proporcional, integral e derivativo, o que d a
sigla PID. Heuristicamente, esses valores podem ser interpretados em termos de tempo: P
depende do erro presente, I da acumulao de erros passados e D uma tentativa de predio
dos erros futuros, baseado na taxa atual de mudana.
O peso de cada termo deve ser ajustado para cada processo.

Quando no se conhece as especificidades de um processo, o PID considerado o melhor


algoritmo de controle. Ajustando-se os trs parmetros do PID fazemos com que ele consiga
atender s demandas especficas de cada processo a ser controlado. A reposta do controle
pode ser descrita em termos da responsividade do controle a um erro, do tanto que o controle
ultrapassa o set point e do grau de oscilao do sistema. importante observar que o PID por
si s no garante o controle timo do sistema nem a sua estabilidade. Cada caso um caso.

Algumas aplicaes podem necessitar do uso de apenas uma ou duas aes para propiciar o
sistema de controle apropriado. Isso obtido zerando-se os parmetros que devem ser
desativados. Um controle PID pode ento ser chamado de de controle PI, PD, P ou I. Controles
PI so muito comuns, desde que a ao derivativa muito sensvel a rudos na medida. J a
ausncia do termo derivativo pode impedir o sistema de atingir o set point devido ao do
controle.

Introduo - Controle por lao (loop control)

Quando tomamos banho, principalmente num dia frio, tomamos o cuidado de ajustar a
temperatura da gua, nem to fria que nos seja desconfortvel, nem to quente que nos
queime a pele. Esse ajuste feito com a gente atuando na quantidade de gua que passa pela
resistncia do chuveiro. Quanto menos gua passa pelo chuveiro mais quente ela fica. Se o
chuveiro no for eltrico (o que, assim como a jabuticaba, uma coisa exclusiva do Brasil), ou
seja, se houver um aquecedor central, a gente atua nas torneiras de gua fria e quente, de
maneira a obtermos a temperatura de nosso agrado. Esse um exemplo de um loop control,
que tem esse nome porque a malha forma um lao fechado entre o sensor de temperatura
(nossa mo), o processamento (nosso crebro) e os atuadores, nossa(s) mo(s) que aciona(m)
a(s) torneira(s).

A temperatura a varivel de processo (VP) o valor desejado o set point (SP). As voltas
que damos na torneira representam a varivel manipulada (MV). A diferena de temperatura
medida e o SP o erro (e) e quantifica se a gua est muito quente ou fria e o quanto est
longe do SP.

Depois de medir a temperatura num determinado instante (PV) e calcular o erro, o controlador
decide atuar na torneira (MV) e quanto atuar. Se a temperatura est mais quente e perto do
que desejamos, abrimos pouco a torneira, se est muito quente abrimos mais. Esse um
exemplo simples de controle proporcional. No caso da temperatura demorar a baixar,
podemos abrir mais e mais a torneira. Esse um exemplo de controle derivativo, ou seja, a
ao de controle depende da taxa (velocidade) de variao do PV.

Abrir muito a torneira quando o erro pequeno equivalente ter um alto ganho no controlador,
e ir levar a VP a ultrapassar o SP, o que em ingls chamado de overshoot. Se o controle
faz atuaes muito grandes repetidamente, o VP ir oscilar em torno do SP em uma forma
sinuside constante, crescente ou decadente. Se a oscilao cresce com o tempo ento o
sistema dito instvel, se ela decai o sistema dito estvel. Se a curva se mantm numa
amplitude constante em torno da mdia o sistema est marginalmente estvel.

Com o objetivo de convergir para o set point, o controle pode tentar antecipar futuras
oscilaes. Para compensar esse efeito, o controlador pode decidir modificar os seus ajustes.
Esse o controle derivativo.

Se um controle parte de um estado estvel com zero erro (PV = SP), poder ocorrer mudanas
no controle em resposta a mudanas em outras variveis, medidas ou no, que impactem o
processo, perturbando o PV. Variveis que impactam o processo e no so o PV so
chamadas de distrbios. Geralmente os circuitos de controle tem como objetivo rejeitar os
distrbios. No nosso exemplo, uma mudana na temperatura da gua que est entrando no
chveiro consiste em um distrbio.

Em tese, um circuito controlador pode ser usado para controlar qualquer processo em que haja
um PV que possa ser medido, um SP e uma varivel manipulvel (MV) que possa alterar o PV.
Esse tipo de controle usado na indstria para regular temperatura, presso, vazo,
composio qumica, velocidade, ou seja, praticamente qualquer varivel passvel de medio.

A teoria do PID

O esquema do controle PID constitudo da soma de manipuladores da varivel manipulada


(MV). Os termos proporcional, integral e derivativo so somados para calcular a sada do
controle PID. Se chamarmos u(t) de sada do controle, a forma final da equao :

Pode-se observar que uma equao de trs termos adicionados para calcular u, que a
correo a ser aplicada (MV) num determinado instante t.

Os termos so, pela ordem, da esquerda para a direita na equao:

O termo proporcional, Kpe(t), produz um valor de sada que proporcional ao erro em um


dado momento. Ou seja, quanto mais distante PV estiver de SP, maior ser esse termo. A
resposta proporcional pode ser ajustada pela constante Kp, chamada de constante de ganho
proporcional.

Um alto ganho proporcional resulta numa grande mudana na sada para uma dada mudana
no erro. Se o ganho proporcional muito grande, o sistema pode ficar instvel. Se o ganho
proporcional muito pequeno, a ao do controle pode ser to pequena que o SP no chegar
a ser atingido. Num dos testes que andei fazendo, s com o controle proporcional (Kp = 7, Ki =
0 e Kd = 0), para um set point igual a 60 C, obtive o seguinte resultado:
No grfico acima, e em outros que vo aparecer aqui, a curva em azul o PV (temperatura), a
curva em marrom o output que controla a quantidade de energia que o TRIAC libera para a
resistncia. O eixo x nmero da medida, que tem a ver com o tempo. Para indicar o tempo
em segundos precisamente a gente tem que usar um RTC (relgio de tempo real), colocar no
circuito e ir lendo o tempo que ele fornece. Vou ver se adoto essa prtica no futuro, at porque
eu acho que tenho um RTC por aqui.

O eixo y da esquerda o output, o da direita a temperatura em C, medida junto


resistncia.

No grfico d pr ver como o controle proporcional atua, comeando com um output mximo
(240) pelo fato do VP estar longe do SP. medida que o erro e vai caindo, o controle vai
diminuindo a potncia buscando fazer com que a temperatura se estabilize no SP, Acontece
que eu usei um Kp to pequeno que a temperatura se estabilizou em 49 C, e no no SP, que
era 60 C.

Alterando o Kp para 50 e mantendo os outros dois coeficientes iguais a zero, o comportamento


muda bastante:

Agora o sistema atinge o SP e fica oscilando em torno deste. O primeiro pico acima do SP
mais forte, depois ele se estabiliza em um valor menor, sugerindo uma condio de sistema
marginalmente estvel.

Como comum nessa plataforma to verstil que o Arduino, existe uma biblioteca pronta
para quem quer implementar controles baseados em PID. Essa biblioteca a PID Library. Ela
nos livra do trabalho de calcular a funo PID, todo o clculo j est implementado "dentro" do
objeto PID definido. O clculo no complicado, quem tiver lido e entendido esses posts que
fiz e quiser dar uma espiadinha no arquivo PID_v1.cpp vai entender perfeitamente a
implementao. O jeito de usar simples, tb. De posse dos valores de Kp, Ki e Kd, vc tem que
comear um fonte do Arduino assim:

?
1 #include "pid_v1.h"
2
// Carga (pino onde ser aplicado o output)
3 #define OutputPin 3
4
5 // Constantes do PID
6 #define kp 50
7 #define ki 10
8 #define kd 0
9
// Variveis do PID: a nomenclatura a mesma descrita no post III
10 double SetPoint, PresentValue, ManipulatedValue;
11
12 // O ltimo parmetro indica se o controle inversa ou
13 // diretamente proporcional, ou seja, se a uma alterao do PV
14 // deve corresponder uma alterao de mesmo sinal (DIRECT) ou
// de sinal trocado (REVERSE).
15
PID pid(&PresentValue, &ManipulatedValue, &SetPoint, kp, ki, kd,
16 DIRECT);
17
18 long t;
19
20 void setup()
21 {
Serial.begin(9600);
22 pinMode(OutputPin, OUTPUT);
23 // Essa instruo ativa o PID, ou seja, a cada Compute(), o sistema
24 // ir calcular o valor de MV.
25 pid.SetMode(AUTOMATIC);
26 SetPoint=60;
t=millis();
27 }
28
29
30 // Funo que l o PV. uma funo que l a sada
31 // de um LM35 cinco vezes e acumula, depois tirando a mdia das
32 // 5 leituras e calculando a temperatura em C.
int GetTemp(int sensor)
33 {
34 float temp = 0;
35 for(int i=0; i< 5;i++)
36 {
37 temp += analogRead(sensor);
delay(20);
38 }
39 temp = (temp * 0.48875855)/5;
40 return (int)temp;
41 }
42
void loop()
43 {
44 float temp = GetTemp(A0);
45 PresentValue=temp;
46 // Calcula o valor manipulado
47 pid.Compute();
// Atua no processo
48 analogWrite(OutputPin,ManipulatedValue);
49 // Mostra os valores pela serial
50 if ((millis()-t) > 1000)
51 {
Serial.print(millis()/1000);
52 Serial.print(",");
53 Serial.print(PresentValue);
54 Serial.print(",");
55 Serial.println(ManipulatedValue);
56 t=millis();
}
57 delay(300);
58 }
59
60
61
62
63
64
65
66
67
68
Esse exemplo bem simples, e mostra como, usando-se a biblioteca pid_v1.h, fica fcil a
gente implementar esse tipo de controle nos nossos projetos, ou seja, o pulo do gato est em
entender o que se quer do PID e escolher as constantes certas para obter o resultado
desejado.

Um outro exemplo, combinando o controle por TRIAC e o PID, segue abaixo. Esse circuito
"junta tudo": combina os primeiros posts de controle de potncia com os post de PID, num
circuito sofisticado e prtico para controle em geral, indo de aplicaes de controle de processo
propriamente dito at robtica, por exemplo, um simples robozinho segue-faixa pode ser muito
beneficiado pelo uso desse tipo de algoritmo.

Para terminar, resolvi escrever sobre esse assunto porque no achei na net bons textos
prticos em portugus sobre ele. Alis, nem em ingls eu vi algo que fosse simples mas ao
mesmo tempo descrevesse com rigor os conceitos envolvidos, por isso resolvi dedicar um
tempo a isso.

Espero que essa srie posts, que tomou mais de um ms para ser feita, seja til a vcs. Por
favor, escrevam sobre o que acharam, para que eu tenha o feedback de como me sa nessa
empreitada. Abracadabrao!

?
1 #include "PID_v1.h"
2
3 // Carga (pino onde ser aplicado o output)
4 #define OutputPin 3
5
// Constantes do PID
6 #define kp 50
7 #define ki 10
8 #define kd 0
9
10 // Variveis do PID: a nomenclatura a mesma descrita no post III
11 double SetPoint, PresentValue, ManipulatedValue;
12
13 // O ltimo parmetro indica se o controle inversa ou
// diretamente proporcional, ou seja, se a uma alterao do PV
14 // deve corresponder uma alterao de mesmo sinal (DIRECT) ou
15 // de sinal trocado (REVERSE).
16 PID pid(&PresentValue, &ManipulatedValue, &SetPoint, kp, ki, kd,
17 DIRECT);
18
volatile int power = 100;
19
20 long t;
21
22 void setup()
23 {
24 Serial.begin(9600);
25 pinMode(OutputPin, OUTPUT);
attachInterrupt(0, zero_crosss_int, RISING);
26 // Os valores 10 e 240 foram definidos empiricamente usando-se
27 // o osciloscpio para ver onde o controle da onda estvel.
28 pid.SetOutputLimits(10, 240);
29 pid.SetMode(AUTOMATIC);
SetPoint=60;
30 t=millis();
31 }
32
33 void zero_crosss_int()
34 {
35 // Clculo do ngulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
// (8333us - 8.33us) / 256 = 32 (aprox).
36 // Ou seja, cada 1 unidade em power corresponde a 32 microssegundos
37 // na onda de meio ciclo.
38 int powertime = (32*(256-power));
39 // Mantm o circuito desligado por powertime microssegundos
40 delayMicroseconds(powertime);
// Envia sinal ao TRIAC para que ele passe a conduzir
41 digitalWrite(loadR, HIGH);
42 // Espera alguns microssegundos para que o TRIAC perceba o pulso
43 delayMicroseconds(8.33);
44 // Desliga o pulso
digitalWrite(loadR, LOW);
45 }
46
47
48 // Funo que l o PV. uma funo que l a sada
49 // de um LM35 cinco vezes e acumula, depois tirando a mdia das
50 // 5 leituras e calculando a temperatura em C.
51 int GetTemp(int sensor)
{
52 float temp = 0;
53 for(int i=0; i< 5;i++)
54 {
55 temp += analogRead(sensor);
delay(20);
56 }
57 temp = (temp * 0.48875855)/5;
58 return (int)temp;
59 }
60
void loop()
61 {
62 float temp = GetTemp(A0);
PresentValue=temp;// Calcula o valor manipulado
63 pid.Compute();
64 // Valor de power, que vai ser usado em
65 // zero_crosss_int() para atuar no processo.
66 power = ManipulatedValue;
// Exibe os valores usados de 1 em 1s.
67 if ((millis()-t) > 1000)
68 {
69 Serial.print(millis()/1000);
70 Serial.print(",");
71 Serial.print(PresentValue);
Serial.print(",");
72 Serial.println(ManipulatedValue);
73 t=millis();
74 }
75 delay(300);
}
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Postado por Mauro Assis s 16:24

Вам также может понравиться