O objetivo neste documento é apresentar uma forma de obter gráficos da ação de controle e do sinal de erro num sistema em malha-fechada, usando o Matlab, sem a necessidade de usar o Simulink.
Observando o sistema realimentado unitário abaixo:
Notamos que:
então:
ou organizando melhor, notamos que:
note que: .
Perceba que quando usamos o comando step(FTMF)
no Malab, o mesmo está realizando:
A função step
multiplica a transfer function passada como argumento de entrada pela transformada de Laplace da função Degrau, realiza a transformada inversa de Laplace, calcula as primeiras amostras (valores) do resultado desta inversa e "plota" o resultado destes cálculos na forma de um gráfico.
Normalmente quando fechamos uma malha tradicional de controle, como o mostrado na primeira figura acima, realizamos algo como:
e para obter o gráfico da resposta do sistema em malha-fechada, realizamos no Matlab:
>> step(FTMF)
este comando termina por realizar:
Então, podemos adapatar a forma como trabalha a função step
para gerar o gráfico de ou .
Anteriormente deduzimos:
Então note que a parte da expressão transformamos em argumento de entrada para a função step()
e conseguimos obter o gráfico de :
e assim, para obter o gráfico de quando o sistema em malha fechada é submetido à uma entrada degrau, fazendo no Matlab, algo como:
>> aux=Kp/(1+Kp*G7);
>> % gráfico de u(t)
>> figure; step(aux)
Exemplo: suponha o sesguinte sistema:
No Matlab:
>> % ingressando a planta:
>> G7=tf(320,poly([-20 -8 -2]));
>> % fechando a malha com granho proporcional e %OS=20%
>> rlocus(G7)
>> OS=20;
>> zeta=(-log(OS/100))./(sqrt(pi^2+(log(OS/100)^2)))
zeta =
0.4559
>> [Kp,polosMF]=rlocfind(G7)
Select a point in the graphics window
selected_point =
-3.4410 + 6.7943i
Kp =
3.1786
polosMF =
-23.1680 + 0.0000i
-3.4160 + 6.7857i
-3.4160 - 6.7857i
>> ftmf=feedback(Kp*G7, 1);
>> figure; step(ftmf)
Que gerou o seguinte RL e resposta ao degrau:
(a) RL para | (b) Resposta ao degrau, |
Para se obter também o gráfico de fazemos então:
Calculamos:
x>> aux=Kp/(1+Kp*G7);
>> zpk(aux)
ans =
3.1786 (s+20) (s+8) (s+2)
--------------------------------
(s+23.17) (s^2 + 6.832s + 57.72)
Continuous-time zero/pole/gain model.
>> figure; step(aux)
O que nos permite vizualizar as amplitudes desenvolvidas pela ação de controle :
Porém a função step
só trabalha com polinômios de entrada causais.
Por exemplo, observe o que acontece se projetamos um PD e queremos observar as amplitudes desenvolvidas por este controlador:
Exemplo: observando ação de controle desenvolvida por um PD.
Neste exemplo, vamos incorporar um PD à planta já adotada anteriormente
Obs.: Não estará sendo mostrado aqui, como o PD foi obtido.
A equação do PD é:
Tentado obter o gráfico de gerado pelo PD:
>> C_PD=tf([1 14.28], 1)
C_PD =
s + 14.28
Continuous-time transfer function.
>> K_PD=0.690759;
>> aux=K_PD*C_PD/(1+K_PD*C_PD*G7);
>> zpk(aux)
ans =
0.69076 (s+20) (s+14.28) (s+8) (s+2)
------------------------------------
(s+16.27) (s^2 + 13.73s + 213.7)
Continuous-time zero/pole/gain model.
>> figure; step(aux)
Error using DynamicSystem/step (line 95)
Cannot simulate the time response of improper
(non-causal) models.
Neste caso, o Matlab não finalizou a funçã step()
por considerar a função transferência passada como argumento de de entrada, como um sistema não causal.
De fato, analizando a equação de aux
notamos que o grau do numerador é superior ao grau do denominador:
Como contornar este problema?
Neste caso, lembrando que queremos:
Falta multiplicar a expressão anterior aux
pela transformada de Laplace do Degrau:
Calculando a nova expressão, teremos:
Se à expressão aux2
aplicarmos uma entrada impulso, realizarmos a transformada inversa de Laplace da mesma e plotamos os resultado para o período inicial de tempo, teremos obtido nosso objetivo que é o gráfico de :
Notamos que a função impulse()
do Matlab fornece justamente a resposta temporal ao impulso da função transferência passada como argumento de entrada para a mesma.
Então para ober o gráfico de para o nosso PD, terminamos de fazer agora:
>> degrau=tf(1,[1 0])
degrau =
1
-
s
Continuous-time zero/pole/gain model.
>> aux2=degrau*aux;
>> zpk(aux2)
ans =
0.69076 (s+20) (s+14.28) (s+8) (s+2)
------------------------------------
s (s+16.27) (s^2 + 13.73s + 213.7)
Continuous-time zero/pole/gain model.
>> figure; impulse(aux2)
Note que desta vez a função aux2
é causal.
O gráfico de para o PD fica então:
Podemos opcionalmente, mesclar num mesmo gráfico, a resposta temporal do sistema, com o gráfico de anterior, usando a função plotyy
do Matlab.
Mas para usar esta função temos que criar os vetores usados como dados de entrada para a função plotyy()
:
>> % fechando malha do PD (não feito anteriormente)
>> ftmf_PD=feedback(K_PD*C_PD*G7, 1);
>> [u, t]=impulse(aux2); % gera vetores t x u(t)
>> [y, t2]=step(ftmf_PD); % gera vetoree t2 x y(t)
>> figure; plotyy(t2,y, t,u)
>> legend('y(t)','u(t)')
O que gera o gráfico:
Mas talvez, mostrar os gráficos de e de maneira isolada seja melhor para mostrar pontos importantes em cada um deles:
(a) Resposta ao degrau, | (b) Resposta ao degrau, |
O gráfico de pode ser obtido usando uma estratégia semelhante à adotada para plotar o gráfico de .
Neste caso, analisando o diagrama em blocos abaixo e extraíndo equações, teremos:
e no Matlab, realizamos então:
testando:
>> aux3=1/(1+K_PD*C_PD*G7);
>> zpk(aux3)
ans =
(s+20) (s+8) (s+2)
--------------------------------
(s+16.27) (s^2 + 13.73s + 213.7)
Continuous-time zero/pole/gain model.
>> figure; step(aux3)
>> title('Erro para PD sobre planta G_7(s)')
O que gera o gráfico:
Fim
Fernando Passold, em 11/06/2020