Projeto de Controlador PI

Aula de 14/10/2020

Relembrando a planta usada para estudo de caso:

» zpk(BoG)

ans =

  0.00012224 (z+2.747) (z+0.1903)
  --------------------------------
  (z-0.9048) (z-0.8187) (z-0.3679)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

Equação do PI:

\[ C(z)=K_p+\dfrac{K_i}{(z-1)}=\frac{K_p z - K_p + K_i}{(z-1)} \] \[ C(z)=\dfrac{ K_p \left[ z - \left( 1 - \dfrac{K_i}{K_p}\right) \right] }{(z-1)} \]

O problema aqui é definir a posição do zero.

Usando Matlab para levantar o RL de \(BoG(z)\) e parte do controlador PI sem o zero, para avaliar posições para seu zero:

» PI_aux=tf(1 , [1 -1], T); % PI sem o zero!
» zpk(PI_aux) % conferindo expressão do PI_aux sem o zero ainda

ans =

    1
  -----
  (z-1)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

» ftma_aux=PI_aux*BoG;
» pzmap(ftma_aux)
» % Lembrando dos pólos e zeros da planta:
» zpk(BoG)

ans =

  0.00012224 (z+2.747) (z+0.1903)
  --------------------------------
  (z-0.9048) (z-0.8187) (z-0.3679)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

Raciocínio usando RL como ferramenta de decisão:

Opção 1) Colocar 0,9048 < zero_PI < 1 (integrador) (entre o integrador e o pólo + lento)

Opção 2) Colocar o 0,8187 < zero_PI < 0,9048 (entre os 2 pólos mais lentos da planta)

Opcao_1_zero_PI.png Opcao_2_zero_PI.png
Opção 1: Opção 2:
0,9048 < zero_PI < 1 0,8187 < zero_PI < 0,9048

Observe certas sutilezas nos gráficos anteriores: * A distância (raio) de um pólo complexo no RL para a opção 1 está um pouco mais próxima da origem do plano-z em comparação com a opção 2. A diferença pode parecer pequena nas figuras, mas as 2 opções implicam resultados bem diferentes.

Conclusão: Optando pela opção 1, porque o RL com pólos complexos fica ligeiramente mais afastado do círculo unitário (resposta + rápida).

Continuando com projeto do PI:

» PI=tf( [1 -0.93], [1 -1], T)

PI =

  z - 0.93
  --------
   z - 1

Sample time: 0.1 seconds
Discrete-time transfer function.

» ftma_PI=PI*BoG;
» figure; rlocus(ftma_PI)
» hold on;
» zgrid(zeta,0)
» % Sintonizando PI:
» [K_PI, polosMF] = rlocfind(ftma_PI)
Select a point in the graphics window
selected_point =
   0.8938 + 0.0992i
K_PI =
   18.8690
polosMF =
   0.9472 + 0.0000i
   0.8938 + 0.0992i
   0.8938 - 0.0992i
   0.3543 + 0.0000i
zpk(BoG)

ans =

  0.00012224 (z+2.747) (z+0.1903)
  --------------------------------
  (z-0.9048) (z-0.8187) (z-0.3679)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

RL resultante:

RL_PI.png

Fechando a malha:

» ftmf_PI = feedback(K_PI*ftma_PI, 1);
» figure; step(ftmf_PI)

Resultado da resposta ao degrau:

step_PI.png

Comparando com controladores anteriores:

» figure; step(ftmf, ftmf_I, ftmf_PI);

comparando_KP_I_PI.png

Projeto do Controlador por Atraso de Fase (Lag)

Comparativo do Lag com PI (teoria):

RL_Lag_PI.png

» % Lembrando de BoG(z)
» zpk(BoG)

ans =

  0.00012224 (z+2.747) (z+0.1903)
  --------------------------------
  (z-0.9048) (z-0.8187) (z-0.3679)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

» Lag=tf( [1 -0.91] , [1 -0.98 ] , T)

Lag =

  z - 0.91
  --------
  z - 0.98

Sample time: 0.1 seconds
Discrete-time transfer function.

» ftma_Lag=Lag*BoG;
» figure; rlocus(ftma_Lag)
» hold on
» zgrid(zeta,0)
» % Sintonizando Lag:
» [K_Lag, polosMF] = rlocfind(ftma_Lag)
Select a point in the graphics window
selected_point =
   0.9009 + 0.0952i
K_Lag =
   17.1887
polosMF =
   0.9135 + 0.0000i
   0.9002 + 0.0953i
   0.9002 - 0.0953i
   0.3555 + 0.0000i

RL resultante para o Lag:

RL_Lag.png

Fechando a malha...

» ftmf_Lag = feedback(K_Lag*ftma_Lag, 1);
» figure; step(ftmf_Lag)
» axis([0 6 0 1])

Resposta ao degrau para controlador Lag:

step_Lag.png

Note, agora existe erro em regime permanente: \(e[kT] \neq 0\).

» % Verificando erro
» dcgain(ftmf_Lag) % valor de y[\infty]
ans =
    0.7946
» erro_Lag=(1-dcgain(ftmf_Lag))/1*100
» erro_Lag =
   20.5446

Comparando Lag com PI:

» figure; step(ftmf_PI, ftmf_Lag)

step_Lag_PI.png

Projeto do PI cancelando pólo + lento

A ideia aqui é avaliar se ao invés de atribuir um local para o zero entre pólos dominantes da \(FTMA(z)\), o que ocorre se o zero do controlador cancelar propositalmente o pólo mais lento da planta?

» polos_planta=pole(BoG)
    0.9048
    0.8187
    0.3679
» polos_planta(1) % isolando apenas o pólo + lento
ans =
    0.9048
» % Montando o PI com zero igual ao pólo + lento da planta:
» PI2=tf( [1 -polos_planta(1)], [1 -1], T)

PI2 =

  z - 0.9048
  ----------
    z - 1

Sample time: 0.1 seconds
Discrete-time transfer function.

» ftma_PI2=PI2*BoG;
» zpk(ftma_PI2) % comprovando cancelamento pólo-zero

ans =

  0.00012224 (z+2.747) (z-0.9048) (z+0.1903)
  ------------------------------------------
    (z-1) (z-0.9048) (z-0.8187) (z-0.3679)

Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.

» figure; rlocus(ftma_PI2)
» hold on;
» zgrid(zeta,0)
» % Sintonizando este PI:
» [K_PI2,polosMF] = rlocfind(ftma_PI2)
Select a point in the graphics window
selected_point =
   0.9158 + 0.0845i
K_PI2 =
   17.1359
polosMF =
   0.9143 + 0.0846i
   0.9143 - 0.0846i
   0.9048 + 0.0000i
   0.3560 + 0.0000i

RL resultante:

RL_PI2.png

Fechando a malha...

» ftmf_PI2=feedback(K_PI2*ftma_PI2, 1);
» figure; step(ftmf_PI, ftmf_PI2)

Resposta ao degrau unitário:

step_PI_PI2.png

Comparando esforços de controle

A ideia aqui é avaliar as amplitudes desenvolvidas por cada ação de controle, \(u[kT]\):

Baseado na apostila.pdf (Apêndice G.1 Gráfico de \(u[kT]\)), percebemos que a função step(FTMF) do Matlab realiza: \[ \text{step(FTMF)}=\text{"plot"} \left( \mathcal{Z}^{-1}\left\{ \underbrace{U(z)}_{\mathcal{Z}\left\{ \text{Degrau} \right\}} \cdot \text{FTMF}(z) \right\} \right) \] E lembrando que: \[ U(z)=\left[ \dfrac{C(z)}{1+C(z)\cdot BoG(z)} \right] \] Então:

» aux_PI2=K_PI2*PI2/(1+K_PI2*ftma_PI2);
» aux_PI=K_PI*PI/(1+K_PI*ftma_PI);
» % Comparando $u[kT]$ do PI com PI2:
» figure; step(aux_PI, aux_PI2)

step_PI_PI2.png

Comparando com controlador proporcional

» aux_Kp=K/(1+K*BoG);
» figure; step(aux_Kp, aux_PI, aux_PI2)

u_kT_Kp_PI_PI2.png

Finalizando atividades desta aula:

» save planta
» diary off

Fernando Passold, em 14/10/2020