Introdução
Neste artigo serão apresentados alguns aspectos teóricos a respeito de sistemas dinâmicos. Será, também, implementado um controlador PID digital utilizando a placa de desenvolvimento FRDM KL25Z e o FreeRTOS.
Controladores
Os controladores são estruturas que visam garantir que uma variável conhecida de um sistema dinâmico tenha seu valor final constante e igual a um valor previamente desejado.
São exemplos de sistemas dinâmicos circuitos elétricos contendo resistores, capacitores e indutores, sistemas mecânicos massa-mola, etc. Nas aplicações reais, são encontrados sistemas cujas variáveis deseja-se controlar, tais como a temperatura de processos, a velocidade de automóveis, ou posicionamento de satélites.
Uma das abordagens clássicas dos sistemas dinâmicos propõe, para identificação de suas características, buscar uma representação que relacione suas variáveis. Estas são, normalmente, entrada e saída. É utilizada, então, conforme discutido no artigo anterior, a função de transferência.
Modelagem de um Circuito RLC
No domínio da frequência complexa (Laplace), as impedâncias de resistores (de resistência R), indutores (de indutância L) e capacitores (de capacitância C) são apresentadas a seguir:
Um circuito RLC, que possui como sinal de saída a tensão sobre o capacitor, podem ser modelados utilizando estes conceitos. A Figura 1 a seguir representa este circuito.

A função de transferência consiste em relacionar os sinais de entrada e saída, X e Y. Substituindo os componentes por suas respectivas impedâncias e aplicando a lei do divisor de tensão, a seguinte equação é obtida:
Este é, então um sistema dinâmico de segunda ordem, já que o polinômio do denominador da função de transferência tem ordem quadrática.
Especificações de Desempenho para Sistemas de Segunda Ordem
As raízes do polinômio característico da função de transferência (denominador), são chamadas polo. A posição dos polos influencia diretamente no comportamento do sistema. Um polo positivo é responsável por levar o sistema à instabilidade, por exemplo. A presença de polos mistos (com parte real e parte imaginária) adicionam oscilações amortecidas à sua resposta.
Um sistema de segunda ordem possui dois polos e é representado genericamente da maneira a seguir:
Os valores assumidos pelo fator de amortecimento influem diretamente na resposta do sistema. A Figura 2 a seguir relaciona seu valor à resposta ao degrau unitário.

Fonte: NISE, 2011
Para sistemas de segunda ordem subamortecidos são passíveis de serem mensuradas novas especificações de desempenho, como overshoot e tempo de pico.
Overshoot é o valor da ultrapassagem percentual que a forma de onda ultrapassa seu valor em regime permanente. É resultado da seguinte expressão:
Como o overshoot é função apenas do fator de amortecimento, é possível obter o segundo a partir do primeiro.
O tempo de acomodação é o tempo que leva para que as oscilações amortecidas não ultrapassem 2% do valor de regime permanente.
Os polos, ou raízes do denominador, da função de transferência genérica apresentada, são:
Controladores PID
O objetivo dos sistemas de controle é fazer com que o comportamento de certa variável seja rastreado e controlado. A principal estrutura responsável por isso é a realimentação, que consiste em fazer com que o sinal de saída influencie na formação do sinal de controle, retornando para ser comparado com o valor desejado, por exemplo. Este valor desejado é comumente denominado setpoint.
O controle PID é uma técnica de controle em malha fechada que lida com as componentes proporcional, integral e derivativa do sinal de erro. Sua entrada é provinda de uma realimentação negativa, a qual faz a comparação entre o sinal obtido e o sinal desejado. A Figura 3 a seguir exemplifica essa estrutura:

A componente proporcional entrega à saída do controlador, diretamente, um valor proporcional ao erro atual. A parte integral é responsável por eliminar o erro em regime permanente e a derivativa responde às variações no sinal de entrada do controlador, tendo maior influência na resposta transitória, sendo, então, utilizada para reduzir oscilações (OGATA, 2014).
A função de transferência do controlador PID é a seguinte:
Onde Kd é o granho derivativo, Kp o ganho proporcional e Ki o ganho integrativo.
Conversão de um PID Digital
Como discutido anteriormente, os sistemas dinâmicos a serem implementados no microcontrolador são digitais, sendo assim, é necessário realizar a conversão do controlador.
Será utilizado para obter a equação discreta do controlador PID, o método discutido no artigo anterior chamado backward difference. Neste método é feita uma aproximação para a operação de derivação, de modo que a seguinte substituição deve ser feita:
Onte T é o período de amostragem.
Aplicando esta transformação na função de transferência do controlador PID apresentado na seção anterior, a seguinte equação é obtida:
Utilizando a propriedade do atraso, também apresentada no artigo anterior, a seguinte equação, a qual será implementada no microcontrolador, é obtida:
Implementação
Os códigos para implementação do processamento da equação de diferenças do será idêntico ao apresentado no artigo anterior, apenas com algumas observações.
#include "FreeRTOS.h"
#include "Task.h"
#include "Sistema.h"
#include "adc.h"
#include "dac.h"
void sistema (void *p){
dacInit();
adcInit();
initSist();
TickType_t wakeTime = xTaskGetTickCount();
uint16_t entrada, saida;
while (1){
vTaskDelayUntil(&wakeTime, getTs()*configTICK_RATE_HZ/1000); //getTs em ms
entrada = adcRead(PT_B0);
saida = equacaoDiff(entrada >> 4); //Reduz a resolução de 16 para 12 bits
dacWrite(saida); //12 bits
}
}
int main(void) {
xTaskCreate(sistema, "sistema_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
O arquivo principal não sofrerá alterações. Na função principal é feita a criação da tarefa e início do agendador do sistemas operacional. Na task sistema são inicializados os conversores AD e DA, os parâmetros da equação e, no loop principal, aguardado o período de amostragem, realizada a leitura da entrada analógica e escrita da saída.
O arquivo que representa o sistema dinâmico sofrerá algumas alterações.
#include "Sistema.h"
float ts = 8/1000; //8 ms
#define kd 0.006404
#define kp 1.274
#define ki 52.8
uint16_t setpoint = 1241;
#define MAXCOEF 3
int16_t entrada[MAXCOEF], saida[MAXCOEF];
int16_t atual = 0;
#define MAX_X 3
float coefx[MAX_X] = {kp + ki * ts + kd / ts,(-1) * (kp + 2 * kd / ts),kd / ts};
#define MAX_Y 3
float coefy[MAX_Y] = {1,-1,0};
void initSist(){
uint8_t i;
for (i = 0; i < MAXCOEF; i++){
entrada[i] = 0;
saida[i] = 0;
}
atual = 0;
}
uint16_t getTs(){
return ts;
}
uint16_t equacaoDiff(uint16_t x){
uint8_t i;
int16_t anterior;
uint32_t y = 0;
entrada[atual] = setpoint - x; //Realimentação
for (i = 0; i < MAX_X; i++){
anterior = atual - i;
if (anterior < 0){
anterior+= MAXCOEF;
}
y+=entrada[anterior]*coefx[i];
}
for (i = 1; i < MAX_Y; i++){
anterior = atual - i;
if (anterior < 0){
anterior+= MAXCOEF;
}
y-=saida[anterior]*coefy[i];
}
saida[atual] = y;
atual ++;
atual%=MAXCOEF;
return (int16_t)y;
}
Foi necessário adicionar as declarações dos parâmetros do controlador, float kd, kp e ki. Além disso, estes parâmetros foram utilizados para atualizar os coeficientes da equação utilizando a expressão apresentada no fim da seção anterior.
Uma variável foi criada para armazenar o setpoint, que é o valor final desejado para o sistema. A entrada do sistema dinâmico que aqui é o controlador PID será, então, o resultado da realimentação. Isto é feito em entrada[atual] = setpoint – x, onde x é a saída, tensão no capacitor, no exemplo da Figura 1. Desta maneira, a entrada do sistema dinâmico é o próprio sinal de erro.
O valor para o setpoint leva em conta a resolução e os limites do conversor digital-analógico. Ele possui 12 bits de resolução, assim, os valores de 0 a 4095 representam tensões de 0 a 3.3 V.
Testes
Para realizar os testes do controlador PID será utilizado um circuito RLC conforme apresentado anteriormente, o qual possui a seguinte resposta ao degrau unitário:

Este sistema apresenta um overshoot igual a 19.41% e tempo de acomodação igual a 138.4 ms. Conforme apresentado anteriormente é possível, através destes parâmetros, encontrar as constantes e e, por consequência, a função de transferência.
A simulação das respostas foi feita no software Simulink, conforme a Figura 5 a seguir. Os parâmetros do controlador e da planta são correspondentes aos demonstrados anteriormente.

No código apresentado, os parâmetros do controlador são os seguintes:
A simulação de um degrau unitário feita pelo Simulink é apresentada pela Figura 6 a seguir:

Em azul, está representado o sinal de saída, ou tensão no capacitor, de acordo com a Figura 1 e em amarelo o sinal de controle, ou sinal de entrada, tensão X, na Figura 1. A resposta real desse controlador é apresentada na Figura 7 a seguir:

O sistema resultante apresentou um overshoot igual a 25,2%, tempo de acomodação igual a 158 ms e tempo de pico igual a 43 ms. O comportamento foi suficientemente próximo ao simulado, podendo levar a conclusão de que o sistema foi implementado corretamente.
Para ilustrar a contribuição de cada componente do controlador PID, este exemplo será tomado como base de comparação.
Aumento de Kd
Ao aumentar o ganho derivativo, é de se esperar uma redução nas oscilações da resposta final. O controlador foi sintonizado então com o seguintes parâmetros:
A figura a seguir mostra, em amarelo, o sinal de controle, ou entrada do sistema e saída do controlador e, em azul, a saída do sistema.

O sistema apresenta, agora, 21,89% de overshoot e 100 ms de tempo de acomodação. Logo, é possível concluir que o aumento do ganho derivativo resultou na diminuição das oscilações.
Aumento de Kp
Ao aumentar o ganho proporcional esperas-se redução do tempo de pico, e, em contrapartida, aumento das oscilações. O controlador foi sintonizado então com o seguintes parâmetros:

O sistema apresenta, agora, 34,97% de overshoot, tempo de pico igual a 36 ms e 152 ms de tempo de acomodação. Logo, é possível concluir que houve aumento das oscilações e redução do tempo de pico.
Aumento de Ki
Ao aumentar o ganho integrativo esperas-se redução do tempo de pico, e, em contrapartida, aumento das oscilações. O controlador foi sintonizado então com o seguintes parâmetros:

O sistema apresenta, agora, 30,55% de overshoot, tempo de pico igual a 40 ms e 163 ms de tempo de acomodação. Houve, então, aumento das oscilações e uma ligeira diminuição do tempo de pico.
Conclusões
Neste artigo foi implementado um controlador PID digital utilizando a placa de desenvolvimento FRDM KL25Z e o sistema operacional de tempo real FreeRTOS. Os testes e as simulações comprovaram o funcionamento do sistema. A partir da variação dos parâmetros do controlador, foi possível observar o efeito de cada componente
Nos próximos artigos da série serão discutidas maneiras de otimizar o código alterando a forma de representação dos coeficientes utilizando ponto fixo, assim como a implementação de filtros digitais, os quais necessitam maior velocidade de execução.
Todos os códigos podem ser acessados em meu GitHub.
Saiba Mais
USB HID – Human Interface Device Class: Exemplo com a placa FRDM-KL25Z
Webinar Gravado: Implementação de Controle PID com PIC16F1619
Comunicação entre tarefas no FreeRTOS: Filas
RTOS: Um ambiente multi-tarefas para Sistemas Embarcados
Referências
DORF, Richard C.; BISHOP, Robert H. Modern Control Systems. 12. ed. Estados Unidos da América: Prentice Hall, 2011.
NISE, Norman S. Control Systems Engineering. 6. ed. 2011.
OGATA, Katsuhiko. Engenharia de Controle Moderno. 5. ed. São Paulo: Pearson, 2014.




Muito bom o artigo, bem elucidador as comparações de resultados. Parabéns.
Muito obrigado, Rodrigo.
estou tentando entender um pouco sobre controle( pid )o que voce comentou acima me foi de grande valia,pois comecei a entender o conceito de controle pid,,,,obrigado
Muito obrigado, Dakys. Fico feliz em saber que este texto te possibilitou entender esses conceitos.