Já resenhei o livro Feedback Control mas ainda não deixei de pensar nele; o assunto merece um texto mais elaborado. Uma falta que este artigo pretende suprir.
Feedback é um mecanismo poderoso de controle. Para começo de conversa, nosso próprio corpo tem inúmeras instâncias de controle deste gênero. Sentimos fome quando a glicose do sangue baixa. Comemos, a glicose sobe e nos sentimos saciados. (E é por isso que comer porcaria vicia tanto!). Sentimos sede quando algum sensor corpóreo detecta salinidade acima da normal, e os rins funcionam mais quando o sangue tem salinidade abaixo da normal.
E por aí vai. Papai do Céu e/ou Darwin gostam de feedback e têm lançado mão dele muito antes dos engenheiros. O grande mérito do feedback é funcionar mesmo quando o sistema a que ele serve não é conhecido em 100% dos detalhes. O mecanismo da fome é o mesmo para um bebê e para um gigante e funciona para os dois.
Mas como biologia não é nosso forte, uma ilustração melhor é um sistema bem mais simples: uma caixa d'água, com a bóia que controla um registro. Independente da vazão de entrada, do consumo de água na casa, do tamanho da caixa, da bitola do registro-bóia, o mecanismo funciona bem em qualquer situação. É claro, ele não faz milagres (e.g. se a caixa d'água estiver em São Paulo).
É difícil pensar em algo melhor. Talvez a bóia pudesse abrir apenas quando a caixa estivesse sensivelmente mais vazia, para evitar aquele ruído shhhhh à noite só porque alguém escovou os dentes, mas não vale o esforço.
Ainda relacionado à água, temos um aparelho bem mais interessante em termos de controle: o aquecedor a gás.
O aparelho da Figura 1 é o que me serve no momento. É um modelo razoável, não é nem de longe o mais barato da loja, só tem o grave defeito de não funcionar caso falte energia (irônico, né). Modelos mais avançados têm bateria interna para esta eventualidade.
Aquecedores antigos e chuveiros elétricos delegam o feedback para o usuário: controlando a vazão de água, controla-se a temperatura. A capacidade de aquecimento desses aparelhos é fixa, o único automatismo é desligar quando o fluxo de água é zero ou muito baixo.
Já o aquecedor da Figura 1 permite escolher a temperatura digitalmente, como se fosse um ar-condicionado. É bacana, porque você coloca na temperatura ideal (38 graus) e usa só água quente. Evita o risco de uma criança se queimar, como em lugares onde a água quente vem sempre a 60 graus.
Ele só não é muito preciso. A peculiaridade é a seguinte: no verão, colocar o termostato em 38 graus funciona conforme o esperado. Conforme chega outono e inverno, é preciso subir o termostato para 39, 40 e até 41 graus para a água não ficar fria. Por quê?
Há duas formas de implementar o controle de temperatura do aquecedor.
Uma forma, sem feedback, é medir a temperatura de entrada da água, o volume da vazão, e queimar gás suficiente para elevar a água à temperatura desejada. O poder calorífero do gás tem de ser conhecido de antemão, e o controle de vazão do gás tem de ser perfeito — o que implica que a pressão da linha de gás seja exata e conhecida, ou então medida. São quatro ou cinco sensores, e uma válvula de precisão. Um sensor de temperatura de saída de água ainda seria necessário para confirmar que o mecanismo está ok.
A outra forma, com feedback, é medir a temperatura de saída da água. Se estiver quente demais, fechar a válvula. Se estiver fria demais, abrir a válvula. Vá fazendo o ajuste até estabilizar. Basta um sensor (dois, para garantir que não saia água quente demais em caso de avaria) e uma válvula variável comum.
Certamente a segunda forma é mais barata, funcionará quase tão bem quanto a primeira, talvez até melhor se alguma coisa estiver errada (e.g. gás com pressão fora do normal).
Para fazer controle por feedback precisamos definir duas variáveis cruciais: o erro e a resposta ao erro.
No caso do aquecedor, o erro é a diferença entre a temperatura de saída desejada, e a observada. Por exemplo, se a água sai a 36 graus e o usuário configurou 38, o erro é igual a 2. Como o aquecedor só aquece, não refrigera, é mais fácil considerar "água fria demais" como um erro positivo.
E a resposta ao erro é, naturalmente, a quantidade de gás liberada para o queimador. Quanto maior o erro, mais gás é queimado. Caso o erro torne-se negativo (e.g. água saindo a mais de 38 graus) o gás é diminuído ou até cortado.
Muito provavelmente, o controle daquele aquecedor é implementado com base no modelo "P", que significa "proporcional".
P = peso, ou ganho, da proporcionalidade (constante) resposta = erro x P
No quadro abaixo, há um simulador de aquecedor, onde você pode controlar a vazão de água e a temperatura de entrada.
Vazão |
0.0 L/min |
Temperatura de saída
---°C
Consumo de gás --- kBTU/h |
Temp. água fria |
20.0°C | |
Temp. alvo | 38.0°C | |
O gráfico de temperaturas mostra apenas temperaturas entre 35 e 41 graus, três graus acima ou abaixo do alvo. Temperaturas fora desta faixa são altamente desconfortáveis e o controle nunca deveria permitir que a água ficasse fora destes limites.
O simulador acima foi configurado para funcionar razoavelmente bem com uma vazão entre 5 e 15 litros por minuto. A constante "P" é unitária, ou seja, a resposta é queimar 1 kBTU por minuto de gás (60 kBTU/h) para cada grau de erro.
A propósito, BTU é uma unidade de trabalho ainda muito utilizada para gases. Por exemplo, a unidade de negociação do metano é MBTU (milhão de BTU). Queimar 60 kBTU por hora equivale a uma potência aproximada de 18kWh. O aquecedor da simulação está limitado a 200 kBTU/h.
Se brincarmos o suficiente com o simulador acima, vamos notar alguns problemas:
O meu aquecedor da vida real evita o primeiro problema; ele simplesmente não liga quando a vazão é muito baixa. Mas apresenta o segundo problema, e por aí eu deduzo que ele tem um controlador "P".
Este segundo problema, denominado "droop" na literatura técnica, é inerente a este tipo de controlador. Podemos aumentar o ganho P, o que amplifica a resposta ao erro. Isto melhora o funcionamento do aquecedor quando a vazão é grande, mas aumenta a oscilação para vazão pequena.
A constante P tem de ser bem calibrada para o "uso típico" do equipamento, sem causar acidentes em usos atípicos e para que o "droop" não incomode no uso normal.
Precisamos falar um pouquinho sobre como a simulação foi desenvolvida. Você pode procurar o fonte na página, vou colocar apenas uns highlights aqui.
Calcular o aumento esperado de temperatura da água é fácil, basta dividir trabalho por vazão, convertendo BTUs em calorias, etc. Mas a água dentro do aquecedor não esquenta instantaneamente, então a temperatura "real" muda suavemente, segundo uma média móvel.
Este é certamente o ponto mais "fraco" do meu simulador, porque eu chutei um fator para a média móvel. Mas isto já é muito mais próximo da realidade que média nenhuma.
A média móvel da temperatura dá causa às oscilações, porque o erro (temperatura desejada menos real) muda de forma atrasada em relação à resposta (gás sendo queimado), O controlador do aquecedor da vida real também enfrenta este problema.
Outro fator que foi simulado é a abertura e fechamento do gás. O aquecedor não pode liberar ou cortar gás muito rápido, sob pena de apagar a chama, ou coisas piores. Além do mais, nenhuma válvula abre ou fecha instantaneamente. No nosso simulador, a variação é limitada em 25 kBTU por segundo, o que também dá causa a oscilações.
Um sistema tipo "P" teoricamente não oscila, mas o simulador acima mostra que ele pode oscilar bastante quando utilizado em condições extremas (pouquíssimo fluxo de água).
Por último, vale lembrar que o registro-bóia da caixa d'água também é um controlador "P". A principal diferença é a inexistência de proporcionalidade. O registro só pode estar ligado ou desligado, e liga quando o erro passa de um certo patamar (detectado pela bóia abaixo de certo nível).
Agora, vamos consertar o problema do meu aquecedor. Apresento o aquecedor com controlador PI, fique à vontade para brincar:
Vazão |
0.0 L/min |
Temperatura de saída
---°C
Consumo de gás --- kBTU/h |
Temp. água fria |
20.0°C | |
Temp. alvo | 38.0°C | |
Este aquecedor também oscila com vazão muito baixa, porém ele consegue entregar água a 38 graus cravados a partir de 3 litros/min até uns 46 litros/min, quando a capacidade máxima de queima (200 kBTU/h) é atingida.
No controlador PI a resposta é:
P = peso ou ganho de proporcionalidade (constante) I = peso ou ganho de integração (constante) Σerro = somatório ou integral do erro resposta = erro x P + Σerro x I
Em sistemas digitais temos de usar somatório em vez de integral, porque o erro só é calculado em intervalos discretos (5 vezes por segundo, no nosso simulador). Deve-se escalar o somatório de acordo com a freqüência de amostragem (somar 100 vezes por segundo deve atingir um valor semelhante ao que seria obtido somando-se 5 vezes por segundo, e não 20 vezes maior!).
O controlador PI consegue sanar o "droop" porque, mesmo na ausência de erro no presente momento, ele "lembra" dos erros persistentes anteriores. A integral tende a acumular apenas o suficiente para manter o erro em zero; se a resposta for excessiva, o erro passa a ser negativo e a integral decresce, sanando novamente o desvio.
Assim como dissemos antes que o atraso no aquecimento da água em relação à liberação de gás provoca oscilações, o controlador PI também pode e vai oscilar devido ao fator integral. Seja por testes empíricos ou por análise matemática, os fatores P e I tem de ser muito bem escolhidos.
No caso do nosso simulador de aquecedor PI, os fatores são P=0.5 e I=0.1, escolhidos por tentativa e erro. De maneira geral, o fator P sempre deve carregar o maior fardo do controle. Apesar do fator I operar milagres, ele causa oscilações violentas quando é preponderante.
O controlador PI é utilizado em 80% dos casos, porque ele responde suficientemente bem. É difícil justificar a complexidade adicional do controlador PID, que veremos mais à frente.
O controlador PI tem um grande problema: o travamento ou windup, causado por uma acumulação excessiva da integral. Neste caso, o controlador emite uma resposta completamente inaequada ao erro atual, e só se recupera quando amostras suficientes do novo erro são integradas. E isto pode demorar demais.
Isto acontece quando:
Imagine uma caixa d'água que transborda porque no dia anterior faltou água. Isto seria ridículo, e talvez desastroso. É preciso evitar este problema a qualquer custo!
No nosso simulador, este erro pode ser provocado subindo a vazão para mais de 50 litros/min, deixando por um minuto ou dois, e depois diminuindo para 10 L/min ou menos. A água ficará quente demais por um tempo, e fria demais num segundo momento (o windup acontece nos dois sentidos).
A solução que deve ser implementada para evitar o windup é é limitar o valor absoluto da integral a um patamar razoável, suficiente para compensar o "droop" no uso normal.
Uma proteção adicional é não integrar erros excessivamente grandes, e mesmo fazer I=0 nesta situação, efetivamente fazendo um "rebaixamento" de controlador PI para P quando há alguma anormalidade.
Estas proteções não foram implementadas em nosso simulador justamente para que o windup e as oscilações iniciais violentas ao "ligar o aquecedor" pudessem ser observadas por você.
Já usamos o erro e a integral do erro, agora falta o quê? Usar a derivada do erro!
P = peso ou ganho de proporcionalidade (constante) I = peso ou ganho de integração (constante) D = peso ou ganho de diferenciação (constante) Σerro = somatório ou integral do erro Δerro = diferença ou derivada do erro resposta = erro x P + Σerro x I + Δerro x D
Segue um simulador de aquecedor PID, com fatores P=0.4, I=0.0833 e D=0.1.
Vazão |
0.0 L/min |
Temperatura de saída
---°C
Consumo de gás --- kBTU/h |
Temp. água fria |
20.0°C | |
Temp. alvo | 38.0°C | |
De maneira geral, o aquecedor PID não é tão melhor que o aquecedor PI. Ele também oscila muito com baixo volume de água (e.g. 1 litro/seg). No patamar de 3 litros/segundo, o PID atinge a estabilidade enquanto o PI ainda oscila bastante.
O fator D atua como especulador, que tenta vislumbrar para onde o erro está indo, e muda a resposta de acordo:
Em sistemas digitais, assim como substituímos integral por somatório, substituímos derivada por diferença entre o erro atual e o anterior, devidamente escalado pela taxa de amostragem.
Embora o fator D atue como freio, ele pode causar problemas bem grandes também. Se aparecer um valor astronômico de erro, causado e.g. por algum ruído, isto significa uma diferença/derivada também astronômica, causando uma resposta exagerada, e errada. (Controladores PI lidam melhor com ruídos porque a integral funciona como uma média móvel.)
Em qualquer implementação prática de um controlador PID, a derivada do erro precisa ser "amaciada", usando-se um filtro passa-baixas, como uma média móvel. Isto evita respostas violentas a ruídos e oscilações bruscas.
Porém isto introduz mais uma variável para calibrar: a constante de tempo desta media móvel da derivada. O tempo não pode ser muito longo, sob pena de perder a utilidade da derivada que é justamente fazer previsões de curto prazo. Tempo muito curto deixa passar ruídos. A definição do "tempo ideal" vai depender da aplicação.
Fora isto, calibrar um controlador PID é complicado; muito mais que o controlador PI. Por isso ele só é empregado quando realmente necessário, e estima-se que boa parte dos controladores PID em operação seja inadequada.
Um "defeito" dos simuladores anteriores é que eles tinham pesos fixos. O simulador a seguir emprega um controlador PID com pesos alteráveis. Você vai descobrir por si mesmo que é bastante difícil chegar a pesos razoáveis. Para colocar este simulador em modo PI ou P, basta zerar o peso D, ou I e D, respectivamente.
Vazão |
0.0 L/min |
Temperatura de saída
---°C
Consumo de gás --- kBTU/h |
Temp. água fria |
20.0°C | |
Temp. alvo | 38.0°C | |
Peso P | ||
Peso I | ||
Peso D | ||
Sistemas baseados em feedback, dos quais um controlador PID é parte integrante, são naturalmente representados por equações diferenciais. O controlador influencia a taxa de erro, e o erro influencia o controlador, então indiretamente o controlador influencia a si mesmo, como um cachorro correndo atrás do rabo.
Uma simples xícara de café é um sistema de feedback negativo (sem controlador), porque a taxa de resfriamento é proporcional à temperatura, mas a própria temperatura cai de acordo com a taxa de resfriamento.
A transformada de Laplace é uma ferramenta muito útil para lidar com equações diferenciais, porque a versão transformada é muito mais simples de resolver. Integrais viram divisões, derivadas viram multiplicações, etc. Na verdade, muitos métodos práticos de resolver equações diferencias só podem ser provados de forma rigorosa usando Laplace.
Antigamente não havia computadores para fazer simulações; e Laplace era o que o povo tinha para "testar" um sistema. A verificação teórica, quando necessária, ainda é feita desta forma.
Começando com a equação diferencial da xícara de café:
y(t) = temperatura do café (acima da temp. ambiente) y0 = y(0) = temperatura inicial = uma constante dy/dt = taxa de variação da temperatura no tempo c = constante de transferência térmica dy/dt = -y(t).c dy/dt + y(t).c = 0 Transformada de Laplace (feita com base em tabelas) [ s.Y(s) - y0 ] + c.Y(s) = 0 Manipulando no domínio da "frequência" (s), que tomou o lugar do tempo (t): (s + c).Y(s) = y0 Y(s) = y0 / (s + c) Transformada inversa de Laplace (feita com base em tabelas) y(t) = y0.exp(-c.t)
Resolvemos a equação diferencial usando apenas álgebra. Até a condição inicial do sistema (y0, temperatura inicial do café), que sempre dá trabalho evidenciar numa equação diferencial, aparece "magicamente" quando fazemos a transformada da derivada.
Note que a equação Laplace tinha um "pólo", ou seja, um ponto em que ela tendia a infinito, para um certo valor negativo de "s":
Y(s) = y0 / (s + c) se s = -c, Y(s) = y0 / (c - c) = infinito
Este pólo transformou-se num exponencial negativo no resultado final. Isto significa que y(t) tende a zero, e o café tende à temperatura ambiente. Se o pólo fosse positivo, a transformada inversa teria um exponencial positivo.
Um sistema com feedback depende da sua própria saída, e pode ser modelado da seguinte forma:
C = controlador R = dispositivo (e.g. aquecedor) y = saída (temperatura da água quente) r = temperatura desejada e = erro = r - y y = R(C(e)) y = R(C(r - y))
Presumindo que tanto o controlador quanto a planta sejam lineares, ou seja, apenas multipliquem o erro por um certo valor (que não precisa ser constante ao longo do tempo), a equação pode ser trabalhada para:
y = R.C.r - R.C.y y.(1 + R.C) = R.C.r y = r . [ R.C / (1 + R.C) ]
Este resultado já nos diz muito como um sistema baseado em feedback funciona. Por exemplo, se o controlador C for do tipo P, C é uma constante invariável no tempo, e a fórmula acima só pode tender a "r", nunca alcançá-lo.
Esta é a justificação matemática do desempenho imperfeito do nosso aquecedor tipo P conforme aumenta a vazão de água. Pelo menos o controlador é inerentemente estável para qualquer valor de C.
Em Laplace, a função de transferência de r para y (ou seja, o cálculo que ocorre entre o usuário escolher uma temperatura e a água quente sair) é
T(s) = R(s).C(s) / (1 + R(s).C(s))
A função de transferência do aquecedor R(s) é muito simples:
v = vazão de água R(s) = 1/v
Vejamos agora um controlador PI, e como ele se encaixa no sistema T(s):
Controlador PI em Laplace: C(s) = P + I/s T(s) = R(s).[P + I/s] / [ 1 + R(s).(P + I/s) ] desprezando R(s) por ser constante se vazão for constante T(s) = [ P + I/s ] / [ 1 + P + I/s ] T(s) = [ Ps + I ] / [ s + Ps + I ]
O sistema acima consegue emtir respostas maiores que 1, ou seja, consegue dar feedback positivo mesmo na ausência de erro. Isto é possível quando "s" é negativo (a variável "s" pode assumir qualquer valor complexo em Laplace). No sistema com controlador P, a variável "s" não aparecia no denominador, o que impedia uma resposta maior que 1.
Também é possível verificar a estabilidade do sistema, achando os pólos da equação acima, ou seja, os pontos onde o denominador de T(s) tende a zero e portanto T(s) tende ao infinito.
O sistema com controlador PI da equação acima tem um pólo quando "s" é negativo e igual a -I/(1 + P). Um sistema só é estável quando todos os pólos estão no campo negativo. A parte imaginária pode ter valores positivos ou negativos; um pólo de valor complexo indica que o sistema oscila.
Como as constantes I e P são sempre positivas, o pólo localizado em -I(1 + P) é sempre negativo, então o sistema é inerentemente estável.
Um pólo de valor real positivo significaria um sistema instável porque, quando a fórmula sofre a transformada inversa de Laplace, ela apresentaria um exponencial positivo, que cresce sem limite. E pólos com valores complexos tornam-se funções senoidais, que oscilam periodicamente, que são tolerados, mas normalmente não são desejados.
Pólos negativos tornam-se exponenciais negativos, que diminuem com o tempo e convergem para algum valor. (Vide a equação do café, que tinha um único pólo negativo e real.) Esta convergência é exatamente o que desejamos de um controlador.
Agora, vamos melhorar o nosso modelo de sistema R(s) que era muito simplista. Vamos levar em conta o atraso entre o fogo mudar de intensidade e a água mudar de temperatura. Isto é simples de fazer em Laplace:
v = vazão de água a = atraso na resposta função-atraso = exp(-s.a)/s R(s) = 1/v . exp(-s.a) = exp(-s.a)/v
Voltando ao controlador P, mas desta vez usando o modelo R(s) melhorado:
R(s) = exp(-s.a)/v T(s) = [ P . exp(-s.a) / v ] / [ 1 + P . exp(-s.a) / v ] T(s) = [ P . exp(-s.a) ] / [ v + P . exp(-s.a) ]
P é apenas uma constante, mas "s" agora está na equação devido ao efeito do atraso, então o comportamento do sistema vai ser mais complexo.
Analisando o denominador, concluímos que ele só pode ser zero se "s" for complexo, com um valor imaginário igual a πi. A parte real do pólo depende de "a", "P" e "v", e infelizmente pode ser positiva para valores "ruins" destas constantes.
Em particular para todas as constantes iguais a 1, o pólo tem valor real zero (marginalmente estável). Escolher um ganho P maior que 1 joga o pólo para o lado positivo.
Agora, revisitamos o sistema PI considerando o dispositivo R(s) aprimorado:
R(s) = exp(-s.a)/v T(s) = R(s).[P + I/s] / [ 1 + R(s).(P + I/s) ] = [ exp(-s.a).[P + I/s] / v ] / [ 1 + exp(-s.a).(P + I/s) / v ] = exp(-s.a).[P + I/s] / [v + exp(-s.a).(P + I/s) ]
Este denominador é mais difícil de analisar. Brincando um pouco com planilha ou código, vemos que também pode-se fazer os pólos positivos usando constantes "ruins". Na presença do atraso da resposta, tanto sistemas P quanto PI dependem de calibragem para serem estáveis.
Como um valor de "P" muito alto é problemático para a estabilidade, o controlador PI acaba sendo mais estável pois permite usar um peso "P" menor, e o "droop" que seria mais acentuado é sanado pelo "I".
Lidar com transformada de Laplace é bem mais complicado que fazer simulações. Normalmente, os parâmetros de um controlador PID vão ser escolhidos com base em simulações, testes empíricos e/ou fórmulas prontas. O ponto aqui era mostrar que é possível determinar de forma matematicamente rigorosa por que um controlador PID funciona, e em que condições ele vai funcionar bem.