14 Comentários

Controlador PID digital, uma modelagem prática para microcontroladores - Parte 2

controlador PID digital
Este post faz parte da série Controlador PID digital. Leia também os outros posts da série:

Dando continuidade do ponto em que paramos na primeira parte dessa série, iremos agora modelar um PID digital com uma abordagem um pouco diferente da utilizada para concebermos o compensador descrito no artigo anterior, a ideia aqui é prover um compensador PID que possa ser implementável de forma simples em um processador de uso geral (como foi exposto na parte I dessa série, entenda - se processador de uso geral qualquer microcontrolador que possua pelo menos a instrução de multiplicação por hardware ).

Vamos recapitular?

Ná parte I dessa série, foi explicado o que é um sistema de controle por malha fechada, o porque de seu uso, bem como o compensador do tipo PID (Proporcional - Integral - Derivativo) como sendo um tipo de controlador versátil e aplicado em grande escala em sistemas de controle dos mais variados tipos.

Ainda relembramos que sua expressão toma a forma de uma equação, como a exemplificada a abaixo:

eq1

Onde:

  • Kp : Coeficiente da ação proporcional;
  • Ki : Coeficiente da ação integral;
  • Kd :  Coeficiente da ação derivativa
  • t : Instante do estado a ser processado;
  • u(t) : Sinal de saída do sistema no instante t;
  • e(t) : Sinal de erro na entrada do controlador no instante t.

A partir dessa equação seguida do uso da conhecida transformada de Laplace, obteve - se uma equação muito mais simples que a exemplificada acima de forma que poderia ser concebido um circuito eletrônico para reproduzir o comportamento de um compensador tipo PID.

Em contraponto, para implementar um componente desses via software (em um microcontrolador) , tanto uma equação, quanto a outra, mostram - se muito trabalhosas de serem implementadas, então, utilizando - se de uma abordagem baseada em métodos numéricos, conseguimos conceber uma equação de diferenças facilmente programável em um processador:

eq11

Onde, os parâmetros (constantes) podem ser calculados como segue abaixo:

_eq

Além disso temos :

ti =tempo de integração

td = Tempo de diferenciação.

Também foi adotado um nome denominado aproximação retangular do termo integral, com isso poderia traduzir essa simples equação para um programa que possa ser embarcado no processador a ser utilizado.

Problemas com a aproximação retangular

Apesar do algoritmo por aproximação retangular do termo integral ser versátil e atender uma boa gama de aplicações, alguns problemas começam a surgir a medida que a complexidade do sistema a ser controlado aumenta.

O primeiro e grande problema trata - se da convergência da integral da função de  erro para o valor correto quando o valor prévio dessa função erro é igual a zero, ou quando a diferença entre o erro corrente e o anterior passa a ser muito grande, esse problema poderia ser corrigido aumentando - se o número de iterações para cálculo do termo integral (e não baseado entre dois pontos), porém as custas de eficiência de execução.

Uma outra solução seria aproximar a integral apenas acumulando seu valor, a cada vez que o PID é computado, isso mantém a eficiência da execução de  código, e causa o mesmo efeito do aumento de iterações, entretanto  a acumulação só ocorreria uma única vez a cada valor do PID computado, retornando o problema de convergência lenta nos resultados da integral nos primeiros valores calculados pelo PID, a medida que o processo avança esse efeito vai sendo minimizado.

O outro grande problema desse algoritmo pode ser elucidado com um exemplo prático, considerando um sistema onde o ganho proporcional é algo elevado, e o erro acumulado começa a crescer ou decrescer por longos períodos de tempo, isso pode levar fatalmente o sistema em controle a ter sobressinal (overshoot) com valores elevados, e nos casos mais graves, levar o sistema a uma oscilação permanente. Esse fenômeno é conhecido pelo nome de wind-up , e pode ser minimizado utilizando valores baixos para o ganho integral, somadas a técnicas de saturação do integrador (acumulador no caso da aproximação integral), mas assim, voltamos ao problema de demora de convergência, uma vez que a saturação pode ser entendida como zerar o integrador( ou acumulador).

Temos então alguns inconvenientes com esse algoritmo, então o que pode - ser feito para minimizar os efeitos de convergência e wind-up ? Existem diversas formas de modelar algoritmos de compensadores digitais a partir de circuitos analógicos, ou mesmo a partir de expressões numéricas, o algoritmo que irémos descrever aqui oferece um compensador tipo  PID digital com melhor aproximação.

Compensador PID digital 2 pólos / 2 zeros

Sabendo dos problemas com o primeiro algoritmo podemos proceder com a modelagem de um controlador PID digital mais preciso. Para tal iremos precisar de uma ferramenta matemática bem conhecida por quem já estudou controle digital (ou processamento digital de sinais), a transformada Z.

Eis que essa ferramenta permite traduzir equações de diferença (no domínio do tempo), ou seja aquelas em que dois eventos são separados por um intervalo cujo seu valor é finito e representável numéricamente, e obter uma expressão que toma uma forma muito similar a equações obtidas pela transformada de Laplace para sistemas em tempo contínuo.

Sua definição, é exemplificada na equação abaixo:

eq12

A Equação 1.2, pode intimidar em um primeiro momento, mas observando com atenção podemos notar, que a transformada Z por definição nada mais faz do que tomar uma sequencia de impulsos cujo os instantes de captura são espaçados por um intervalo de tempo, a variável independente n denota o instante da amostragem, de forma que um sinal discreto no tempo pode ser descrito como a sequencia abaixo:

eq4

Assim, uma vez passado para o domínio Z cada instante do sinal esta acompanhado pelo operador complexo ("z") , que denota o deslocamento desse sinal no tempo, de forma simplista a representação do operador z serve para dizer se a amostra é um valor corrente, um valor futuro (preditores e estimadores) ou um valor anterior, esse ultimo de nosso interesse, vejamos:

X(z) z-n:  Amostra atrasada no tempo;

X(z) z0 .'. X(z) :  Amostra corrente;

X(z) zn:  Amostra futura

Apesar da teoria por trás da transformada Z envolver muito mais conceitos, se olharmos ela de uma maneira simplista, podemos utilizar essa simples propriedade (referida como deslocamento no tempo) para realizar um novo controlador PID digital com melhor desempenho que o do artigo anterior.

Agora que já sabemos o que significam os operadores z, vamos mudar um pouco de assunto e retornar ao nosso problema, uma forma de aproximar melhor o termo integral. Além da acumulação, existem diversos métodos numéricos que nos permitem resolver integrais com considerável precisão e intervalos de convergência bem menores, para esse fim, vamos selecionar a regra dos trapézios, com ela podemos resolver uma integral conforme a seguinte equação:

eq13

Uma expressão bem mais simples de resolver, além disso a regra dos trapézios por aproximar a diferença entre dois valores da função f(t) por um aspecto trapezoidal ,  se a taxa de amostragem do sistema for bem escolhida, a convergência para o resultado desejado é muito mais rápida e não sofre com o problema apresentando no primeiro algoritmo desenvolvido.

Ja temos uma nova solução para o nosso termo integral, visto que o derivativo não necessita de modificações, por que usar a transformada Z, porque não partir logo para as contas? Com o uso da transformada Z , poderemos além de reduzir mais a equação final, pré - computar seus coeficientes, e além disso podemos utilizar sua função de transferência em Z para analise em um simulador como o MATLAB por exemplo.

Sabemos que métodos numéricos por natureza, trabalham em um domínio de intervalos discretos, o que é perfeito para nossa aplicação, significa que podemos tomar a transformada Z da equação 1.3? Sim podemos, mas antes vamos mudar as notações para ficarmos mais familiarizados:

eq14

A equação acima encontra - se em uma notação bem mais conveniente para sistema de tempo discreto. Mas agora vem a pergunta, como essa conhecida regra pode ser utilizada para o propósito desse artigo? Vamos considerar o seguinte caso, temos a integral de uma função, essa é o valor x[n], adicionando condições iniciais ou seja a constante de integração chegamos a seguinte relação:

eq5

Tomando a transformada de Laplace e em seguida a transformada Z em ambos os lados da equação temos (Obs. Veja que dentro dos parenteses estamos computando duas derivadas no domínio do tempo contínuo):

eq6

Temos as duas variáveis de interesse, relacionemos s em função de Z:

eq8.1
eq8.2
eq9.1
eq9.2


 

Assim conseguimos relacionar a variável complexa s com a variável de tempo discreto z. Mas antes de aplicar isso ao nosso controle PID, vamos ver como fazer para o termo derivativo. Seguindo a linha de raciocínio numérico para computar uma derivada, temos:

_eq1

Como fizemos para a integral, vamos mudar a notação para o dominio de tempo discreto:

_eq2

Para facilitar a computação vamos atrasar ambas as amostras em uma unidade e representando por x[n], assim obtemos:  

_eq3

Tomemos agora, a transformada de Laplace em seguida a transformada Z do mesmo modo que fizemos para a integral:

_eq4

Algebra, algebra, algebra, eis que leva a:

_eq5

Eis que temos agora uma aproximação para o termo integral, e outra para o termo derivativo. Mas observe que se encontram no domínio da frequência, e o nosso PID está no domínio do tempo, recobremos a equação 1:

eq1

Isso não é um grande problema, primeiro, vamos modificar a equação acima para a forma de uma função de transferência, ou seja o quociente da saída pela entrada do controlador, eis que isso leva a:

_eq10

E finalmente tomamos a transformada de Laplace, da equação acima:

_eq11

O Nosso PID, está com uma equação bem mais amigável, mas ainda encontra se no domínio de tempo contínuo, precisamos agora traduzir essa equação para o domínio de tempo discreto, porém como foi feito em 1.5 e 1.6 agora temos termos em Z que representam S, assim podemos tomar a transformada Z da equação 1.5 substituindo os termos integrais e derivativos:

_eq18

E está feito, um compesandor PID digital, mas ao leitor digo, não se assuste, apesar da equação parecer não fazer muito sentido, ainda mais se tratando da implementação em um processador, ela começará a fazer sentido a medida que ordenarmos melhor os termos, antes de qualquer coisa, vamos desaparecer com os dois denominadores que não contém nenhum z, isso irá ajudar a facilitar as contas. adicionarei dois operadores, h1  e h2 onde:

h1 = Δt/2;

h2 = 1/Δt.

Eis que a nova função de transferência torna - se:

_eq21

A partir desse ponto irei fazer as passagens matemáticas necessárias até obtermos a função de transferência final do nosso compensador, peço ao leitor que acompanhe as passagens com calma:

_eq19

Eis que temos a nossa função de transferência, está bem mais amigável, e permite ja trabalhar nela para formar uma equação de diferenças. Mas antes de prosseguirmos, vamos deixar ainda mais intuitivo para o leitor, observemos:

_eq20

Vamos substituir esses coeficientes, na função de transferência, e vamos notar que nosso PID digital agora nada mais é do que um caso especial de filtro de IIR, possuindo dois pólos e dois zeros, de onde  vem a origem do nome desse algoritmo:

_eq16

Vejam como a matemática é interessante, partimos de uma equação diferencial, colocamos uma integral trapezoidal, uma derivada numérica, usamos duas transformadas, para descobrir que o nosso PID melhor aproximado é um filtro digital de resposta impulsiva infinita. Ou seja existem muitas formas de implementar isso em um microcontrolador, essa mesma equação ja pode ser colocar em um simulador como o MATLAB para avaliar a resposta do sistema a ser controlado.

Colocando dentro de um microcontrolador

Temos a função de transferência em Z perfeitamente usável para simular seu comportamente em um MATLAB ou qualquer outro simulador de sistemas, porém essa função da forma que está não é muito útil, para implementar em qualquer processador que seja, precisamos antes computar uma equação de diferenças a partir da transformada inversa Z , para isso vamos retomar a equação 1.7:

_eq15

Temos os temos de entrada e saida do sistema, coloquemos agora saída em função da entrada:

_eq14

Ja melhorou, certo? Vamos mexer mais um pouquinho, fatorando U(z) e E(z) para “dentro” dos polinômios vamos obter:

_eq13

Mas : a2 = 0, isso simplifica a expressão em:

_eq12

Em função de U(z) vamos obter:

eq7

Interessante, nesse ponto podemos tomar a transformada inversa Z, e surpreendam - se a equação de diferenças se transforma nessa simples expressão:

Como? Sim meu amigo, toda aquela trabalheira de transforma pra cá, transforma pra lá, e usa método numérico, vai gerar essa expressão trivial, prova que para conseguir fazer as cosas simples é necessário pensar. A equação 1.8 é perfeitamente implementável, os coeficientes são facilmente calculáveis, assim podemos traduzir essa equação como, para computar uma nova saída do compensador, precisamos da amostra de saída anterior, e dos três ultimos valores de erro calculados.

Para o leitor mais atento, este, deve ter percebido que o problema de windup do termo integral sequer existe, uma preocupação a menos, apenas escolha se quer trabalhar com ponto fixo ou flutuante e ponha isso dentro do seu processador.

Vamos testar nosso exemplo, vamos embarcar um pequeno firmware para controlar a luminosidade de um LED RGB por malha fechada.

Exemplo em teste

E finalmente chegamos a sessão mais divertida do artigo, a implementação prática, iremos embarcar nosso firmware de teste no seguinte kit de desenvolvimento:

fig1

Figura 1 :Led Booster Pack + Piccolo LaunchPad.

Novamente não iremos entrar em detalhes sobre o Kit ou microcontrolador, mais informações podem ser encontradas no site da Texas, o link está disponibilizado no fim do artigo.

Vamos utilizar o nosso PID digital para controlar uma string de Leds, através da atuação do micrcontrolador em um conversor DC-DC, aliás uma das partes mais interessantes desse kit em especial. Por ser um exemplo simples, optei pelo uso apenas do controle da cadeia de leds vermelhos, usando o controle apenas pela tensão de saída do conversor DC-DC (sim é um boost), consultando a folha de dados desses leds, chegou - se ao valor otimo para estabilização da malha para 19.2[V], valor para obtenção de uma corrente de 25[mA], através de ajuste experimental chegou - se aos coeficientes: Kp = 50, Ki = 15, Kd = 100, a taxa de amostragem ficou situada em 58 mil amostras por segundo e uma frequência de portadora de 150[KHz] permitem o módulo PWM do microcontrolador operar com resolução de 9bits.

Vejamos a imagem abaixo, temos a tensão de barramento perfeitamente controlada pelo microcontrolador, vejamos o comportamento estável dela:

fig2

Figura 2 : Tensão dos barramento da string de leds.

Eis que abaixo temos uma foto da bancada, onde temos os leds sendo controlados pelo microcontrolador, uma das coisas que esse que vos escreve acha mais interessante é a possibilidade do próprio microcontrolador se tornar uma unidade de controle digital, flexível de acordo com a aplicação.

fig3

Figura 3 : Microcontrolador atuando sobre o DC-DC

Apesar da simplicidade do exemplo, o projeto inteiro, encontra - se em um repositório no GitHub, a você leitor deixo a liberdade de usar no próprio C2000 ou portar os arquivos PID.h e PID.c para o microcontrolador de seu interesse, sugiro apenas a alteração dos tipos de acordo com o microcontrolador utilizado, no caso de uso de platformas mais compactas como AVR, e microcontroladores baseados no núcleo Cortex-M0. E para você leitor mais curioso, porquê não explora a equação 1.7 e implementa em seu processador por conta própria? Escrever código em assembly também pode ser uma tarefa extremamente prazerosa.

Conclusão

Assim chegamos ao final dessa pequena série de artigos, e esperamos ter desmistificado alguns conceitos sobre a implementação de compensadores digitais em microcontroladores de quase qualquer natureza. Esperamos ainda que os exemplos fornecidos sejam úteis para aqueles que desejam se aventurar no mundo de controle digital. Conseguimos ainda modelar um simples compensador PID usando a transformada Z de uma forma simples sem se preocupar , demais  e apenas, com a matemática envolvida.

Materiais de apoio

Projeto Exemplo : https://github.com/uLipe/PID_Embarcados_C2000

Microcontroladores C2000 : http://www.ti.com/product/tms320f28027

Led Booster Pack, Kit usado no exemplo: http://www.ti.com/tool/boostxl-c2kled

Referências

CRENSHAW, Jack W. : Math toolkit for real time programming, 2001

MEYRATH, Todd : Multipurpose analog PID controller, 2005

POLEY, Richard : Introduction to digital control using digital signal processors, 2003

STARR, Gregory P. : Introduction to applied digital control , 2006

Outros artigos da série

<< Controlador PID digital: Uma modelagem prática para microcontroladores - Parte 1
Este post faz da série Controlador PID digital. Leia também os outros posts da série:
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Conceito de Engenharia » Controlador PID digital, uma modelagem prática para microcontroladores - Parte 2
Talvez você goste:
Comentários:

14
Deixe um comentário

avatar
9 Comentários
5 Respostas
3 Seguidores
 
Discussão de maior alcance
Discussão mais quente
10 Autores de comentários
jonatasFranciscoVictor RochaVICTOR ROCHA SILVAFelipe Neves Comentários recentes
  Notificações  
recentes antigos mais votados
Notificar
jonatas
Visitante
jonatas

boa tarde felipe
poderia usar artigo para meu tcc
estarei fazendo controle pid digital para motor cc

Francisco
Visitante
Francisco

Ola, estou fazendo um controle de posição usando esta função, acompanhei todas as passagens e fiz todos os cálculos na mão, gostei muito. no meu caso uso 1 saída PWM em uma ponte h com 2 enables que controlam o sentido de giro do motor, a realimentação e referencia por potenciômetro, mas fiquei em duvida quando o erro da valores negativos a função não funciona corretamente, então mudei o código e garanti o erro sempre positivo, e uma logica para escolher o sentido do motor. faz sentido isso?

VICTOR ROCHA SILVA
Visitante
VICTOR ROCHA SILVA

Boa tarde Felipe, Estou implementando um controlador PID, na primeira implementação utilizei a primeira aproximação, onde podemos encontrar problemas om windup... Agora, aprimorando minha implementação, encontrei seu post onde utilizou outros métodos de aproximação de tempo discreto de forma integrada, tal como fez com os métodos de Tustin e o retangular para trás. Ainda não implementei utilizando essas informações novas, porém irei fazer em breve. Mas uma breve dúvida, o termo -u[n-1]a1 que implementado seria uma soma de u[n-1]. Quando o erro for zero os outros termos serão zero porém o termo u[n-1] não e o mesmo faria que u[n]… Leia mais »

Victor Rocha
Membro
Victor Rocha

Agradeço pelo resposta, conseguiu esclarecer as coisas por aqui e até me deu algumas ideias de lógica para o código do meu sistema...

Outra pergunta, já teve que modelar alguns sensores? Se sim, quais métodos achou mais precisos? Se puder contar alguma experiência tbm é válido 😀

Geraldo Gomes
Visitante
Geraldo Gomes

A passagem em que a equação foi dividida por e(t) esta errada tanto é que teríamos d1/dt=0 e a integral de "1" seria "t".

Eduardo Scherrer
Visitante
Eduardo C. Scherrer

Olá Felipe,
Faz um certo tempo que você subiu este post, que por sinal é excelente.
Fiz a implementação do seu algoritmo em um cortex-M0, porém estou tentado fazer a sintonia. Segundo uma resposta sua à um comentário, você utilizou o método Ziegler-Nichols. Busquei material sobre o assunto e encontrei uma tabela para achar os coefientes, porém para os blocos de Integral e Derivativo, são utlizados períodos (T) ao invés de constantes (K) como você implementou.
Você tem algum material, ou poderia passar como achou as constantes para o seu algoritmo?

Obrigado

Eduardo Scherrer

trackback

[…] Controlador PID digital, uma modelagem prática para microcontroladores – Parte 2, de minha autoria; […]

trackback

[…] Controlador PID digital, uma modelagem prática para microcontroladores – Parte 2,  escrito  por  Felipe Neves; […]

Bruno Albrecht
Visitante
Bruno L. Albrecht

a equação 1.8 tem um erro. o último termo é -u[n-1].a_1.
gostei da implementação, mas algumas duvidas:
o que acontece se o erro for positivo ou negativo por muito tempo?
como escolher o tempo de amostragem?
como sintonizou o controlador?

as duas últimas perguntas podem ser respondidas em um novo artigo

Felipe Neves
Visitante
Felipe Neves

Bruno, obrigado pelos comentários, corrigido, ainda estou patinando nesse editor de equações 🙂 A implementação oferece um bom balanço em termos de precisão e desempenho, se o processador oferecer multiplicação e acumulação de forma nativa, com um pouco de coragem do programador a implementação fica bastante rápida. Sobre o erro, veja que o que temos aqui é um filtro IIR, ou seja esse PID tem características de ser estável sob determinadas condições, de um modo geral prever algoritmos de saturação evita que a saída do sistema oscile de modo permanente. Sobre o tempo de amostragem você me deu uma otima… Leia mais »

Gabriel Gomes
Visitante
Gabriel Gomes

Parabéns mais uma vez!!!

Não conhecia as vantagens da implementação do PID através da transformada Z.
Esse artigo será de grande valia para meus projetos!
Muito obrigado!

Felipe Neves
Visitante
Felipe Neves

Gabriel, obrigado pelo comentário.

Espero que essa forma de implementação lhe tenha ficado claro, mas qualquer dúvida fique a vontade em questionar.

Bons projetos.

Abs.

Séries



Outros da Série

Menu