Я не могу решить проблему с моим кодом PID-симуляции (я думаю, что дело в разнице дифференциатора) - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь построить ПИД-регулятор, его дифференциальная часть умножается на фильтр нижних частот, функция преобразования с точностью до 1 / (r * s + 1) (r = 4 * Ts). Я использую прямую разность для дискретизации контроллера и использую функцию пространства состояний для обработки объекта, я хочу пошаговый ответ этой системы. И я использовал функции обратной связи pid () step (), чтобы проверить, прав ли я.

И все же я ошибся, вот ответ. enter image description here

Я пробовал только ПИ-контроль. enter image description here

Вы можете видеть, что это почти идеально. Поэтому я думаю, что проблема в дифференциале. Но я действительно не могу это выяснить. Я уже проверил разницу вперед много раз. Я попробовал обратную разницу и получил ту же кривую.

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, потому что это более здравый смысл.

...