⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid2df.m

📁 Software for design and tuninig of SISO and MIMO contol systems
💻 M
📖 第 1 页 / 共 2 页
字号:
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 + -