diff --git a/matlab/DeltaTauOptimizer.m b/matlab/DeltaTauOptimizer.m index 59da7aa..93cc10a 100644 --- a/matlab/DeltaTauOptimizer.m +++ b/matlab/DeltaTauOptimizer.m @@ -9,23 +9,28 @@ function DeltaTauOptimizer() if isempty(mot) mot=identifyFxFyStage(7); end - %SIM1=[1 1; 1 2; 8 2; 9 2]; + %SIM1=[1 1; 1 2; 8 2; 9 2;9 3]; %SIM2=[1 1; 1 2; 8 2; 9 2]; - SIM1=[10 0;7 3]; - SIM1=[10 0]; - %SIM2=[9 0]; - if 1 || isempty(simData1) + SIM1=[9 1; 9 2; 9 3; 9 4]; + SIM2=[9 1; 9 2; 9 3; 9 4]; + %SIM2=[8 1; 8 2; 8 3; 8 4]; + %SIM2=[8 1; 8 2; 9 1; 9 2]; + %SIM2=[8 2; 9 2;8 3; 9 3]; + %SIM2=[8 3; 9 3;8 4; 9 4]; + %SIM2=[9 4;9 0]; + %SIM2=[8 3; 9 3]; + if isempty(simData1) close all; simData1=ExecSim(mot{1},SIM1); end - %if isempty(simData2) - % close all; - % simData2=ExecSim(mot{2},SIM2); - %end + if isempty(simData2) + close all; + simData2=ExecSim(mot{2},SIM2); + end close all; %test() bodeSim(simData1); - %bodeSim(simData2); + bodeSim(simData2); end function test() @@ -37,7 +42,15 @@ function test() %pb.C=[1 -1.3236 6.2472 -11.8555 11.3067 -5.4188 1.0440]; %pb.D=[1.0000 -6.6330 17.6945 -24.5314 18.7409 -7.5020 1.2309]; global tfs - tfz=c2d(tf(tfs),1/5000) + Ts=1/5000; + frq0=55;d0=.5; + frq1=85;d1=.5; + w0=frq0*2*pi; + w1=frq1*2*pi; + tf0=tf([w0^2],[1 2*d0*w0 w0^2 ]) + tf1=tf([1 2*d1*w1 w1^2 ],[w1^2]) + tfs=tf0*tf1 + tfz=c2d(tfs,Ts) h=bodeplot(tfz,tfs);setoptions(h,'FreqUnits','Hz','Grid','on'); pb.C=tfz.Numerator{1}; pb.D=tfz.Denominator{1}; @@ -59,26 +72,7 @@ function test() % tfz=c2d(tfs,1/5000) % h=bodeplot(tfs,tfz) % setoptions(h,'FreqUnits','Hz','Grid','on'); - - - %C=num=0 -1.3236 6.2472 -11.8555 11.3067 -5.4188 1.0440 - %D=den=1.0000 -6.6330 17.6945 -24.5314 18.7409 -7.5020 1.2309 - % controlSystemDesigner('bode',1,tf(1,1)) - % controlSystemDesigner( 1/simData2(2).tfEst2) - % controlSystemDesigner(tfa) - - %C = - % 1035.3 (s+217.8) - % ------------------- - % (s+845.3) (s+266.8) - - % 0.18956 (z-0.9574) - % -------------------- - % (z-0.948) (z-0.8444) - -% 0.1896 z - 0.1815 -% ---------------------- -% z^2 - 1.792 z + 0.8006 +% controlSystemDesigner(tfa) end @@ -132,5 +126,6 @@ function simData=bodeSim(simData) grid(ax1,'on');grid(ax2,'on'); set(ax1, 'XScale', 'log'); set(ax2, 'XScale', 'log'); + linkaxes([ax1,ax2],'x') legend('Location','best'); end \ No newline at end of file diff --git a/matlab/DeltaTauParam.m b/matlab/DeltaTauParam.m index c6e2757..b6f6694 100644 --- a/matlab/DeltaTauParam.m +++ b/matlab/DeltaTauParam.m @@ -36,38 +36,22 @@ function [pb]=DeltaTauParam(mot,mdl,param) pb.ss_plt=mot.ss_dq;desc=desc+"dq"; pb.sel={3,[3]}; end desc=desc+" param:"; + curr2acc=mot.mdl.numq; %curr2acc curr_bit to acceleration: zero dB of simplified motion + pb.curr2acc=curr2acc; if mot.id==1 %!motor_servo(mot=1,ctrl='ServoCtrl',Kp=25,Kvfb=400,Ki=0.02,Kvff=350,Kaff=5000,MaxInt=1000) %!motor(mot=1,dirCur=0,contCur=800,peakCur=2400,timeAtPeak=1,IiGain=5,IpfGain=8,IpbGain=8,JogSpeed=10.,numPhase=3,invDir=True,servo=None,PhasePosSf=1./81250,PhaseFindingDac=100,PhaseFindingTime=50,SlipGain=0,AdvGain=0,PwmSf=10000,FatalFeLimit=200,WarnFeLimit=100,InPosBand=2,homing='enc-index') switch param case 0 %scratch desc=desc+"scratch"; - pl=[-300+550i -300-550i -2513]; - [Am,Bm,Cm,Dm]=ssdata(mot.ss_dq); - K = place(Am,Bm,pl); - V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) - V=V(end); - Kfb=K*(Cm^-1); - pb.V=V; - pb.Kfb=Kfb; - - pb.Kp=V; - pb.B=Kfb(3)/V; - pb.Kvfb=Kfb(2)/pb.Ts; - fprintf('Kp:%f B:%f Kvfb:%f Kafb:%f\n',pb.Kp,pb.B,pb.Kvfb,pb.Kafb); - - pb.Kvff=1*pb.Kvfb; - pb.Kafb=0;%Kfb(1)/(pb.Ts^2); - pb.Kaff=1*1/(1.548e04*(pb.Ts^2)); - pb.Ki=0.02; - pb.MaxInt=1000; case 1 %origin parameters desc=desc+"orig"; pb.Kp=25;pb.Kvfb=400;pb.Ki=0.02;pb.Kvff=350;pb.Kaff=5000;pb.MaxInt=1000; case 2%enhances first step - desc=desc+"2"; - pb.Kp=25;pb.Kvfb=350;pb.Ki=0.02;pb.Kvff=350;pb.Kaff=1/(1.548e04*(pb.Ts^2));pb.MaxInt=1000; - case 3%pole placement on simplified motion tf + desc=desc+"opt1"; + pb.Kp=25;pb.Kvfb=350;pb.Ki=0.02;pb.Kvff=350;pb.Kaff=1/(curr2acc*(pb.Ts^2));pb.MaxInt=1000; + case 3 %pole placement on ss_dq (simplified motion, no current loop) + desc=desc+"pp ss\_q"; pl=[-1400 -1440]; pl=[-300+350i -300-350i]; [Am,Bm,Cm,Dm]=ssdata(mot.ss_q); @@ -81,13 +65,31 @@ function [pb]=DeltaTauParam(mot,mdl,param) pb.Kp=V; pb.B=Kfb(2)/V; pb.Kvfb=Kfb(1)/pb.Ts; - fprintf('Kp:%f B:%f Kvfb:%f\n',pb.Kp,pb.B,pb.Kvfb); - pb.Kvff=pb.Kvfb; - pb.Kafb=0; - pb.Kaff=1/(1.548e04*(pb.Ts^2)); + pb.Kaff=1/(curr2acc*(pb.Ts^2)); pb.Ki=0.01; % lower pb.MaxInt=1000; + fprintf('Kp:%f B:%f Kvfb:%f\n',pb.Kp,pb.B,pb.Kvfb); + case 4 %pole placement on ss_dq (simplified motion, simplified current loop) + desc=desc+"pp ss\_dq"; + pl=[-300+350i -300-350i -2513]; + [Am,Bm,Cm,Dm]=ssdata(mot.ss_dq); + K = place(Am,Bm,pl); + V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) + V=V(end); + Kfb=K*(Cm^-1); + pb.V=V; + pb.Kfb=Kfb; + + pb.Kp=V; + pb.B=Kfb(3)/V; + pb.Kvfb=Kfb(2)/pb.Ts; + pb.Kvff=1*pb.Kvfb; + pb.Kafb=Kfb(1)/(curr2acc*(pb.Ts^2)); + pb.Kaff=1*1/(curr2acc*(pb.Ts^2))+pb.Kafb; + pb.Ki=0.01; + pb.MaxInt=1000; + fprintf('Kp:%f B:%f Kvfb:%f Kafb:%f\n',pb.Kp,pb.B,pb.Kvfb,pb.Kafb); end %pb.Kp=0.1;pb.Kvfb=0;pb.Ki=0.00;pb.Kvff=0;pb.Kaff=1/(1.548e04*(pb.Ts^2));pb.MaxInt=1000; %filter [z^0 z^-1 ... z^-n]; @@ -100,14 +102,76 @@ function [pb]=DeltaTauParam(mot,mdl,param) switch param case 0 %scratch desc=desc+"scratch"; - pb.Kp=22;pb.Kvfb=450;pb.Ki=0.02;pb.Kvff=450;pb.Kaff=4517;pb.MaxInt=1000; + pb.Kp=20.3255; + pb.Kvfb=582.4551;pb.Kvff=582.4551; + pb.Kaff=5595.2;pb.Kafb=1077.9; + pb.Ki=0.01;pb.MaxInt=1000; + +% Ts=pb.Ts; +% frq=75;d=.6; +% w0=frq*2*pi; +% tfs=tf([w0^2],[1 2*d*w0 w0^2 ]) +% global currTf +% frq0=55;d0=.5; +% frq1=85;d1=.5; +% w0=frq0*2*pi; +% w1=frq1*2*pi; +% tf0=tf([w0^2],[1 2*d0*w0 w0^2 ]) +% tf1=tf([1 2*d1*w1 w1^2 ],[w1^2]) +% tfs=tf0*tf1 +% tfz=c2d(tfs,Ts) +% h=bodeplot(tfz,tfs);setoptions(h,'FreqUnits','Hz','Grid','on'); +% pb.C=tfz.Numerator{1}; +% pb.D=tfz.Denominator{1}; +% currTf=tfz + case 1 %origin parameters desc=desc+"orig"; pb.Kp=22;pb.Kvfb=350;pb.Ki=0.02;pb.Kvff=240;pb.Kaff=1500;pb.MaxInt=1000; case 2%enhances first step - desc=desc+"2"; + desc=desc+"opt1"; pb.Kp=22;pb.Kvfb=450;pb.Ki=0.02;pb.Kvff=450;pb.Kaff=4517;pb.MaxInt=1000; %pb.Kp=22;pb.Kvfb=350;pb.Ki=0.02;pb.Kvff=240;pb.Kaff=3500;pb.MaxInt=1000; + case 3 %pole placement on ss_dq (simplified motion, no current loop) + desc=desc+"pp ss\_q"; + pl=[-300+100i -300-100i]; + [Am,Bm,Cm,Dm]=ssdata(mot.ss_q); + K = place(Am,Bm,pl); + V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) + V=V(end); + Kfb=K*(Cm^-1); + pb.V=V; + pb.Kfb=Kfb; + + pb.Kp=V; + pb.B=Kfb(2)/V; + pb.Kvfb=Kfb(1)/pb.Ts; + pb.Kvff=pb.Kvfb; + pb.Kaff=1/(curr2acc*(pb.Ts^2)); + pb.Ki=0.01; % lower + pb.MaxInt=1000; + fprintf('Kp:%f B:%f Kvfb:%f\n',pb.Kp,pb.B,pb.Kvfb); + case 4 %pole placement on ss_dq (simplified motion, simplified current loop) + desc=desc+"pp ss\_dq"; + %pole(mot.ss_dq) + pl=[-300+150i -300-150i -2513]; + [Am,Bm,Cm,Dm]=ssdata(mot.ss_dq); + K = place(Am,Bm,pl); + V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) + V=V(end); + Kfb=K*(Cm^-1); + pb.V=V; + pb.Kfb=Kfb; + + pb.Kp=V; + pb.B=Kfb(3)/V; + pb.Kvfb=Kfb(2)/pb.Ts; + pb.Kvff=1*pb.Kvfb; + pb.Kafb=Kfb(1)/(curr2acc*(pb.Ts^2)); + pb.Kaff=1*1/(curr2acc*(pb.Ts^2))+pb.Kafb; + pb.Ki=0.01; + pb.MaxInt=1000; + fprintf('Kp:%f B:%f Kvfb:%f Kafb:%f\n',pb.Kp,pb.B,pb.Kvfb,pb.Kafb); end %11.84Hz 0dB K=(11.84*2*np.pi)**2=5534.3 Ts=5kHz=.2ms %Kaff = 1/(Ts*Ts*K) = 1/((11.84*2*np.pi)**2/5000**2) = 4517.278506241803 diff --git a/matlab/DeltaTauSim.slx b/matlab/DeltaTauSim.slx index e1436a9..d48de44 100644 Binary files a/matlab/DeltaTauSim.slx and b/matlab/DeltaTauSim.slx differ diff --git a/matlab/identifyFxFyStage.m b/matlab/identifyFxFyStage.m index 85e1b36..d217888 100644 --- a/matlab/identifyFxFyStage.m +++ b/matlab/identifyFxFyStage.m @@ -299,7 +299,6 @@ function motCell=identifyFxFyStage(mode) mot.ss_dq.Name='simplified mechanics, simplified current loop, no resonance'; tfq.InputName{1}=s;%restore - %h=bodeplot(mot.meas,'r',mot.tf4_2,'b',mot.tf6_4,'g'); %h=bodeplot(mot.meas,'r',mot.tf2_0,'b',mot.tf_mdl,'g',mot.w); plotBode(mot) @@ -413,6 +412,15 @@ function motCell=identifyFxFyStage(mode) mot.ss_qr.Name='simplified mechanics, no current loop, resonance'; tfp.InputName{1}=s;%restore + % u +-----------+ y + %iqCmd------->|1 1|-------> iqMeas + % | 2|-------> actVel + % | 3|-------> actPos + % +-----------+ + s=tfq.InputName{1};tfq.InputName{1}='iqMeas'; + mot.ss_dq=connect(tfd,tfq,'iqCmd',{'iqMeas','actVel','actPos'}); + mot.ss_dq.Name='simplified mechanics, simplified current loop, no resonance'; + tfq.InputName{1}=s;%restore plotBode(mot) end