Files
2022-06-30 13:32:40 +02:00

36 lines
726 B
Matlab

function [y, yc, z] = jpid(zi, kp, ki, kd, alpha_i, e)
if isempty(zi)
% Integrator
b_i = [1];
a_i = [1 -alpha_i];
% Differentiator
b_d = [1 -1];
a_d = [1];
i = zeros(1, max(length(a_i), length(b_i))-1);
d = zeros(1, max(length(a_d), length(b_d))-1);
z = struct('b_i', b_i, 'a_i', a_i, 'b_d', b_d, 'a_d', a_d, 'i', i, 'd', d, 'y_min', 0.0, 'y_max', 1.0, 'diff_aw', 0.0);
else
z = zi;
end
[yi, z.i] = filter(z.b_i, z.a_i, e + z.diff_aw, z.i);
[yd, z.d] = filter(z.b_d, z.a_d, e, z.d);
z.yp = kp*e;
z.yi = ki*yi;
z.yd = kd*yd;
y = z.yp + z.yi + z.yd;
yaw = yi;
if (yaw < z.y_min)
z.diff_aw = abs(yaw - z.y_min);
end
if (yaw > z.y_max)
z.diff_aw = -abs(yaw - z.y_max);
end
yc = max(z.y_min, min(z.y_max, y));