📄 pid2df.m
字号:
function pid2df(y,numPs,denPs,numT,denT,numC,denC,numPinvs,denPinvs,denFs,denFs2,Tcanc,E,ord,mq,inf)
global K TauI TauD PID2lagden PID_FIden keps a2 a1 b2 b1 PID_APXden...
PI_lagden PI_deng PID_realden KI pid_text
% Qd part
[qd,qdnum,qdden]=qd_mat(Tcanc(2,:),mq,E(2),inf,y);
qdd=conv(qdden,denFs2);
qdn=conv(qdnum,denFs);
% Calculates PID parameters from IMC design
% PID controller from numC/denC
%----------------------------------------------------------
REVnumC = fliplr(numC); % reverse order of 'numC'
REVdenC = fliplr(denC); % reverse order of 'denC'
REVnumPinvs = fliplr(numPinvs); % reverse order of 'numPinvs'
REVdenPinvs = fliplr(denPinvs); % reverse order of 'denPinvs'
keps=REVnumC(1)/REVdenC(2);
REVnumC = REVnumC/REVnumC(1); % division by coeff. of linear term
REVdenC = REVdenC/REVdenC(2); % division by coeff. of linear term
if length(REVnumC) >= 3
a1=REVnumC(2);
a2=REVnumC(3);
elseif length(REVnumC) == 2
a1=REVnumC(2);
a2=0;
elseif length(REVnumC) <= 1
a1=0;
a2=0;
end
if length(REVdenC) >= 4
b1=REVdenC(3);
b2=REVdenC(4);
elseif length(REVnumC) == 3
b1=REVdenC(3);
b2=0;
elseif length(REVnumC) <= 2
b1=0;
b2=0;
end
pid_text='';
pid_text1='';
if a1 ~= b1
K = keps*(a1-b1);
TauI = a1-b1;
TauD = (a2+b1^2-b2-a1*b1)/(a1-b1);
else
pid_text='I cannot get a PID controller. Check entries.';
errordlg(pid_text);
return
end
% ideal PID controller (TauI, TauD positive)
%----------------------------------------------------------
numPIDi=keps*[TauI*TauD TauI 1];
denPIDi=[1 0];
disp(' ');
disp(' The ideal PID controller is: ');
disp(' ');
disp(' 1 ');
disp(' PI(s) = K*( 1 + ------ + TauD*s) ');
disp(' TauI*s ');
disp(' ');
disp([' K (controller gain) = ', num2str(K)]);
disp([' TauI (integral time constant) = ', num2str(TauI)]);
disp([' TauD (derivative time constant) = ', num2str(TauD)]);
disp(' ');
pid_text=strvcat(pid_text, ' The ideal PID controller is: ');
pid_text=strvcat(pid_text, ' 1 ');
pid_text=strvcat(pid_text, ' PI(s) = K * (1 + ---------- + TauD*s ) ');
pid_text=strvcat(pid_text, ' TauI*s ');
pid_text=strvcat(pid_text, 'where ');
pid_text0='';
pid_text0=['K = ', num2str(K)];
pid_text=strvcat(pid_text, pid_text0 );
pid_text0='';
pid_text0=['TauI = ', num2str(TauI)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=['TauD = ', num2str(TauD)];
pid_text=strvcat(pid_text, pid_text0);
pid_text=strvcat(pid_text, ' ********************************************************************************** ');
pid_text=strvcat(pid_text, '');
if TauI<0
% lag PID controller ( TauI negative, a2<b2)
%----------------------------------------------------------
numPIDL=keps*[a2 a1 1];
denPIDL=conv([1 0],[b2 b1 1]);
temp1=conv(denPs,denPIDL);
temp2=conv(numPs,numPIDL);
PID2lagden=polyadd(conv(temp1,denT),conv(temp2,numT));
PID2lagden=conv(PID2lagden,qdn);
temp1=roots(PID2lagden);
if any(real(temp1) > 0)
disp(' ');
disp(' The 2nd order lag PID controller is unstable.');
disp(' ');
else
disp(' ');
disp(' The 2nd order lag PID controller is: ');
disp(' ');
disp(' k (a2*s^2+a1*s+1) ');
disp(' PIDL(s) = --- ----------------- ');
disp(' s (b2*s^2+b1*s+1) ');
disp(' ');
disp([' where k = ', num2str(keps)]);
disp([' a2 = ', num2str(a2)]);
disp([' a1 = ', num2str(a1)]);
disp([' b2 = ', num2str(b2)]);
disp([' b1 = ', num2str(b1)]);
disp(' ');
end
pid_text=strvcat(pid_text, ' The 2nd lag PID controller (green) is: ');
pid_text=strvcat(pid_text, ' k a2*s^2+a1*s+1 ');
pid_text=strvcat(pid_text, ' PIDL(s) = --- ------------------------------- ');
pid_text=strvcat(pid_text, ' s b2*s^2+b1*s+1) ');
pid_text=strvcat(pid_text, ' where ');
pid_text0='';
pid_text0=['k = ', num2str(keps)];
pid_text=strvcat(pid_text, pid_text0 );
pid_text0='';
pid_text0=['a2 = ', num2str(a2)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=['a1 = ', num2str(a1)];
pid_text=strvcat(pid_text, pid_text0);
pid_text0='';
pid_text0=['b2 = ', num2str(b2)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=['b1 = ', num2str(b1)];
pid_text=strvcat(pid_text, pid_text0);
pid_text=strvcat(pid_text, ' ********************************************************************************** ');
% Floating I controller (TauD negative)
%----------------------------------------------------------
Kp=REVnumPinvs(1)/REVdenPinvs(1);
if ord~=0
KI=[1/Kp/(ord*E(2))];
else
KI=[1/Kp];
end
denI=[1 0];
temp1=conv(denPs,denI);
temp2=conv(numPs,KI);
PID_FIden=polyadd(conv(temp1,denT),conv(temp2,numT));
PID_FIden=conv(PID_FIden,qdn);
temp1=roots(PID_FIden);
if any(real(temp1) > 0)
disp(' ');
disp(' The floating integral controller is unstable.');
disp(' ');
else
disp(' ');
disp(' The floating integral controller is: ');
disp(' ');
disp(' K ');
disp(' PI(s) = ----- ) ');
disp(' s ');
disp(' ');
disp([' K (controller gain) = ', num2str(KI)]);
disp(' ');
end
pid_text=strvcat(pid_text, ' The floating integral controller is: ');
pid_text=strvcat(pid_text, ' k ');
pid_text=strvcat(pid_text, ' PI(s) = --- ');
pid_text=strvcat(pid_text, ' s ');
pid_text=strvcat(pid_text, ' where ');
pid_text0='';
pid_text0=[' k = ', num2str(KI)];
pid_text=strvcat(pid_text,pid_text0);
pid_text=strvcat(pid_text, ' ********************************************************************************** ');
if a2>b2
% realizable PID controler (TauI negative, a2>b2)
%----------------------------------------------------------
numPIDa2=keps*[(a2-b2) a1 1];
denPIDa2=[b1 1 0];
temp1=conv(denPs,denPIDa2);
temp2=conv(numPs,numPIDa2);
PID_APXden=polyadd(conv(temp1,denT),conv(temp2,numT));
PID_APXden=conv(PID_APXden,qdn);
temp1=roots(PID_APXden);
if any(real(temp1) > 0)
disp(' ');
disp(' The 1st order lag PID controller is unstable.');
disp(' ');
else
disp(' ');
disp(' The 1st order lag PID controller is: ');
disp(' ');
disp(' k (a2-b2)*s^2+a1*s+1 ');
disp(' PIDA2(s) = --- -------------------- ');
disp(' s (b1*s+1) ');
disp(' ');
disp([' where k = ', num2str(keps)]);
disp([' a2 = ', num2str(a2)]);
disp([' a1 = ', num2str(a1)]);
disp([' b2 = ', num2str(b2)]);
disp([' b1 = ', num2str(b1)]);
disp(' ');
end
pid_text=strvcat(pid_text, ' The 1st order lag PID controller is ');
pid_text=strvcat(pid_text, ' k (a2-b2)*s^2+a1*s+1 ');
pid_text=strvcat(pid_text, ' PIDA2(s) = --- --------------------------------- ');
pid_text=strvcat(pid_text, ' s (b1*s+1) ');
pid_text=strvcat(pid_text,' where ');
pid_text0='';
pid_text0=['k = ', num2str(keps)];
pid_text=strvcat(pid_text, pid_text0 );
pid_text0='';
pid_text0=['a2 = ', num2str(a2)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=['a1 = ', num2str(a1)];
pid_text=strvcat(pid_text, pid_text0);
pid_text0='';
pid_text0=['b2 = ', num2str(b2)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=['b1 = ', num2str(b1)];
pid_text=strvcat(pid_text, pid_text0);
pid_text=strvcat(pid_text, ' ********************************************************************************** ');
end
elseif TauD<0
% PI/lag controler (TauD negative)
%----------------------------------------------------------
numPIL=K*[1 TauI+abs(TauD)];
denPIL=[TauI*abs(TauD) TauI 0];
temp1=conv(denPs,denPIL);
temp2=conv(numPs,numPIL);
PI_lagden=polyadd(conv(temp1,denT),conv(temp2,numT));
PI_lagden=conv(PI_lagden,qdn);
temp1=roots(PI_lagden);
if any(real(temp1) > 0)
disp(' ');
disp(' The PI*lag controller is unstable.');
disp(' ');
else
disp(' ');
disp(' The PI*lag controller is: ');
disp(' ');
disp(' K 1+(TauI+abs(TauD))*s ');
disp(' PIL(s) = ------ * ---------------------- ');
disp(' TauI*s abs(TauD)*s+1 ');
disp(' ');
disp([' K (controller gain) = ', num2str(K)]);
disp([' TauI (integral time constant) = ', num2str(TauI)]);
disp([' abs(TauD) (derivative time constant) = ', num2str(abs(TauD))]);
disp(' ');
end
pid_text=strvcat(pid_text, ' The PI*lag controller is: ');
pid_text=strvcat(pid_text, ' K 1+(TauI+abs(TauD))*s ');
pid_text=strvcat(pid_text, 'PIL(s) = ---------- * ------------------------------------- ');
pid_text=strvcat(pid_text, ' TauI*s abs(TauD)*s+1 ');
pid_text=strvcat(pid_text, ' where ');
pid_text0='';
pid_text0=[' K (controller gain) = ', num2str(K)];
pid_text=strvcat(pid_text, pid_text0 );
pid_text0='';
pid_text0=[' TauI (integral time constant) = ', num2str(TauI)];
pid_text=strvcat(pid_text,pid_text0);
pid_text0='';
pid_text0=[' abs(TauD) (derivative time constant) = ', num2str(abs(TauD))];
pid_text=strvcat(pid_text, pid_text0);
pid_text=strvcat(pid_text, ' ********************************************************************************** ');
pid_text=strvcat(pid_text, '');
% PI controler (TauD negative)
%----------------------------------------------------------
numPI=K*[TauI 1];
denPI=[TauI 0];
temp1=conv(denPs,denPI);
temp2=conv(numPs,numPI);
PI_deng=polyadd(conv(temp1,denT),conv(temp2,numT));
PI_deng=conv(PI_deng,qdn);
temp1=roots(PI_deng);
if any(real(temp1) > 0)
disp(' ');
disp(' The PI controller is unstable.');
disp(' ');
else
disp(' ');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -