Está en la página 1de 2

1 clear all;

2 clc;
3 %% Variables.
4
5 % Parámetros.
6 area = 2;
7 k1 = 1.2;
8
9 % Puntos de operación.
10 xo = 1;
11 uo = k1*sqrt(xo);
12
13 % Tiempo de muestreo.
14 Ts = 0.05;
15
16 kp = k1/(2*sqrt(xo))
17 tau = 2*area*sqrt(xo)/k1
18
19 %% Control PID
20 shi = 0.707; % Coeficiente de amortiguación.
21 wn = 0.5; % Frecuencia natural del sistema.
22
23 kc = (2*tau*shi*wn-1)/kp; % Ganancia proporcional.
24 Ti = kc*kp/(wn^2*tau); % Tiempo integral.
25 Td = 0; % Tiempo derivativo.
26
27 %% Sistema lineal VDE
28 A = -k1/(2*area*sqrt(xo))
29 B = 1/area
30 C = 1
31 D = 0
32 A
33
34 %% Antiwindup
35 alpha = exp(-Ts/tau);
36
37 tend = 50;
38 N = tend/Ts;
39
40 % Condiciones iniciales. Se ocupan en el ciclo for.
41 uk = 0;
42 yk = 0;
43 ek1 = 0;
44 ek2 = 0;
45 yrefk1 = 0;
46 yreffk = 0;
47 ukmax = 4;
48 ukmin = 0;
49 ukreal = 0;
50 sw = 1;
51
52 a = (2*Ti-Ts)/(2*Ti+Ts);
53 b = Ts/(2*Ti+Ts);
54
55 for k = 0:N
56 yk = alpha*yk + (1 - alpha)*uk ; % yk: y(k-1), pasado de la salida.
57 % Se define después. (Un paso
58 % anterior)
59 % uk: u(k-1), pasado de la salida del
60 % controlador (Un paso anterior)
61 % yrefk = 1 + 2*(k*Ts>=10) - 0.5*(k*Ts>=20) - 2.5*(k*Ts>=30); % Referencia.
62 yrefk = 1*(k*T>=1);
63
64 yreffk = a*yreffk + b*(yrefk + yrefk1); % Filtro de referencia filtrada.
65
66 yrefk1 = yrefk;
67
68 ek = yreffk - yk; % Error: e(k) = yref(k) - y(k)
69 % ek = yrefk - yk;
70
71 % Salida del controlador. Método de discretización: Tustin.
72 % uk = uk + kc*(1 + T/(2*Ti) + Td/T)*ek -...
73 % kc*(1 - T/(2*Ti) - 2*Td/T)*ek1 -...
74 % kc*Td/T*ek2;
75 uk = uk + kc*(1 + Ts*sw/(2*Ti) + Td/Ts)*ek -...
76 kc*(1 - Ts*sw/(2*Ti) - 2*Td/Ts)*ek1 -...
77 kc*Td/Ts*ek2;
78
79 % Salida del controlador. Método de discretización: Aproximación
80 % trapezoidal de la integral:
81 % uk = uk + kc*(ek - ek1 + (T/Ti)*((ek + ek1)/2));
82
83 % Anti Windup.
84 % if uk > ukmax
85 % ukreal = ukmax;
86 % sw = 0;
87 % elseif uk < ukmin
88 % ukreal = ukmin;
89 % sw = 0;
90 % else
91 % ukreal = uk;
92 % sw = 1;
93 % end
94
95 % Se guardan los valores pasados del error.
96 ek2 = ek1; % e(k-1): error en el paso anterior.
97 % e(k-2): error en dos pasos antes.
98 ek1 = ek; % e(k): error en el paso actual.
99
100 % Se guardan las señales de salida en vectores.
101 Y(1,k+1) = yk; % Salida
102 Y(2,k+1) = yrefk; % Salida de referencia.
103 Y(3,k+1) = uk; % Salida del controlador.
104 Y(4,k+1) = yreffk; % Salida de referencia filtrada.
105 % Y(5,k+1) = ukreal; % Salida real del controlador.
106 % Y(6,k+1) = sw; % Switch de integración.
107 end
108 k = 0:N;
109
110 figure(5)
111 plot(k*Ts,Y(1,:),'o',k*Ts,Y(2,:),'*',k*Ts,Y(4,:),'--');
112 % legend('yk^d','y^d_r_e_f_k');grid minor
113 % subplot 222, plot(k*Ts,Y(2,:),'o',k*Ts,Y(4,:),'*');
114 % legend('y^d_r_e_f','yf^d_r_e_f_k');grid minor
115 % subplot 223, plot(k*Ts,Y(3,:),'o',k*Ts,Y(5,:),'*');
116 % legend('uk','uk_r_e_a_l');grid minor
117 % subplot 224, plot(k*Ts,Y(6,:),'o');
118 % legend('sw');grid minor

También podría gustarte