Conhecido também como controlador do tempo mínimo.
Controlador DeadbeatIdeiaExemplo de DeadbeatAmplitudes do sinal atuadorOutras respostas (resposta "programada")Referências sobre Controladores DeadbeatOutras opções para tempo mínimo
O objetivo por trás deste tipo de controlador é fazer o sistema entrar em regime permanente o mais rápido possível, por isto é conhecido também como controlador de tempo mínimo.
Suponha qque se consiga acrescentar um controlador digital à um sistema em malha-fechada de tal forma que a resulte:
Isto significa que quando este sistema for exposto à uma entrada degrau unitário, , sua resposta em malha-fechada resulta em:
ou:
ou seja, a mesmo sinal que um degrau unitário atrasado de um período de amostragem:
Isto pode ser mais fácil de se obter do que se imagina. Uma opção é que a final contenha apenas um pólo, em , um integrador, o que ainda garantiria erro nulo em regime permanente para sistemas do tipo 0 frente à uma entrada degrau. Isto renderia um RL semelhante ao mostrado abaixo:
Neste caso, a assumiria um polinômio do tipo:
Esta resulta na seguinte (supondo realimentação unitária):
Então o objetivo no momento de propor o controlador digital para que isto ocorra é fazer com que o mesmo anule todos os zeros e pólos "estáveis" (dentro do círculo unitário) de (planta), acrescentando ainda um pólo em (integrador), já que isto ainda garantiria erro nulo para entrada degrau.
Testando um caso simples, mas antes "limpando" oworkspace do MATLAB:
xxxxxxxxxx
>> clear all % limpando dados da seção de trabalho anterior
>> close all % fechando todas as janelas gráficas da seção de trabalho anterior
Testando um caso simples, seja a planta, :
amostrada à segundos.
xxxxxxxxxx
>> G=tf(10,poly([-1 -10])); % planta
>> T=0.1;
>> BoG=c2d(G, T); % versão "digitalizada" da planta
>> zpk(BoG)
ans =
0.035501 (z+0.6945)
---------------------
(z-0.9048) (z-0.3679)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
Temos que "montar" o controlador que praticamente é uma função transferência inversa da planta, sem incoporar pólos ou zeros instáveis.
xxxxxxxxxx
>> zeros_BoG=zero(BoG)
zeros_BoG =
-0.69446
>> polos_BoG=pole(BoG)
polos_BoG =
0.90484
0.36788
>> C_dead=tf(poly(polos_BoG), poly(zeros_BoG), T)
C_dead =
z^2 - 1.273 z + 0.3329
----------------------
z + 0.6945
Sample time: 0.1 seconds
Discrete-time transfer function.
>> zpk(C_dead)
ans =
(z-0.9048) (z-0.3679)
---------------------
(z+0.6945)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
Até este ponto seria a tf
inversa de , mas note que o grau do numerador é maior que o grau do denominador o que levaria a um controlador antecipativo, que neste caso, exigiria uma amostra futura do sinal de erro ()!.
Falta igualar o grau do numerador com o grau do numerador, normalmente incorporando um integrador, o que, para o caso desta planta (sistema tipo 0), ainda vai garantir erro nulo para regime permanente (rever Teoria do Erro se for o caso).
xxxxxxxxxx
>> C_dead=tf(poly(polos_BoG), poly([zeros_BoG 1]), T) % acrescentamos o pólo em z=1 (integrador) na tf do C(z)
C_dead =
z^2 - 1.273 z + 0.3329
-----------------------
z^2 - 0.3055 z - 0.6945
Sample time: 0.1 seconds
Discrete-time transfer function.
zpk(C_dead)
ans =
(z-0.9048) (z-0.3679)
---------------------
(z-1) (z+0.6945)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
Continuando o projeto:
xxxxxxxxxx
>> ftma_dead=C_dead*BoG;
>> zpk(ftma_dead)
ans =
0.035501 (z+0.6945) (z-0.9048) (z-0.3679)
-----------------------------------------
(z+0.6945) (z-0.9048) (z-1) (z-0.3679)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
Note o cancelamento de termos:
e assim resta apenas:
ou seja, teríamos um RL com apenas 1 pólo de MF, iniciando da posição (integrador).
No MATLAB é possivel realizar estes cancelamentos de termos comuns entre numerador e denominador usando a função minreal()
:
xxxxxxxxxx
>> ftma_dead_r = minreal(ftma_dead)
ftma_dead_r =
0.0355
------
z - 1
Sample time: 0.1 seconds
Discrete-time transfer function.
Então por fim, teremos o RL esperado:
xxxxxxxxxx
>> rlocus(ftma_dead)
Falta apenas definir o ganho do controlador. Note que o objetivo seria obter:
(um simples integrador)
o que levaria à :
ou seja, quando (degrau), o sistema irá responder como:
ou seja, , isto é, degrau atrasado de um período de amostragem (ou apenas pelo período de tempo ). Ou seja, obtemos o controlador de tempo mínimo ou deadbeat.
Note que:
Respostas ao degrau, pólo real simples, no plano-z: |
---|
![]() |
Voltando ao caso do nosso exemplo, significa definir o valor de ganho do controlador, de tal forma que o pólo de MF seja posicionado em (na origem), ou: . Assim sendo:
xxxxxxxxxx
>> ftma_dead_r
ftma_dead_r =
0.0355
------
z - 1
Sample time: 0.1 seconds
Discrete-time transfer function.
>> K_dead=1/0.035501
K_dead =
28.168
>> ftmf_dead=feedback(K_dead*ftma_dead, 1)
ftmf_dead =
z^3 - 0.5783 z^2 - 0.551 z + 0.2312
---------------------------------------------------
z^4 - 0.5783 z^3 - 0.551 z^2 + 0.2312 z - 2.705e-06
Sample time: 0.1 seconds
Discrete-time transfer function.
>> zpk(ftmf_dead)
ans =
(z+0.6945) (z-0.9048) (z-0.3679)
---------------------------------------------
(z+0.6945) (z-0.9048) (z-0.3679) (z-1.17e-05)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
Ou seja, note como terminou a :
Comprovando que a resposta será um degrau atrasado de um período de amostragem:
xxxxxxxxxx
>> figure; step(ftmf_dead)
Mas... existe um porém, fique atento para as amplitudes desenvolvidas para o sinal de controle.
Calculando agora as amplitudes desenvolvidas pelo sinal de controle, (ou tendo uma idéia do "esforço de controle"). Para saber mais sobre como na janela de comanddos do MATLAB obter os gráficos de ou , ver: Como obter gráficos de u[k] e e[k] na linha de comandos do Matlab.
xxxxxxxxxx
>> % Calculando a tf associada com cálculo de u[k]
>> u_aux = (K_dead*C_dead)/(1+K_dead*ftma_dead);
>> zpk(u_aux) % a título de curiosidade (apenas para inspeção)
ans =
28.168 (z+0.6945) (z-0.9048)^2 (z-1) (z-0.3679)^2
-----------------------------------------------------
(z+0.6945)^2 (z-0.9048) (z-1) (z-0.3679) (z-1.17e-05)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> figure; step(u_aux)
E agora podemos observar de que maneira este controlar força a planta à reagir no tempo mínimo:
Note as amplitudes bastantes elevadas (tanto positivas, quanto negativas) desenvolvidas pelo sinal de controle na fase inicial transitória. Perceba que são gerados valores quase 30 vezes maiores que o valor em regime permanente de ().
Outro tipo de resposta ainda pode ser "programada". Por exemplo, para uma referência (entrada) degrau, se espera uma resposta do tipo:
ou seja:
o que implica num sinal de erro como:
Mas note que podemos definir a eq. do controlador, em função do erro, e de .
Note que:
Se conhecemos a desejada e conhecemos , temos como projetar C(z).
Antes, a desejada era do tipo: , o que resultava em:
ou seja, a eq. de era o inverso de acrescido de um pólo em .
Agora para obter este sinal de erro, a deve ser do tipo:
Se é uma entrada degrau, então: , e:
, teremos:
Note:
xxxxxxxxxx
>> ftmf_d=tf(0.5*poly(-1), [1 0 0], T);
>> figure; step(ftmf_d)
Rende:
Continuando, deve ficar:
Como: , então finalmente:
Testando:
xxxxxxxxxx
>> C2=ftmf_d/(BoG*(1-ftmf_d)); % deixando o MATLAB compor a `tf`
>> zpk(C2)
ans =
14.084 z^2 (z+1) (z-0.9048) (z-0.3679)
--------------------------------------
z^2 (z-1) (z+0.6945) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> C2r=minreal(C2,1e-4); % cancelando termos comuns
>> zpk(C2r)
ans =
14.084 (z+1) (z-0.9048) (z-0.3679)
----------------------------------
(z-1) (z+0.6945) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> ftma2=C2*BoG;
>> ftma2r=minreal(ftma2,1e-4); % cancelando termos comuns
>> zpk(ftma2r)
ans =
0.5 (z+1)
-------------
(z-1) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> ftmf2=feedback(ftma2r,1);
>> zpk(ftmf2)
ans =
0.5 (z+1)
-----------------
(z^2 + 2.165e-15)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> figure; step(ftmf2)
E temos o resultado:
Por curiosidade, podemos tentar levantar o RL para este sistema:
xxxxxxxxxx
>> zpk(C2)
ans =
14.084 z^2 (z+1) (z-0.9048) (z-0.3679)
--------------------------------------
z^2 (z-1) (z+0.6945) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> C2_aux=C2/14.084;
>> zpk(C2_aux)
ans =
z^2 (z+1) (z-0.9048) (z-0.3679)
-------------------------------
z^2 (z-1) (z+0.6945) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> ftma_aux=C2_aux*BoG;
>> figure; rlocus(ftma_aux)
>> hold on
>> pole(ftmf2)
ans =
-2.498e-15 + 4.6529e-08i
-2.498e-15 - 4.6529e-08i
>> plot(real(pole(ftmf2)), imag(pole(ftmf2)), 'r+')
No gráfico acima pode ficar um pouco complicado para entender o que aconteceu, então vamos "simplificar" um pouco:
xxxxxxxxxx
>> zpk(ftma_aux)
ans =
0.035501 z^2 (z+1) (z+0.6945) (z-0.9048) (z-0.3679)
---------------------------------------------------
z^2 (z+0.6945) (z+0.5) (z-0.9048) (z-1) (z-0.3679)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> ftma_aux_r=minreal(ftma_aux,1e-4);
>> zpk(ftma_aux_r)
ans =
0.035501 (z+1)
--------------
(z-1) (z+0.5)
Sample time: 0.1 seconds
Discrete-time zero/pole/gain model.
>> ftma_aux_r2=ftma_aux_r/0.035501;
>> figure; rlocus(ftma_aux_r2)
>> hold on
>> plot(real(pole(ftmf2)), imag(pole(ftmf2)), 'r+')
>> xlim([-3 2])
>> ylim([-1.5 1.5])
E temos um RL mais simplicado, onde os cancelamentos de pólos e zeros "estáveis" de não aparecem:
O dados usados para este exemplo estão disponíveis em dead.mat.
Observe que se resulta algo como , podemos tentar fazer o sistema reagir com atraso de amostras de período de amostragem.
Resolvendo o restante no MATLAB:
Fernando Passold, em 06/05/2025