Aula de 07/04/2025.
Projeto Controladores DigitaisControlador Proporcional limitando e[∞]Acrescentando Ação IntegralControlador PIControlador PI (Opção 1)Projeto do PI (Opção 2)Outros PIsPI usando Contribuição AngularPI mais rápido!?
Recuperando dados da aula passada (arquivo dados.mat):
x>> diary aula_07042025.txt % registra informações em arquivo texto>> load dados>> whoYour variables are:BoG G K OS T ans erro ftmf zeta >> zpk(G) % Recordando eq. da plata 1 ------------------ (s+10) (s+2) (s+1) Continuous-time zero/pole/gain model.A idéia no início desta aula é projetar um Controlador Proporcional e ajustar seu ganho de forma à limitar o erro em regime permanente (em malha-fechada).
Sugere-se uma revisão da Teoria do erro aplicado no projeto de Controladores Proporcionais (aula de 23/09/2021).
Suponha que queira definir o ganho do controlar para limitar erro em 15%.
A planta é um sistema tipo 0:
xxxxxxxxxx>> zpk(BoG) 0.00012224 (z+2.747) (z+0.1903) -------------------------------- (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.Calculando o ganho de posição, :
neste caso:
Calculando apenas o termo :
xxxxxxxxxx>> K_aux = (0.00012224*(1+2.747)*(1+0.1903))/((1-0.9048)*(1-0.8187)*(1-0.3679))K_aux = 0.049973>> % Ou usando função dcgain do MATLAB>> dcgain(BoG) 0.05>> % Valor de y[∞] em regime permanente para e[∞]=15% (entrada degrau)>> 1-15/100 0.85Equação do erro:
considerando os valores neste caso:
xxxxxxxxxx>> Kp_d = (1-0.15)/0.15Kp_d = 5.6667Este é valor necessário (desejado) para o ganho estático de posição.
Mas é definido como:
Neste caso:
Substituindo valor de encontrado antes na equação acima, temos:
Usando MATLAB:
xxxxxxxxxx>> K = Kp_d/dcgain(BoG)K = 113.33Comparando com (ganho máximo permitido para o Controlador Proporcional), notamos que o valor encontrado ainda resulta num sistema estável em MF.
Fechando a malha e terminando com simulação para entrada degrau:
xxxxxxxxxx>> ftmf_K = feedback(K*BoG, 1);>> step(ftmf_K)>> stepinfo(ftmf_K) RiseTime: 0.3 SettlingTime: 6.1 SettlingMin: 0.60898 SettlingMax: 1.289 Overshoot: 51.648 Undershoot: 0 Peak: 1.289 PeakTime: 1>> % Valor de y[∞]:>> dcgain(ftmf_K) 0.85
O overshoot em relação ao degrau (unitário) foi de 29% ().
Próximo passo: zerar erro de regime permanente.
Equação da Ação Integral Pura:
onde a ação integral é caracterizada pelo pólo em .
Usando MATLAB:
xxxxxxxxxx>> C_I = tf(1, [1 -1])C_I = 1 ----- s - 1 Continuous-time transfer function.>> % Ops, como esquecemos de informat o T, MATLAB montou tf no plano-s e não no plano-z>> C_I = tf(1, [1 -1], T)C_I = 1 ----- z - 1 Sample time: 0.1 secondsDiscrete-time transfer function.>> ftma_I = C_I*BoG;>> zpk(ftma_I) 0.00012224 (z+2.747) (z+0.1903) -------------------------------------- (z-1) (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> figure; rlocus(ftma_I)>> axis equal % melhora aparência no plano-z (círculo unitário)
Fazendo "zoom" na região de interesse:
xxxxxxxxxx>> axis([0.7 1.1 -0.25 0.25])>> hold on>> zgrid(zeta,0) % acrescentando linha guia para o zeta correspondento à %OS=15%
xxxxxxxxxx>> % "Sintonizando" controlador>> [K_I,polosMF]=rlocfind(ftma_I)Select a point in the graphics windowselected_point = 0.96845 + 0.049356iK_I = 0.85046polosMF = 0.96854 + 0.049328i 0.96854 - 0.049328i 0.78529 + 0i 0.36907 + 0i>> ftmf_I = feedback(K_I*ftma_I, 1); % fechando a malha>> figure; step(ftmf_I, ftmf_K)>> legend('Integrador Puro (%OS=15%)', 'Proporcional (e[\infty]=15%)')
O erro de regime permanente foi anulado, , mas segundos é muito elevado.
Para "consertar" este efeito, temos que acrescentar ação de controle Proporcional à (pura) ação Integral.
O diagrama de blocos do controlador PI aparece abaixo:

Dedução da eq. do PI, ver Controlador PI (aula de 14/05/2020)
Equação genérica do PI fica:
Surge uma incógnica extra que é: - onde posicionar o zero do PI ()?
Alguma discussão aparece na Aula de 05/05/2021.
Testando 2 opções para :
xxxxxxxxxx>> C_PI1=tf([1 -0.91],[1 -1],T)C_PI1 = z - 0.91 -------- z - 1 Sample time: 0.1 secondsDiscrete-time transfer function.>> ftma_PI1=C_PI1*BoG;>> zpk(ftma_PI1) 0.00012224 (z+2.747) (z-0.91) (z+0.1903) ---------------------------------------- (z-1) (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> figure; rlocus(ftma_PI1)>> hold on; zgrid(zeta,0)
xxxxxxxxxx>> % Fazendo zooom na região de interesse:>> axis([0.2 1.1 -0.5 0.5])>> axis([0.7 1.1 -0.5 0.5])
xxxxxxxxxx>> % Sintonizando este controlador>> [K_PI1,polosMF]=rlocfind(ftma_PI1)Select a point in the graphics windowselected_point = 0.9128 + 0.12384iK_PI1 = 26.538polosMF = 0.91281 + 0.12384i 0.91281 - 0.12384i 0.91268 + 0i 0.34991 + 0i>> ftmf_PI1=feedback(K_PI1*ftma_PI1, 1); % fechando a malha>> figure; step(ftmf_PI1)>> stepinfo(ftmf_PI1) RiseTime: 1.2 SettlingTime: 5 SettlingMin: 0.9502 SettlingMax: 1.1345 Overshoot: 13.447 Undershoot: 0 Peak: 1.1345 PeakTime: 2.5
Obs.: Notamos que diminuiu consideravelmente em relação à ação integral pura.
xxxxxxxxxx>> C_PI2=tf([1 -0.83],[1 -1],T)C_PI2 = z - 0.83 -------- z - 1 Sample time: 0.1 secondsDiscrete-time transfer function.>> ftma_PI2=C_PI2*BoG;>> zpk(ftma_PI2) 0.00012224 (z+2.747) (z-0.83) (z+0.1903) ---------------------------------------- (z-1) (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> figure; rlocus(ftma_PI2)
xxxxxxxxxx>> % Fazendo zoom na região de interesse>> axis([0.7 1.1 -0.5 0.5])>> hold on; zgrid(zeta,0)
xxxxxxxxxx>> [K_PI2,polosMF]=rlocfind(ftma_PI2) % encontrado ganho do controladorSelect a point in the graphics windowselected_point = 0.95355 - 0.074303iK_PI2 = 9.4628polosMF = 0.95259 + 0.074322i 0.95259 - 0.074322i 0.82311 + 0i 0.362 + 0i>> ftmf_PI2=feedback(K_PI2*ftma_PI2, 1);>> figure; step(ftmf_PI1, ftmf_PI2)>> legend('PI_1', 'PI_2') % já comparando com PI1
Conclusão final: O PI1 se saiu melhor que o PI2 ( é menor para PI1).
Podemos projetar PI fazendo:
Neste caso, temos que definir algum critério temporal.
Antes fizemos o projeto de um Controlador Proporcional com segundos mas com . Será que é possível realizar um PI (erro nulo para entrada degrau), responder em até 4 segundos ( segundos)?
Usando App Control System Designer...
Seguem telas capturadas do App:

E então temos:

Equação encontrada para o controlador (usando opção Exportar "C"):

xxxxxxxxxx>> zpk(C_PI1a) 13.5 (z-0.91) ------------- (z-1) Name: CSample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> ftma_PI1a=C_PI1a*BoG;>> ftmf_PI1a=feedback(ftma_PI1a, 1);>> figure; step(ftmf_PI1a)
Faltou testar cancelamento pólo-zero do pólo dominante da planta.
xxxxxxxxxx>> zpk(BoG) 0.00012224 (z+2.747) (z+0.1903) -------------------------------- (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.Seguem telas usando o App...


Equação encontrada para o controlador:
xxxxxxxxxx>> zpk(C_PI3) 13.2 (z-0.9048) --------------- (z-1) Name: CSample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> ftma_PI3=C_PI3*BoG;>> ftmf_PI3=feedback(ftma_PI3, 1);>> figure; step(ftmf_PI3)>> stepinfo(ftmf_PI3) RiseTime: 2.2 SettlingTime: 3.5 SettlingMin: 0.901 SettlingMax: 1.0151 Overshoot: 1.5137 Undershoot: 0 Peak: 1.0151 PeakTime: 4.8
Obs.: Este é provavelmente um dos menores passíveis de serem obtidos para um controlador do tipo PI para esta planta.
Encerrando atividades nesta aula:
xxxxxxxxxx>> save dados>> diary offFernando Passold, em 07/04/2025