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

📄 mo2ovr2.m

📁 机器人控制仿真程序一书的所有源代码
💻 M
字号:
function mo2ovr2(flag)
% MO2OVR2 Mouse-implemented 2/2 element. (Utility Function)
%         MO2OVR2 determines the 2/2 value to be added from various
%         mouse motions within the IDEs.

% Author: Craig Borghesani
% 3/25/94
% Copyright (c) 1995-98 by The MathWorks, Inc.
%       $Revision: 1.4 $

f=gcf;
bthan=get(f,'userdata');
infmat=get(bthan(16),'userdata');
lomat=get(bthan(1),'userdata');
nom=get(bthan(2),'userdata');
cont=get(bthan(3),'userdata');
cont2 = get(bthan(31),'userdata');
hint_bar = get(bthan(36),'userdata');

w=lomat(1,:);
T=get(bthan(13),'userdata');
delay=infmat(10,1);
if infmat(9,1)==3, axs=infmat(2,3:4);
else axs=infmat(1,:); end
am = infmat(24,1);
ap = infmat(24,2);
txt1 = infmat(30,1);
txt2 = infmat(30,2);

if flag==0,
 if ~length(cont2),
  obj=get(f,'currentobject');
  p_obj=get(obj,'parent');
  if ~p_obj,
   a=get(f,'currentaxes');
  elseif p_obj==f,
   a=obj;
  else
   a=p_obj;
  end
  pt=get(a,'currentpoint');
  if infmat(9,1)==1,
   kw=qfindfrq(pt(1,1),pt(1,2),lomat,a);
   if length(kw),
    set(infmat(6,1),'xdata',qfixfase(lomat(2,:),axs,kw),...
                    'ydata',20*log10(abs(lomat(2,kw))),...
                    'vis','on');
   end
  elseif a==am | a==ap,
   if a==am,
    kw=qfindfrq(pt(1,1),pt(1,2),lomat,am);
   else
    kw=qfindfrq(pt(1,1),pt(1,2),lomat(2,:),axs,w,2);
   end
   if length(kw),
    set(infmat(6,1),'xdata',w(kw),'ydata',20*log10(abs(lomat(2,kw))),'vis','on');
    set(infmat(6,2),'xdata',w(kw),'ydata',qfixfase(lomat(2,:),axs,kw),'vis','on');
   end
  end
  if length(kw),
   set(f,'windowbuttonmotionfcn','mo2ovr2(1)',...
         'windowbuttonupfcn','mo2ovr2(2)');
   lomat(3,:)=lomat(2,:);
   infmat(3,3)=kw;
   infmat(4,3)=lomat(2,kw);
   set(hint_bar,'string','Now, drag the marker to ADD the 2/2 element based on mag and phase differences');
   set(bthan(1),'userdata',lomat);
   set(bthan(16),'userdata',infmat);
  end
 else
  set(f,'windowbuttonmotionfcn','mo2ovr2(1)',...
        'windowbuttonupfcn','mo2ovr2(2)');
  set(hint_bar,'string','Now, drag the marker to EDIT the 2/2 element based on mag and phase differences');
 end
elseif flag==1,
 kw=infmat(3,3);
 wval=w(kw);
 p=infmat(4,3);
 go_for_it=0;
 obj=get(f,'currentobject');
 p_obj=get(obj,'parent');
 if ~p_obj,
  a=get(f,'currentaxes');
 elseif p_obj==f,
  a=obj;
 else
  a=p_obj;
 end
 pt=get(a,'currentpoint');
 if infmat(9,1)==1,
  delmag=10^(pt(1,2)/20)/abs(p);
  delph=pt(1,1)-qfixfase(lomat(3,:),axs,kw);
  db_ol=sprintf('%0.2f',pt(1,2));
  ph_ol=sprintf('%0.2f',pt(1,1));
  mag=10^(pt(1,2)/20);
  ph=pi/180*pt(1,1);
  ol=mag*exp(i*ph);
  db_cl=sprintf('%0.2f',20*log10(abs(ol/(1+ol))));
  ph_cl=sprintf('%0.2f',180/pi*qatan4(ol/(1+ol)));
  set(txt1,'string',[ph_ol,'deg,',db_ol,'dB']);
  set(txt2,'string',[ph_cl,'deg,',db_cl,'dB']);
  axislims = infmat(1,:);
 else
  if a==ap,
   delph=pt(1,2)-qfixfase(lomat(2,:),axs,kw);
   delmag = infmat(24,4);
   ph_ol=sprintf('%0.2f',pt(1,2));
   fr_ol=sprintf('%0.2f',pt(1,1));
   set(txt1,'string',['Phase: ',ph_ol,176]);
   set(txt2,'string',['Frequency: ',fr_ol,'rad/sec']);
   axislims = infmat(2,:);
  elseif a==am,
   delmag=10^(pt(1,2)/20)/abs(p);
   delph = infmat(24,3);
   db_ol=sprintf('%0.2f',pt(1,2));
   fr_ol=sprintf('%0.2f',pt(1,1));
   set(txt1,'string',['Magnitude: ',db_ol,'dB']);
   set(txt2,'string',['Frequency: ',fr_ol,'rad/sec']);
   axislims = infmat(1,:);
  end
 end
 if abs(delph)<176 & delph~=0,
  [contnew,state]=seconsec(delph,delmag,wval,T);
  if any(state==[1,2]), go_for_it=1; end
 else go_for_it = 2; end
 if any(pt(1,1:2)<axislims([1,3]) | pt(1,1:2)>axislims([2,4])),
  go_for_it = 3;
 end
 if ~go_for_it,
  if ~length(cont2),  % adding with the mouse
   if length(nom),
% if there are more than one second order computed, find smallest zeta
    ztaloc=find(contnew(:,4)==3 | contnew(:,4)==4);
    zta=contnew(ztaloc,1);
    wn=contnew(ztaloc,2);
    [zta,loc]=min(zta);
    wn=wn(loc);
    wlt=qfrqenh(wn,zta,w,T);
    if infmat(9,1)==1,
     nlot=qcpqft(nom(1,:),nom(2,:),wlt,T);
     clot=qcntbode(cont,wlt,T).*exp(-i*wlt*delay);
     cpnew=qcntbode(contnew,wlt,T);
     lot=nlot.*clot;
    else
     lot=qcntbode(cont,wlt,T).*exp(-i*wlt*delay);
     cpnew=qcntbode(contnew,wlt,T);
    end
    lomat=[wlt;lot.*cpnew;lot];
   else
    cpnv=qcntbode(contnew,w,T);
    lomat(2,:)=lomat(2,:).*cpnv;
   end
  else  % iterating with the mouse or continuation of adding
   cp=qcntbode(cont2,w,T);
   cpnv=qcntbode(contnew,w,T);
   lomat(2,:)=lomat(2,:).*(cpnv./cp);
  end
  kw=find(lomat(1,:)>=w(kw)); kw=kw(1);
  if infmat(9,1)==1,
   set(infmat(6,1),'xdata',qfixfase(lomat(2,:),axs,kw),...
                   'ydata',20*log10(abs(lomat(2,kw))));
  else
   set(infmat(6,1),'xdata',lomat(1,kw),'ydata',20*log10(abs(lomat(2,kw))));
   set(infmat(6,2),'xdata',lomat(1,kw),'ydata',qfixfase(lomat(2,:),axs,kw));
  end
  infmat(3,3)=kw;
  infmat(4,3)=lomat(3,kw);
  infmat(24,3:4)=[delph,delmag];
  set(bthan(1),'userdata',lomat);
  set(bthan(16),'userdata',infmat);
  set(bthan(31),'userdata',contnew);
  if infmat(9,1)==1, qnicplt(f);
  else mgphplot(f); end
  set(hint_bar,'string','2/2 element being implemented ...');
%  drawnow;
 elseif go_for_it == 1,
  set(hint_bar,'string','Implementation not possible.');
 elseif go_for_it == 2,
  set(hint_bar,'string','Phase difference must be > 0 and < 176 degrees.');
 elseif go_for_it == 3,
  set(hint_bar,'string','Must remain within axis limits.');
 end

elseif flag==2,

 set(f,'windowbuttonmotionfcn','modisp','windowbuttondownfcn','',...
       'windowbuttonupfcn','');
 set(infmat(6,1),'userdata','mo2ovr2(0)');
 set(hint_bar,'string','To continue with EDIT of the 2/2 element re-select the marker');
 drawnow;

end

⌨️ 快捷键说明

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