
Projeto de Controladores usando técnica de Resposta em FrequenciaIntroProjeto de Controlador Proporcional (ou Ajuste de Ganho)Tabelas Gráficos e Procedimento geralExemplo 1: Exemplo 11.1 de NISEResumoAutomatizando o cálculo usando script ch11p1_fer.mExemplo 2: Planta do Estudo de Caso
Material teórico:
Este tipo de controlador permite atender no máximo ao especificado para o sistema em MF. A idéia pode ser resumida na figura:

Segue tabelas relacionando :

Alguns gráficos como referência de valores:


No Matlab:
xxxxxxxxxx>> OS=10; % exemplo>> zeta=(-log(OS/100))/(sqrt(pi^2+(log(OS/100)^2)))zeta = 0.5912Pm):No Matlab:
xxxxxxxxxx>> Pm=atan2(2*zeta, sqrt(-2*zeta^2 + sqrt( 1+4*zeta^4) ) )Pm = 1.0226>> % Resposta em radianos!>> Pm_deg=Pm*180/pi % convertendo para grausPm_deg = 58.5931Identificar no Diagrama de Bode do sistema, a frequencia na qual ocorreria a margem de fase desejada, . Eventualmente fica mais fácil descobrir no Diagrama de Fase após realizar o cálculo: , onde corresponde aos ângulos assumidos por . Note que você deve realizar algo como:

Modificar o ganho do sitema (ajustar o valor de do ccontrolador proporcional) de forma à que o ponto na qual a frequencia se transforme na margem de fase requerida para este sistema. Para tanto, neste ponto (frequencia = ), o ganho final do sistema em MF (considerando o ganho ) deve ser igual à 1 (ou 0 dB).
Seja uma planta caracterizada pela função transferência (baseado no exemplo 11.1, de NISE, Norman S., Control Systems Engineering, 7th Edition, Wiley & Sons, 2024. pág 616), para este sistema, encontrar para obter para entrada degrau:

Note que este sistema em especial é do tipo 1 (possui 1 integrador: pólo na origem em ). Neste caso, o erro em regime permanente deste sistema, em malha fechada, para entrada degrau, sempre será nulo.
Continuando...
Entrando com dados no Matlab e levantando Diagrama de Bode deste sistema:
x
>> G=tf(100,poly([0 -36 -100]));>> zpk(G) % verificando introdução correta dos dadosans = 100 ---------------- s (s+100) (s+36) Continuous-time zero/pole/gain model.>> bode(G)O que rende o gráfico (Diagrama de Bode):

Obs.: Se eventualmente o Matlab não iníciar o diagrama de fase para frequêcias abaixo de (1 rad/s), usar o comando: bode(G, {0.01, 10000}) para forçar diagramas de magnitude e fase na faixa de (rad/s).
Também podemos usar a função margin(.) do Matlab:
xxxxxxxxxx>> margin(G)que gera um Diagrama de Bode ligeiramente modificado como o mostrado abaixo:

Porém note que tomar conhecimento das margens de ganho e de fase do sistema original, não importa para a sintonia do controlador Proporcional. Estas informações permanecem apenas como "curiosidades".
Mas... o digrama de Bode nos interessa.
NISE preferiu "fixar" ganho unitário ( ou 0 dB) na frequência 0,1 rad/s, fazendo o . Note o resultado obtido nas próximas figuras:

NISE percebeu que na frequência de rad/s, o ganho original do sistema, era de dB (você pode confirmar isto, criando um "DataTip" no Diagrama de Magnitude no ponto rad/s). Note que NISE aumentou o ganho de forma a fazer o Diagrama de Magnitude passar por 0 dB na frequência rad/s. Note que aumentar o ganho de 11,1 dB equivale à:
,
ou ao valor absoluto:
:
Note que ao fazer , o gráfico da magnitude cruza o ganho unitário (ou de 0 dB) em rad/s, e então até podemos confirmar que a margem de fase, . Acompanhe pela figura anterior onde foram usados os comandos:
x
>> 11.1/20ans = 0.555>> 10^ansans = 3.5892 % valor do ganho necessário (valor adimensional)>> % Testando:>> 20*log10(3.6)ans = 11.126 % valor do ganho em dB>> % Traçados de Diagramas de Bode>> ftma = tf(100, poly([0 -36 -100]));>> ftma2= ftma*3.6;>> figure; bode(ftma, ftma2, {0.1, 1000})>> legend('ftma(s)', '3,6*ftma')>> gridVoltando ao projeto...
No caso deste projeto é desejando . Isto Implica na seguinte margem de fase desejada, Pm:
xxxxxxxxxx>> OS=9.5; % overshoot de 9,5%>> zeta=(-log(OS/100))/(sqrt(pi^2+(log(OS/100)^2)))zeta = 0.59962>> Pm=atan(2*zeta/ (sqrt(-2*zeta^2+sqrt(1+4*zeta^4))))*(180/pi)Pm = 59.162⚠️ Obs.: Note que a eq. original para cálculo da margem de fase em função de resulta num ângulo em rad/s. Na expressão acima para cálculo de Pm foi acrescentando o termo *(180/pi) para transformar rad/s para graus!
Agora para forçar que a margem de fase seja de necessitamos fazer com que o gráfico de magnitude passe por 0 dB na frequência angular () na qual o Diagrama de fase passa por: , ou:
xxxxxxxxxx>> 180-Pmans = 120.84Buscamos no Diagrama de Bode, a frequencia onde o diagrama de Bode, parte da Fase, passe por :

O diagrama de fase passa por na frequência rad/s. Nesta mesma frequência, o diagrama de magitude passa pelo valor de ganho de dB. Para esta frequência corresponder ao ponto onde deveria ocorrer a Margem de Fase, o Diagrama de Ganho deveria passar por 0 dB (ganho unitário), o que significa que para este caso, necessitamos aplicar um ganho (o "") de dB, ou em termos de ganho absoluto:
xxxxxxxxxx>> 55.4/20ans = 2.77>> K=10^ansK = 588.84>> 20*log10(K) % verificandoans = 55.4Fechando a malha com este valor de ganho, teremos:
xxxxxxxxxx>> ftmf=feedback(K*G, 1);>> figure; step(ftmf)Que gera a figura:

Notamos que o ficou abaixo dos 9,5% desejados. Mas temos que lembrar que as equações que definem (estimam), , e foram desenvolvidas para sistemas que em MF resultam em sistemas de 2a-ordem com apenas 2 pólos complexos conjugados. Neste caso, temos um sistema de 3a-ordem:
xxxxxxxxxxzpk(ftmf)ans = 58884 -------------------------------- (s+107.6) (s^2 + 28.36s + 547.1) Continuous-time zero/pole/gain model.A título de curiosidade, repare o que acontece com o Diagrama de Bode quando consideramos o ganho :
xxxxxxxxxx>> ftma3=ftma*Kftma3 = 5.888e04 ---------------------- s^3 + 136 s^2 + 3600 s Continuous-time transfer function.>> figure; bode(ftma, ftma3, {0.1, 1000})>> gridE temos o gráfico:

A curva em azul se refere ao Diagrama de Bode do sistema original (com ) e a curva alaranjada se refere ao sistema adotando o ganho de .
Segue resumo do procedimento adotado:

Note que a função transferência desta planta incluia um integrador. Isto significa que o procedimento para projeto de Controlador com Ação Integrativa Pura segue o mesmo procedimento já mostrado anteriormente. ⚠️
ch11p1_fer.mTodo este procedimento foi "automatizado" por NISE na forma de um script para o Matlab.
Segue código fonte de ch11p1_fer.m (modificado para incluir gráficos mostrando o procedimento).
% Nise, N.S. % Control Systems Engineering, 3rd ed. % John Wiley & Sons, New York, NY, 10158-0012%% Control Systems Engineering Toolbox Version 3.0 % Copyright � 2000 by John Wiley & Sons, Inc.%% Chapter 11: Design via Frequency Response%% (ch11p1) Example 11.1: We can design via gain adjustment on the Bode plot using % MATLAB. You will input the desired percent overshoot from the keyboard. MATLAB % will calculate the required phase margin and then search the Bode plot for that % phase margin. The magnitude at the phase-margin frequency is the reciprocal of % the required gain. MATLAB will then plot a step response for that gain. Let us % look at Example 11.1 in the text.%% Atualizado por fpassold em 21.10.2019disp('(ch11p1) Example 11.1 - Controlador Proporcional') % Display label.%% ---- Entre com a função transferência da planta no bloco abaixo%numg=[100]; % Define numerator of G(s).deng=poly([0 -36 -100]); % Define denominator of G(s).G=tf(numg,deng) % Create and display G(s).%% Seguem cálculos associados com o projetopos=input('Input %OS ?: '); % Input desired percent overshoot.z=(-log(pos/100))/(sqrt(pi^2+log(pos/100)^2)); % Calculate required damping ratio.fprintf('\nRequired damping ratio (zeta): %6.4f\n', z)Pm=atan(2*z/(sqrt(-2*z^2+sqrt(1+4*z^4))))*(180/pi); % Calculate required phase margin.fprintf('Required phase margin, Pm = %7.4f\n', Pm)%% Criando vetores associados com Diagrama de Bodew=0.1:0.01:100; % Set range of frequency from 0.01 to % 1000 in steps of 0.01.[Mag,P]=bode(numg,deng,w); % Gets Bode data.figure; % Plot Bode diagramsubplot(2,1,1)h1 = semilogx(w, 20.*log10(Mag)); % h1: current figure handlefig1 = gcf; % current figure handlegridtitle('Open Loop Freq. Response')ylabel('Magnitude (dB)');%% ajustando propriedades da figuraset(h1,'LineWidth', 2);ax = gca; % current axesax.FontSize = 14;subplot(2,1,2) % Diagrama de faseh2 = semilogx(w, P);gridylabel('Phase (deg)')xlabel('Frequency (rad/sec)')%% ajustando propriedades da figuraset(h2,'LineWidth', 2);ax = gca; % current axesax.FontSize = 14;escY=min(P);Ph=-180+Pm; % Calculate required phase angle.fprintf('Required phase angle: %7.2f^o\n', Ph)u=length(P);for k=1:1:u; % Search Bode data for required phase % angle. if P(k)-Ph<=0; % If required phase angle is found, % find the value of M=Mag(k); % magnitude at the same frequency. fprintf('Found Pm at w = %5.2f (rad/s)\n', w(k)) fprintf('with magnitude = %5.2f dB (%5.2g)\n', 20*log10(M), M) new_K=1/M; % Calculate the required gain. subplot(2,1,2) hold on % Marca no diagrama o ponto onde ocorre a Margem de Fase, Pm semilogx([w(1) w(u)], [-180 -180], 'k-.', 'LineWidth', 2) % linha guia -180o semilogx([w(k) w(k)], [-180 Ph], 'm-', 'LineWidth', 6) % mostra Pm aux=[num2str(Pm,'%4.1f') '^o']; aux2=-180+Pm/2; text((w(k)), aux2, aux, 'FontSize',14) semilogx([w(k) w(k)], [Ph 0], 'm--', 'LineWidth', 2) semilogx([w(1) w(u)], [P(k) P(k)], 'm--', 'LineWidth', 2) aux=[num2str(w(k),'%3.2f') ' rad/s']; text((w(k)),0 , aux, 'FontSize',14) subplot(2,1,1) hold on % Marca no diagrama do ganho, os pontos que correspondem à Pm semilogx([w(k) w(k)], [0 20.*log10(Mag(k))], 'm-', 'LineWidth',6) % Mostra altura ajuste do ganho semilogx([w(k) w(k)], [20.*log10(Mag(k)) 20.*log10(Mag(u))], 'm--', 'LineWidth',2) semilogx([w(1) w(u)], [20.*log10(Mag(k)) 20.*log10(Mag(k))], 'm--', 'LineWidth',2) aux=[num2str(-20*log10(M),'%5.2f') ' dB']; aux2=20.*log10(Mag(k))/2; text((w(k)), aux2, aux , 'FontSize',14) break % Stop the loop. end % End if.end % End for.fprintf('Then, required K = %6.2f\n', new_K)k_final=new_K;fprintf('Then, final required K = %6.2f\n', k_final)T=feedback(k_final*G,1); % Find T(s) using the calculated K.figure; step(T); % Generate a step response.title(['Closed-Loop Step Response for K= ',num2str(k_final)]) % Add title to step response.ax = gca; % current axesax.FontSize = 14;%% verificando diagrama de Bode compensadoadjusted_g=k_final*G;figure; bode(G,adjusted_g)hold on; % sobrepondo dados de margensmargin(adjusted_g)Explicação:
O script ch11p1_fer.m automatiza o processo, usando a função [M,P]=bode(G,w) para estocar valores de ganho e fase do diagrama de Bode para este sistema, , nos vetores e , em função dos valores de frequencia passados via vetor (que variou entre rad/s, com passo de 0,01 rad/s). Então se calcula o ângulo de fase pelo qual deve passar a planta para alcançarmos a margem de fase desejada, na linha: Ph = -180+Pm, onde Pm corresponde à margem de fase desejada, ou . Depois, um laço for percorre os valores do vetor de fase P buscando a frequencia onde teríamos a marge da fase caso o ganho do sistema fosse igual à 1 ou 0 dB, via teste: if P(k)-Ph <= 0. Quando este ponto é encontrado, o valor do ganho é estocado na variável M e a compensação de ganho requerrida é calculada na variável K, K=1/M. Notar que tanto o vetor M quanto a variável M guardam valores de ganho absolutos e não na escala de dB. A declaração break dentro do if anterior, "quebra" o laço for que varria as frequencias. O restante são cálculos fechando a malha e realizando o teste.
Execução:
xxxxxxxxxxch11p1_fer(ch11p1) Example 11.1 - Controlador ProporcionalG = 100 ---------------------- s^3 + 136 s^2 + 3600 s Continuous-time transfer function.Input %OS ?: 9.5Required damping ratio (zeta): 0.5996Required phase margin, Pm = 59.1621Required phase angle: -120.84^oFound Pm at w = 14.84 (rad/s)with magnitude = -55.33 dB (0.0017)Then, required K = 584.18Then, final required K = 584.18>>
Pode-se usar o script ch11p1_fer.m com outro tipo de planta, desde que seus dados sejam ingressados no mesmo.
A planta neste caso é:
x
>> load planta % carregado os dados da última aula>> zpk(G) % verificando tf da plantaans = 20 ------------------ (s+10) (s+4) (s+1) Continuous-time zero/pole/gain model.As linhas do script ch11p1_fer.m devem ser editadas contemplando os dados de outra planta:
xxxxxxxxxx>> edit ch11p1_fer.mEditar as linhas abaixo:
xxxxxxxxxx%% ---- Entre com a fun��o transfer�ncia da planta no bloco abaixo%% numg=[100]; % Define numerator of G(s).numg = 20;% deng=poly([0 -36 -100]); % Define denominator of G(s).deng = poly([-1 -4 -10]);G=tf(numg,deng); % Create and display G(s).zpk(G)Executando, temos agora:
xxxxxxxxxx>> ch11p1_fer(ch11p1) Example 11.1 - Controlador Proporcionalans = 20 ------------------ (s+10) (s+4) (s+1) Continuous-time zero/pole/gain model.Input %OS ?: 10Required damping ratio (zeta): 0.5912Required phase margin, Pm = 58.5931Required phase angle: -121.41^oFound Pm at w = 2.82 (rad/s)with magnitude = -17.62 dB ( 0.13)Then, required K = 7.61Then, final required K = 7.61>>Repare que as seguintes figuras são geradas:
Figura 1: Diagrama de Bode inicial mostrando ajustes para alançar Margem de Fase desejada:

Figura 2: Resposta ao Degrau unitário para sistema em MF adotando ganho encontrado anteriormente ( dB ou 7,61):

Figura 3: Diagramas de Bode original x Sistema Modificado com novo valor de ganho:

🌊 Fernando Passold 📬 ,