Я пытаюсь построить ПИД-регулятор, его дифференциальная часть умножается на фильтр нижних частот, функция преобразования с точностью до 1 / (r * s + 1) (r = 4 * Ts).
Я использую прямую разность для дискретизации контроллера и использую функцию пространства состояний для обработки объекта, я хочу пошаговый ответ этой системы.
И я использовал функции обратной связи pid () 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');
Я ожидаю, что с ответом на шаг должно быть почти так же.
Хорошо ... Я сам перебрал, почему все по-другому. Поскольку функция обратной связи () устанавливает ошибку равной 0 в первой и следующей точках, ошибкой будет ступенчатая функция - выход = 1, поэтому разность будет большим положительным, что приведет к сходимости на выходе быстрее, чем мой ПИД-регулятор .
Теперь я хочу только узнать, как мне отредактировать функции pid () и feedback (), чтобы первая ошибка была равна 1, потому что это более здравый смысл.