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

📄 sys_design.m

📁 很优良的PID控制器设计仿真程序与模型,经过严格检验
💻 M
📖 第 1 页 / 共 3 页
字号:
%sys_design is the function used in CtrlLAB for administrating system design tasks.
%
%Available Design Tasks are:
%
%  1 for lead/lag compensator design
%  2 for LQ optimal regulator/controller
%  3 for pole placement regulator/controller
%  4 for model following control
%  5 for LQG control
%  6 for LQG/LTR control
%  7 for H2 optimal control
%  8 for H_inf standard control
%  9 for H_inf optimal control
% 10 for mu-synthesis (not available now)
%
%Besides, PID controller designs are in a separate module.
%
%Available lists of functions under this module
%
%  leadlag_design -- lead-lag compensator design 
%  ll_compn -- the lead-lag compensator design algorithm
%  state_fdbk -- administrates the state-feedback 
%  model_follow - the model following compensator design
%  lqgltr_design -- LQG and LQG/LTR controller design
%  robust_design -- administrates robust controller design facilities
%  std_tf -- find the standard transfer function
%  get_tf -- find the transfer function from N/D strings
%  shw_controller -- set and display the controller
%

%Designed by Professor Dingyu Xue
%School of Information Science and Engineering, Northeastern University
%Shenyang 110006, P R China
%Email: xue_dy@hotmail.com
%
%This module is for CtrllAB 3.0, (c) 1996-1999
%Last modified 16 October, 1999
%------------------------------------------------------------------------------

function sys_design(nTask,arg1,arg2)

switch nTask
case 1
   if nargin==1, lead_lag_design(nTask);
   else, lead_lag_design(1,arg1); end
case {2,3}
   if nargin==1, state_fdbk(nTask);
   else, state_fdbk(2,arg1); end
case 4
   if nargin==1, model_follow(nTask);
   else, model_follow(nTask,arg1); end
case {5,6}
   if nargin==1, lqgltr_design(nTask);
   else, lqgltr_design(5,arg1); end
case {7,8,9,10}
   switch nargin
   case 1, robust_design(nTask);
   case 2, robust_design(7,arg1); 
   case 3, robust_design(7,arg1,arg2); 
   end
otherwise
     
end      

%----------------------------------------------
%leadlag_design for lead-lag compensator design 
%----------------------------------------------
function lead_lag_design(nTask, arg1)

%show the lead-lag controller dialog box
if nargin==1
   g_leadlag=findobj('Tag','CtrlLABLeadLag');
   if length(g_leadlag)==0 
      g_leadlag=figure('Units','normalized','Position',[0.18625 0.248 0.375 0.267],...
         'MenuBar','none','Color',0.8*[1,1,1],'Resize','off','Tag','CtrlLABLeadLag',...
         'NumberTitle','off','Name','Lead/Lag Controller Specifications','Resize','off');
      extra_funs(1); display_str(0.03,0.90,'Phase Margin \gamma',[0,0,0],'on',9);
      uicontrol('Tag','Gam','Style','Edit','String','50',...
         'Units','normalized','Position',[0.45,0.83,0.22,0.13],...
         'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      display_str(0.03,0.72,'Crossover Frequency \omega_c',[0,0,0],'on',9);
      uicontrol('Tag','Wc','Style','Edit','String','1',...
         'Units','normalized','Position',[0.45,0.65,0.22,0.13],...
         'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      display_str(0.03,0.54,'Error Coefficient K_v',[0,0,0],'on',9);
      uicontrol('Tag','Kv','Style','Edit','String','10',...
         'Units','normalized','Position',[0.45,0.47,0.22,0.13],...
         'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      display_str(0.03,0.36,'Compensator Type',[0,0,0],'on',9);
      uicontrol('Tag','Lst','Style','ListBox','String','Auto|Lead|Lag|Leag-Lag',...
         'Units','normalized','Position',[0.40,0.04,0.29,0.37],...
         'Value',1,'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      uicontrol('Style','PushButton','String','Design',...
         'Units','normalized','Position',[0.75,0.80,0.22,0.15],'CallBack','sys_design(1,1);');
      uicontrol('Style','PushButton','String','Cancel',...
         'Units','normalized','Position',[0.75,0.62,0.22,0.15],'CallBack','delete(gcf);');
      uicontrol('Style','PushButton','String','Help',...
         'Units','normalized','Position',[0.75,0.44,0.22,0.15],'Callback','clab_help(10)');
      uicontrol('Style','PushButton','String','Maximise Wc',...
         'Units','normalized','Position',[0.73,0.10,0.26,0.15],'CallBack','sys_design(1,2);');
   else, figure(g_leadlag); end
else
   g0=gcf;
   g_Gam=findobj(g0,'Tag','Gam'); g_Wc=findobj(g0,'Tag','Wc');
   g_Kv=findobj(g0,'Tag','Kv'); g_list=findobj(g0,'Tag','Lst');
   Gam_c=eval(get(g_Gam,'String')); Wc=eval(get(g_Wc,'String')); 
   Kv=eval(get(g_Kv,'String')); kLeagLag=get(g_list,'Value')-1;
   uu0=get(findobj('Tag','CtrlLABMain'),'UserData'); 
   g1=get(uu0{1}(1),'UserData'); G_Sys=tf(g1{2}); 
   g4=get(uu0{1}(4),'UserData'); Td=g4{1}; 
   if arg1==1
      Gc_Sys=ll_compn(Wc,Gam_c,Kv,kLeagLag,G_Sys,Td); shw_controller(Gc_Sys);
   else arg1==2
      GGc_tmp=num2str(Gam_c); GGW_tmp=num2str(Wc); GGK_tmp=num2str(Kv);
      key=1; W1=0.01; W2=1000; Gc1=ll_compn(W1,Gam_c,Kv,kLeagLag,G_Sys,Td);
      [Gm,P1,Wcg,Wcp]=margin(Gc1*G_Sys);
      Gc2=ll_compn(W2,Gam_c,Kv,kLeagLag,G_Sys,Td);
      [Gm,P2,Wcg,Wcp]=margin(Gc2*G_Sys); PP=[]; d=10;
      if P2>(1-0.05)*Gam_c, key=0; Wc=1000; end
      ww=[]; ii=0;
      while (key==1)
         Wc=10^((log10(W1)+log10(W2))/2); Gcn=ll_compn(Wc,Gam_c,Kv,kLeagLag,G_Sys,Td);
         [Gm,P0,Wcg,Wcp]=margin(Gcn*G_Sys); 
         ww=[ww;W1,W2,P1,P2,Wc,P0]; PP=[PP;P1,P2,P0,W1,W2,Wc,d];
         if xor((P1>0.95*Gam_c),(P0>0.95*Gam_c)), 
            d=(W2-Wc); W2=Wc; P2=P0; ii=ii+1;
         elseif xor((P0>0.95*Gam_c),(P2>0.95*Gam_c)), 
            d=(Wc-W1); W1=Wc; P1=P0; ii=ii+1;
         end
         if abs(d)<0.001, key=0; end
      end
      set(g_Wc,'String',num2str(Wc));
   end
end   

%--------------------------------------------------------------
%ll_compn implements the lead-lag compensator design algorithm.
%
%  G2=ll_compn(Wc,Gam_c,Kv,kLeadLag,G1,Td)
%where 
%  G2 -- the designed controller
%  Wc -- expected cross-over frequency
%  Gam_c -- expected phase margin
%  Kv -- the steady state error tolerance
%  kLeadLag -- the format of lead/lag controller
%  G1,Td -- the plant model with delay
%--------------------------------------------------------------
function G2=ll_compn(Wc,Gam_c,Kv,kLeadLag,G1,Td)

[G_n,G_d]=tfdata(G1,'v'); [Gai,Pha]=bode(G1,Wc); Pha=Pha-Td*Wc*180/pi;
Phi_c=sin((Gam_c-Pha-180)*pi/180); a=G_d(end:-1:1); ii=find(abs(a)<=0); 
if length(ii)>0
   if ii(1)>1, a=a(ii(1)+1); else, a=a(ii(1)+1); end
else, a=a(1); end;
alpha=sqrt((1-Phi_c)/(1+Phi_c)); Zc=alpha*Wc; Pc=Wc/alpha;
Kc=sqrt((Wc*Wc+Pc*Pc)/(Wc*Wc+Zc*Zc))/Gai; K1=G_n(end)*Kc*alpha/a;

%set the leag/lag compensator mode
if kLeadLag==0,
   kLeadLag=1; if Phi_c<0, kLeadLag=2; else, if K1<Kv, kLeadLag=3; end, end
end

if kLeadLag==1, G2=tf([1 Zc]*Kc,[1 Pc]); 
elseif kLeadLag==2, Kc=1/Gai; K1=G_n(end)*Kc/a; G2=tf([1 0.1*Wc],[1 0.1*K1*Wc/Kv]); 
elseif kLeadLag==3
   Zc2=Wc*0.1; Pc2=K1*Zc2/Kv; G2=tf(Kc*conv([1 Zc],[1,Zc2]),conv([1 Pc],[1,Pc2])); 
end

%--------------------------------------------------------------
%state_fdbk administrates the state-feedback compensator design
%
%   state_fdbk(nTask,arg1)
%where
%   nTask=2 for LQ, 3 for pole placement
%--------------------------------------------------------------
function state_fdbk(nTask,arg1)
uu0=get(findobj('Tag','CtrlLABMain'),'UserData'); g1=get(uu0{1}(1),'UserData'); 
G_Sys=tf(g1{2}); n=length(G_Sys.den{1})-1;
if nargin==1
   g_state=findobj('Tag','CtrlLABStateFdbk');
   if length(g_state)==0
      g_state=figure('Units','normalized','Position',[0.18625 0.248 0.45 0.367],...
         'NumberTitle','off','Name','State Spece Design','Tag','CtrlLABStateFdbk',...
         'MenuBar','none','Color',0.8*[1,1,1],'Resize','off');
      extra_funs(1); hh=extra_funs(10,[0.04,0.05],[0.52,0.38]);
      uicontrol('Style','Text','String','Feedback Scheme',...
         'Units','normalized','Position',[0.06,0.34,0.33,0.06],'BackgroundColor',0.8*[1,1,1]);
      [v,d]=version; v1=eval(v(1)); v2=eval(v(3)); v3=eval(v(5));
      if v2==2 & v3==0, strRadio='ToggleButton'; else, strRadio='RadioButton'; end 
      ud2(1)=uicontrol('Style',strRadio,'String','State Feedback','Value',1,...
         'Units','normalized','Position',[0.07,0.23,0.38,0.06],...
         'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,1);');
      ud2(2)=uicontrol('Style',strRadio,'String','Observer-based','Value',0,...
         'Units','normalized','Position',[0.07,0.14,0.38,0.06],...
         'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,2);');
      [xL,ud2(3)]=display_str(0.05,0.65,'Expected Poles for Observer',[0,0,0],'off',9);
      tmpPVec='['; for i=1:n, tmpPVec=[tmpPVec, '-10; ']; end
      tmpPVec=[tmpPVec(1:end-2), ']'];  
      ud2(4)=uicontrol('Style','Edit','String',tmpPVec,'Visible','off',...
         'Units','normalized','Position',[.08 .50 .6 .09],...
         'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      if nTask==2
         tmpQMat='diag(['; for i=1:n, tmpQMat=[tmpQMat, '1, ']; end
         tmpQMat=[tmpQMat(1:end-2), '])'];  
         txtVec=['Enter Q matrix, while R=1  (order of system=',int2str(n),')'];
         [xL,ud2(5)]=display_str(0.05,0.94,txtVec,[0,0,0],'on',9);
         ud2(6)=uicontrol('Style','Edit','String',tmpQMat,...
            'Units','normalized','Position',[.08 .74 .6 .09],...
            'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      elseif nTask==3
         txtVec=['Expected poles (order of system=',int2str(n),')'];
         [xL,ud2(5)]=display_str(0.05,0.94,txtVec,[0,0,0],'on',9);
         tmpVVec='[';  
         for i=1:n, tmpVVec=[tmpVVec, '-10, ']; end
         tmpVVec=[tmpVVec(1:end-2), ']'];  
         ud2(6)=uicontrol('Style','Edit','String',tmpVVec,...
            'Units','normalized','Position',[.08 .79 .6 .09],...
            'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
      end
      uicontrol('Style','PushButton','String','Design',...
         'Units','normalized','Position',[0.80,0.84,0.18,0.11],...
         'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,4);');
      uicontrol('Style','PushButton','String','Cancel',...
         'Units','normalized','Position',[0.80,0.71,0.18,0.11],...
         'BackgroundColor',0.8*[1,1,1],'CallBack','delete(gcf);');
      uicontrol('Style','PushButton','String','Help',...
         'Units','normalized','Position',[0.80,0.58,0.18,0.11],...

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -