-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVOGEL_EDGAR.m
185 lines (158 loc) · 6.49 KB
/
VOGEL_EDGAR.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
%% INÍCIO DA ROTINA
%% LUÍS AUGUSTO MESQUITA DE CASTRO (20/05/2019)
% Instituto Federal do Pará (IFPA)
% Universidade Federal do Pará (UFPA)
% Controle Digital de Sistemas (Mestrado em Engenharia Elétrica - UFPA)
% Teoria de Sistemas Lineares (Mestrado em Engenharia Elétrica - UFPA)
%% DaqDuino Data Acquisition device.
% DAQ-Duino, 2013-2016
% Author: Prof. Dr. Antonio Silveira ([email protected])
% Laboratory of Control and Systems (LACOS), UFPA (www.ufpa.br)
%% Limpar todas as variáveis do workspace e linha de comando
clear; close all; clc
%% Obter realização em função de transferência discreto do modelo identificado
disp('PROJETO DE CONTROLADOR DE VOGEL-EDGAR');
% Az = input('Entre com o polinômio A(z^-1):'); % Polinômio A(z^-1) na forma: Az = [1 a1 a2 ... an]
% Bz = input('Entre com o polinômio A(z^-1):'); % Polinômio B(z^-1) na forma: Bz = [b0 b1 ... bn]
% Cz = input('Entre com o polinômio C(z^-1):'); % Polinômio C(z^-1) na forma: Cz = [1 c1 c2 ... cn]
% Ts = input('Entre com o período de amostragem em segundos:'); % Período de amostragem
% d = input('Entre com o atraso de transporte (delay):'); % Número de Ts segundos
variance = input('Entre com a variância do ruído de saída:'); % Variância do ruído impregnado ao sinal de saída
disp('[1] - Malha fechada com controlador de Vogel-Edgar ou [2] - Malha aberta:'); % Opções de malha de controle
n = input('Entre com a malha de controle a ser simulada:'); % Seleção da malha de controle
if n == 1
r = input('Entre com a constante de tempo de malha fechada:');
elseif n == 2
% Nada a fazer
r = 1;
end
% Configuração padrão do circuito eletrônico (modelo determinístico)
% Az = [1 -1.7464556019207950754434932605363 0.88196492720282992916480679923552]; % Polinômio A(z^-1)
% Bz = [0.023237421998205644302348815699588 0.1089685466611960973359884974343]; % Polinômio B(z^-1)
% Cz = [1 0 0]; % Polinômio C(z^-1)
% Configuração padrão do circuito eletrônico (modelo estocástico)
Az = [1 -1.7628271024278894252290683652973 0.8888827902564973015842042514123]; % Polinômio A(z^-1)
Bz = [0.021018021110895027114828792491608 0.10254201349683352006980641135669]; % Polinômio B(z^-1)
Cz = [1 -0.015193361616161639784938763853006 -0.0046240196648598139508856696977546]; % Polinômio C(z^-1)
Ts = 0.05; d = 1; umax = 5; umin = -5;
Gz = tf(Bz,Az,Ts,'InputDelay',d-1); % Função de transferência pulsada do sistema nominal
% Ordem dos polinômios A(z^-1), B(z^-1) e C(z^-1)
na = length(Az)-1; nb = length(Bz); nc = length(Cz)-1;
%% Projeto do controlador de Vogel-Edgar
[Wn,Csi] = damp(Gz); % Dados do sistema
kp = dcgain(Gz); % Ganho estático da planta
wn = Wn(1); % Frequência natural não amortecida do sistema (rad/s)
csi = Csi(1); % Coeficiente de amortecimento considerado
tau_ma = 1/wn; % Constante de tempo de malha aberta
tau_mf = r; % Constante de tempo de malha fechada
alfa = exp(-Ts/tau_mf); % Polo real discreto, quanto mais próximo de 1, mais conservativa será a lei de controle
teta = (d-1)*Ts; % Atraso de transporte (delay) em segundos
if n == 1
Mz = conv(sum(Bz),[1 -alfa]); % Polinômio M(z^-1)
Nz = conv((1-alfa),Bz); % Polinômio N(z^-1)
Nz = [zeros(1,d) Nz]; % Polinômio N(z^-1)z^-d
if na == 1 && d == 1
Rz = Mz-Nz; % Polinômio R(z^-1)
else
Mz = [Mz zeros(1,length(Nz)-2)];
Rz = Mz-Nz; % Polinômio R(z^-1)
end
Sz = conv((1-alfa),Az); % Polinômio Sz
Tz = Sz; % Polinômio Tz
% Ordem dos polinômios R(z^-1), S(z^-1) e T(z^-1)
nr = length(Rz)-1; ns = length(Sz); nt = length(Tz);
RSTz = tf(Sz,Rz,Ts); % Função de transferência pulsada do controlador
else
% Nada a fazer
end
%% Malha de controle simulada
disp('SIMULANDO MALHA DE CONTROLE');
% Sinal de referência
yr(1:(1/Ts)) = 0;
yr((1/Ts)+1:300) = 1;
yr(301:600) = 3;
yr(601:900) = 2;
yr(901:1201+d) = 1;
nit = length(yr)-d; % Número de iterações
% Perturbação na entrada da planta
v(1:(1/Ts)) = 0;
v((1/Ts)+1:300) = 0;
v(301:600) = 0;
v(601:900) = 0;
v(901:1201+d) = 0;
% Inicializar vetores
uv = zeros(1,nit); % Inicializar vetor de sinal interno (u+v)
yv = zeros(1,nit); % Inicializar vetor de sinal interno (y+xi)
y = zeros(1,nit); % Inicializar vetor de sinal de saída
u = zeros(1,nit); % Inicializar vetor de sinal de controle
du = zeros(1,nit); % Inicializar vetor de incremento de controle
e = zeros(1,nit); % Inicializar vetor de sinal de erro
% Ruído de saída
xi = wgn(nit,1,variance,'linear')';
% Condições iniciais de simulação
for k = 1:na+d
y(k) = 0;
u(k) = 0;
e(k) = 0;
du(k) = 0;
end
for k = na+d+1:nit
% Saída da planta
y(k) = -Az(2:length(Az))*y(k-1:-1:k-na)' ...
+Bz*uv(k-d:-1:k-nb+1-d)';
% +Cz(2:length(Cz))*xi(k-1:-1:k-nc)'+xi(k);
yv(k) = y(k)+xi(k)+v(k);
% Sinal de erro
e(k) = yr(k)-yv(k);
if n == 1
% Lei de controle Vogel-Edgar
u(k) = (1/Rz(1))*(-Rz(2:length(Rz))*u(k-1:-1:k-nr)'+Tz*yr(k:-1:k-nt+1)'-Sz*yv(k:-1:k-ns+1)'); % Sinal de controle
uv(k) = u(k);
du(k) = u(k)-u(k-1); % Incremento de controle
elseif n == 2
% Malha Aberta
u(k) = yr(k); % Sinal de controle
uv(k) = u(k);
du(k) = u(k)-u(k-1); % Incremento de controle
end
% Saturação da lei de controle
if u(k) >= umax
u(k) = umax;
elseif u(k) <= umin
u(k) = umin;
end
end
%% Índices de desempenho
ISE = sum(e*e'); % Integral Square Error
IAE = sum(abs(e)); % Integral Absolute Error
TVC = sum(abs(du)); % Total Variation of Control
disp('O valor de ISE calculado para a malha de controle é:'); disp(ISE);
disp('O valor de IAE calculado para a malha de controle é:'); disp(IAE);
disp('O valor de TVC calculado para a malha de controle é:'); disp(TVC);
%% Resultados
t = 0:Ts:nit*Ts-Ts; % Vetor de tempo
figure(1); % Figura 1
subplot(211);
stairs(t(1:1200),yr(1:1200),'k:','linewidth',2); hold on
stairs(t(1:1200),yv(1:1200),'r','linewidth',2); hold on
set(gca,'FontSize',14);
if n == 1
title('Resposta do sistema em malha fechada');
elseif n == 2
title('Resposta do sistema em malha aberta');
end
xlabel('tempo (s)');
ylabel('amplitude (V)');
legend('y_r','y');
ylim([min(yr)-0.1 max(yr)+2]);
subplot(212);
stairs(t(1:1200),u(1:1200),'b','linewidth',2); hold on
set(gca,'FontSize',14);
title('Sinal de controle');
xlabel('tempo (s)');
ylabel('amplitude (V)');
legend('u');
ylim([min(u)-0.1 max(u)+2]);
disp('FIM DO PROJETO DE CONTROLADOR DE VOGEL-EDGAR');
%% FIM DA ROTINA
%% LUÍS AUGUSTO MESQUITA DE CASTRO (20/05/2019)