Projeto de Controladores usando Root LocusReiniciando da Aula anteriorProjeto de PDEmbasamento TeóricoProjeto de PD usando "Chute Científico"Projeto de PD usando Contribuição AngularTentando um PD mais rápido
Aula anterior: de 14/05/2026. Aquivo de dados: planta.mat.
>> diary aula_28052026b.txt % criando novo arquivo texto de log>> load planta % recuperando dados da aula passada🎵.
Para lembrar de conceitos associados com controlador PD, revisar:
A exemplo do que foi realizado no projeto do PI, esboçamos diferentes opções de localização para o zero do PI e esboçamos diagramas de Root Locus associados com cada opção para avaliar teoricamente as melhores opções de posicionamento do mesmo.
Neste instante, estamos realizando o projeto de um PD, cuja equação é:
notamos que as únicas incógnitas agora são a posição do zero do PD (
De modo similar ao que foi realizado na aula de 03/10/2019 (Projeto de PD), podemos prever 4 posições diferentes para o zero do PD:

Como o planta da aula de 03/10/2019 também era um sistema de 3a-ordem, sem zeros, semelhante ao adotado neste semestre, os esboços para os Root Locus nos permitiram concluir que as melhores opções de posicionamento do pólo do PD seriam o caso (2) e (4). O caso (3) corresponde ao PD mais rápido possível de ser realizado para este tipo de sistema.
Mas desta vez não vamos seguir esta abordagem para definição do PD e vamos optar por realizar este projeto usando contribuição angular.
Nesta aula em particular vamos usar o script find_polo_zero.m, para realizar o projeto do PD usando Contribuição Angular.
Verificando se ele já se encontra na pasta (folder) de trabalho atual:
>> what
MATLAB Code files in the current folder /Volumes/DADOS/Users/fpassold/Documents/UPF/Sistemas de Controle/2026_1/Matlab_2026_1
find_polo_zero
MAT-files in the current folder /Volumes/DADOS/Users/fpassold/Documents/UPF/Sistemas de Controle/2026_1/Matlab_2026_1
matlab planta Este script exige a presença da variável ftma_aux previamente preparada no workspace do Matlab para funcionar:
help find_polo_zero find_polo_zero.m Angular contribution routine to find out where to locate pole or zero of the controller depending on the desired location for MF poles Use: This routine already expects a tf named "ftma_aux" ftma_aux(s)=C(s)'*G(s); where: C(s)' is almost the full tf of the controller, except for the pole or zero that this routine is expected to determine using angular contribution. This routine uses angular contribution to find the position of the pole or the zero that is necessary to complete the tf of the controller. It asks almost at the end, whether the user wants to find out the position of the pole or the zero that is missing. Fernando Passold, 14/10/2020, 20/10/2020, 30/10/2022, 30/11/2022.E claro, para poder trabalhar com contribuição angular, necessitamos da definição de algum critério temporal de resposta (
Regra do Root Locus, estabele que: Para que alguma curva (traçado) do Root Locus passe por determinado ponto no plano-s, deve ocorrer a seguinte premissa:
Se esta regra for obedecida, o traçado do RL passará sobre este ponto no plano-s.
Este ponto no plano-s corresponde à posição desejado para os pólos de MF de forma a cumprirem os requisitos desejados para
Note que se um sistema em MF (sua
) resultar num sistema de 2a-ordem, do tipo:
se o mesmo for exposto à uma entrada degrau, teremos como resposta sub-amortecida (com overshoot), pólos de MF nas posições:
, onde e . E neste caso em particular podemos prever certas características temporais de resposta:
Note que o valor de
pode ser encontrado se o usuário especifica o valor máximo de permitido para o caso:
Então agora só temos que definir a variável ftma_aux que corresponde à:
onde:
Neste caso, a equação do PD é:
onde:
Então, neste caso em particular:
como
>> ftma_aux = G;>> find_polo_zero
Routine to determine the position of the pole or zerothat is missing to complete controller design
%OS$ (desired Overshoot, in %): ? 15 ts_d (desired settling time): ? 0.75Desired MF poles must be located at: s = -5.33333 ± j8.83189
Evaluating the pole(s) contribution angle(s): Pole 1) in s=-12 + j(0) | angle: 52.95^o Pole 2) in s=-6 + j(0) | angle: 85.68^o Pole 3) in s=-2 + j(0) | angle: 110.68^o Sum(angle{poles}) = 249.31^o
Evaluating the zero(s) contribution angle(s): Sum(angle{zeros}) = 0.00^o
Determining pole or zero location of the controller:Select: [p]=pole or [z]=zero, for the controller ? z
Angle contribution required for controller: 69.31^oThis means that the controller ZERO must be at s = -8.66819
To finish the project, note that:
ftma = 72 (s+8.668) ------------------ (s+12) (s+6) (s+2) Continuous-time zero/pole/gain model.
Find the controller gain with the command:
>> K_ = rlocfind(ftma)
>>Neste ponto, foram geradas 2 janelas gráficas. A primeira demonstrando os cálculos da contribuição angular e posição final encontrada para o zero do PD e a segunda janela mostrando o RL final com a
Gráfico das contribuições angulares com determinação do zero do PD:

RL final do PD:

Note que a posição encontrada para o zero do PD coincide com o caso (4) abordado na aula de 03/10/2019. Isto significa que um PD ainda mais rápido é possível para esta planta.
Sintonizando este controlador e verificando resposta final em malha-fechada para entrada degrau unitário:
>> ftma_PD=ftma; % realizando um "backup" da FTMA(s) da Planta + PD recém calculado>> zpk(ftma_PD)
ans = 72 (s+8.668) ------------------ (s+12) (s+6) (s+2) Continuous-time zero/pole/gain model.
>> K_PD = rlocfind(ftma) % encontrando valor do ganhoSelect a point in the graphics windowselected_point = -5.3519 + 8.8928iK_PD = 1.3768>> >> ftmf_PD=feedback(K_PD*ftma, 1); % fechando a malha>> pole(ftmf_PD) % opcionalmente mostrando pólos de MFans = -5.3373 + 8.8937i -5.3373 - 8.8937i -9.3254 + 0i>> figure; step(ftmf_PD) % resposta ao degrau para MFResposta final em MF para entrada (referência) degrau unitário:

Note que o PD acelerou a resposta do sistema, mas o PD não é capaz nem é direcionado para zerar erro em regime permanente:
>> dcgain(ftmf_PD) % valor final atingido pela saída do sistema: y(∞)ans = 0.85647>> erro_PD=(1-dcgain(ftmf_PD))/1*100 % calculando erro regime permanente: e(∞)erro_PD = 14.353Note que o overshoot atingido é em relação ao valor final atingido pelo sistema, não em relação à referência. Se percebe que a saída do sistema, mau ultrapassou o valor 1,0 ― isto significa que é possível aumentar ainda mais o ganho do PD para tentar
Lembrando o ganho usado para este PD:
>> K_PDK_PD = 1.3768O que podemos testar de forma mais rápida é se é possível reduzir ainda mais o tempo de assentamento desta planta com um PD. Digamos, tentar baixar de 0,75 segundos para 0,5 segundos.
>> 1.5/3 % 1/3 do valor do ts do Controlador Proporcional usando ganho K2.ans = 0.5>> >> % Outro PD (mais rápido)...>> >> find_polo_zero
Routine to determine the position of the pole or zerothat is missing to complete controller design
%OS (desired Overshoot, in %): ? 15 ts_d (desired settling time): ? 0.5Desired MF poles must be located at: s = -8 ± j13.2478
Evaluating the pole(s) contribution angle(s): Pole 1) in s=-12 + j(0) | angle: 73.20^o Pole 2) in s=-6 + j(0) | angle: 98.59^o Pole 3) in s=-2 + j(0) | angle: 114.37^o Sum(angle{poles}) = 286.15^o
Evaluating the zero(s) contribution angle(s): Sum(angle{zeros}) = 0.00^o
Determining pole or zero location of the controller:Select: [p]=pole or [z]=zero, for the controller ? z
Angle contribution required for controller: 106.15^oThis means that the controller ZERO must be at s = -4.16368
To finish the project, note that:
ftma = 72 (s+4.164) ------------------ (s+12) (s+6) (s+2) Continuous-time zero/pole/gain model.
Find the controller gain with the command:
>> K_ = rlocfind(ftma)
>> ftma_PD2=ftma;>> K_PD2=rlocfind(ftma)Select a point in the graphics windowselected_point = -7.9969 + 13.246iK_PD2 = 2.7148Root Locus deste PD:

Note que o zero do PD mudou de local — para o caso (2) se tivéssemos usado o método do "chute cientifico" (aula de 03/10/2019). E note também que o ganho aumentou, o que provavelmente deve implicar num erro de regime permanente menor.
Fechando a malha e verificando resultados obtidos:
xxxxxxxxxx>> ftmf_PD2=feedback(K_PD2*ftma, 1);>> figure; step(ftmf_k2, ftmf_PD, ftmf_PD2)>> legend('Prop (K_2)', 'PD', 'PD_2')Resposta obtida, comparando com outros controladores:

Encerrando esta seção de trabalho:
xxxxxxxxxx>> save planta >> diary off>> exitA 2a-parte da aula, continua [aqui] com o projeto de um PID para esta planta.
Fernando Passold, em 30/05/2026