我正在尝试构建PID控制器,其微分部分乘以低通滤波器,变换函数为1 /(r * s + 1)(r = 4 * Ts)。 我使用前向差异来离散控制器,并使用状态空间函数来处理对象,我想要该系统的阶跃响应。 然后我使用pid()feedback()step()函数检查我是否正确。
您可以看到它几乎是完美的。因此,我认为问题在于差异。但我真的找不到。我已经检查了很多次前向差异。 我尝试了向后差异,并得到了相同的曲线。
T = 0.05;
Cp = 6;
Ci = 1;
Cd = 7;
P = zeros(1, n+1);
I = zeros(1, n+1);
D = zeros(1, n+1);
r = 4*T;
for i = 1:n
if i == 1
e(i) = U(i)-0; % error of time domain, U is step function
P(i) = Cp*e(i);
I(i) = 0;
D(i) = 0;
else
e(i) = U(i)-y(i-1);
P(i) = Cp*e(i);
I(i) = Ci*T*e(i-1)+I(i-1); % forward
D(i) = (Cd*(e(i)-e(i-1))-D(i-1)*(T-r))/r; % forward
% I(i) = T*Ci*e(i)+I(i-1); % backward
% D(i) = (Cd*(e(i)-e(i-1))+r*D(i-1))/(r+T); % backward
% I(i) = (T*(e(i)+e(i-1))+2*I(i-1))/2; % Bilinear
end
u(i) = P(i) + I(i) + D(i);
x(:,i+1) = x(:,i)+T*(Ao*x(:,i)+Bo*u(i));
y(i) = Co*x(:,i);
end
% this how I get the right curve.
PIDF = pid(Cp, Ci, Cd, r);
fb = feedback(PIDF*G_sysc, 1); % G_sysc is trans func of object.
step(fb, N(1:n)*T, 'blue');
我希望它与“阶跃响应”几乎相同。
好的...我已经指出了为什么我自己会有所不同。因为函数feedback()在第一个点和下一个点将误差设置为0,所以误差将是阶跃函数-输出= 1,因此微分将是一个很大的正数,这导致输出收敛比我的PID控制器快
现在,我只想知道如何编辑pid()和feedback()函数以将第一个错误设置为1,因为这是更常见的常识。