first optimized parameters with pole pülacement: TODO: check for resonance compensator
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user