From 4927a02706a6c6128b12e6cf9acd0986af4adae9 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Mon, 12 Nov 2018 11:22:30 +0100 Subject: [PATCH] could be first stable observer of motor1 --- matlab/StateSpaceControlDesign.m | 1 + matlab/testObserver.m | 245 ++++++++++++++++++++----------- matlab/testObserverSim.slx | Bin 23907 -> 23926 bytes 3 files changed, 157 insertions(+), 89 deletions(-) diff --git a/matlab/StateSpaceControlDesign.m b/matlab/StateSpaceControlDesign.m index 8a98205..26575cf 100644 --- a/matlab/StateSpaceControlDesign.m +++ b/matlab/StateSpaceControlDesign.m @@ -63,6 +63,7 @@ function [ssc]=StateSpaceControlDesign(mot) p1=-6300+280i; p2=-6200+150i; P=[p1 p1' p2 p2']; + P=[-4000 -4100 -1500+10j -1500-10j]; else p1=-3300+2800i; p2=-2700+500i; diff --git a/matlab/testObserver.m b/matlab/testObserver.m index f8c5abd..ce963dd 100644 --- a/matlab/testObserver.m +++ b/matlab/testObserver.m @@ -1,19 +1,50 @@ function [ssc]=testObserver(mot) %http://ctms.engin.umich.edu/CTMS/index.php?example=Introduction§ion=ControlStateSpace + mdl=1; % 0:hovering ball 1:fast stage + if mdl==0 + A = [ 0 1 0 + 980 0 -2.8 + 0 0 -100 ]; - A = [ 0 1 0 - 980 0 -2.8 - 0 0 -100 ]; + B = [ 0 + 0 + 100 ]; - B = [ 0 - 0 - 100 ]; + C = [ 1 0 0 ]; + D=0; + else + [A,B,C,D]=ssdata(mot.ssMdl); + C=C(3,:);D=D(3); + numc=(mot.mdl.numc); + denc=(mot.mdl.denc); + num1=(mot.mdl.num1); + den1=(mot.mdl.den1); - C = [ 1 0 0 ]; - D=0; - - %[A,B,C,D]=ssdata(mot.ssMdl) - %C=C(3,:);D=D(3); + g1=tf(numc,denc); % iqCmd->iqMeas + s1=ss(g1); + s1.C=[s1.C; 1E5* 2.4E-3 1E-3*s1.C(2)*8.8]; % add output iqVolts: iqVolts= i_meas*R+i_meas'*L 2.4mH 8.8Ohm (took random scaling values) + g2=tf(num1,den1); %iqMeas->ActPos without resonance frequencies + s2=ss(g2); + s3=append(s1,s2); + s3.A(3,2)=s3.C(1,2)*s3.B(3,2); + + %d=.77;w0=9100; %1.44kHz -> T0=6.9046e-04 + %numc=[w0^2]; + %denc=[1 d*2*w0 w0^2]; + %T0=6E-4; %w=1/1E-3=1E3 -> f=w/(2pi)=1000/6.2=159Hz + %numc=[1]; + %denc=[T0^2 d*2*T0 1]; + %bode(numc,denc) + + num=conv(numc,num1);%num=1; + den=conv(denc,den1);%den=[1 0 0]; + g4=tf(num,den); %iqMeas->ActPos + s4=ss(g4); + mot.ssMdl + s3 + s4 + [A,B,C,D]=ssdata(s4); + end Ap=A;Am=A; Bp=B;Bm=B; @@ -24,97 +55,133 @@ function [ssc]=testObserver(mot) disp(poles); - t = 0:0.01:2; - u = zeros(size(t)); - x0 = [0.01 0 0]; - %x0 = [0.1 0 0 0]; + if mdl==0 + t = 0:0.01:2; + u = zeros(size(t)); + x0 = [0.01 0 0]; - sys = ss(A,B,C,D); + sys = ss(A,B,C,D); - [y,t,x] = lsim(sys,u,t,x0); - plot(t,y) - title('Open-Loop Response to Non-Zero Initial Condition') - xlabel('Time (sec)') - ylabel('Ball Position (m)') + [y,t,x] = lsim(sys,u,t,x0); + plot(t,y) + title('Open-Loop Response to Non-Zero Initial Condition') + xlabel('Time (sec)') + ylabel('Ball Position (m)') + + p1 = -10 + 10i; p2 = -10 - 10i; p3 = -50; + K = place(A,B,[p1 p2 p3]); + sys_cl = ss(A-B*K,B,C,0); + lsim(sys_cl,u,t,x0); + xlabel('Time (sec)') + ylabel('Ball Position (m)') + + p1 = -20 + 20i; p2 = -20 - 20i; p3 = -100; + P=[p1 p2 p3]; + K = place(A,B,P); + sys_cl = ss(A-B*K,B,C,0); + lsim(sys_cl,u,t,x0); + xlabel('Time (sec)') + ylabel('Ball Position (m)') + + t = 0:0.01:2; + u = 0.001*ones(size(t)); + + sys_cl = ss(A-B*K,B,C,0); + + lsim(sys_cl,u,t); + xlabel('Time (sec)') + ylabel('Ball Position (m)') + axis([0 2 -4E-6 0]) + + V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) + lsim(sys_cl,V*u,t) + title('Linear Simulation Results (with Nbar)') + xlabel('Time (sec)') + ylabel('Ball Position (m)') + axis([0 2 0 1.2*10^-3]) + else + x0 = [0 0 0 0]; + p1=-63+2.80i; + p2=-62+1.50i; + P=[p1 p1' p2 p2']; + P=[-4000 -4100 -500+10j -500-10j]; + K = place(A,B,P); + Ts=1/5000 + t = 0:Ts:2; + u = 0.001*ones(size(t)); + V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) + sys_cl = ss(A-B*K,B*V,C,0); + + lsim(sys_cl,u,t,x0); + xlabel('Time (sec)') + ylabel('Motor Position (m)') + axis([0 2 0 1.2E-3]) + end + + if mdl==0 + op1 = -100; + op2 = -101; + op3 = -102; + OP=[op1,op2,op3]; + OP=P*2; + L = place(A',C',OP)'; + At = [ A-B*K B*K + zeros(size(A)) A-L*C ]; + Bt = [ B*V + zeros(size(B)) ]; + Ct = [ C zeros(size(C)) ]; + + sys = ss(At,Bt,Ct,0); + %lsim(sys,zeros(size(t)),t,[x0 x0]); + lsim(sys,u,t,[x0 x0]*0); + title('Linear Simulation Results (with observer)') + xlabel('Time (sec)') + ylabel('Ball Position (m)') + else + OP=P*2; + L = place(A',C',OP)'; + At = [ A-B*K B*K + zeros(size(A)) A-L*C ]; + Bt = [ B*V + zeros(size(B)) ]; + Ct = [ C zeros(size(C)) ]; + + sys = ss(At,Bt,Ct,0); + lsim(sys,u,t,[x0 x0]*0); + title('Linear Simulation Results (with observer)') + xlabel('Time (sec)') + ylabel('Motor Position (m)') + axis([0 2 0 1.2E-3]) + end - p1 = -10 + 10i; p2 = -10 - 10i; p3 = -50; - K = place(A,B,[p1 p2 p3]); - sys_cl = ss(A-B*K,B,C,0); - lsim(sys_cl,u,t,x0); - xlabel('Time (sec)') - ylabel('Ball Position (m)') + if mdl==0 + t = 0:1E-6:0.1; + x0 = [0.01 0.5 -5]; + [y,t,x] = lsim(sys,zeros(size(t)),t,[x0 x0]); - p1 = -20 + 20i; p2 = -20 - 20i; p3 = -100; - K = place(A,B,[p1 p2 p3]); - sys_cl = ss(A-B*K,B,C,0); - lsim(sys_cl,u,t,x0); - xlabel('Time (sec)') - ylabel('Ball Position (m)') + n = 3; + e = x(:,n+1:end); + x = x(:,1:n); + x_est = x - e; - - t = 0:0.01:2; - u = 0.001*ones(size(t)); - - sys_cl = ss(A-B*K,B,C,0); - - lsim(sys_cl,u,t); - xlabel('Time (sec)') - ylabel('Ball Position (m)') - axis([0 2 -4E-6 0]) - - V=-1./(Cm*(Am-Bm*K)^-1*Bm); %(from Lineare Regelsysteme2 (Glattfelder) page:173 ) - lsim(sys_cl,V*u,t) - title('Linear Simulation Results (with Nbar)') - xlabel('Time (sec)') - ylabel('Ball Position (m)') - axis([0 2 0 1.2*10^-3]) - op1 = -100; - op2 = -101; - op3 = -102; - - L = place(A',C',[op1 op2 op3])'; - - At = [ A-B*K B*K - zeros(size(A)) A-L*C ]; - Bt = [ B*V - zeros(size(B)) ]; - Ct = [ C zeros(size(C)) ]; - - sys = ss(At,Bt,Ct,0); - lsim(sys,zeros(size(t)),t,[x0 x0]); - - title('Linear Simulation Results (with observer)') - xlabel('Time (sec)') - ylabel('Ball Position (m)') - - - t = 0:1E-6:0.1; - x0 = [0.01 0.5 -5]; - [y,t,x] = lsim(sys,zeros(size(t)),t,[x0 x0]); - - n = 3; - e = x(:,n+1:end); - x = x(:,1:n); - x_est = x - e; - - % Save state variables explicitly to aid in plotting - h = x(:,1); h_dot = x(:,2); i = x(:,3); - h_est = x_est(:,1); h_dot_est = x_est(:,2); i_est = x_est(:,3); - - plot(t,h,'-r',t,h_est,':r',t,h_dot,'-b',t,h_dot_est,':b',t,i,'-g',t,i_est,':g') - legend('h','h_{est}','hdot','hdot_{est}','i','i_{est}') - xlabel('Time (sec)') + % Save state variables explicitly to aid in plotting + h = x(:,1); h_dot = x(:,2); i = x(:,3); + h_est = x_est(:,1); h_dot_est = x_est(:,2); i_est = x_est(:,3); + plot(t,h,'-r',t,h_est,':r',t,h_dot,'-b',t,h_dot_est,':b',t,i,'-g',t,i_est,':g') + legend('h','h_{est}','hdot','hdot_{est}','i','i_{est}') + xlabel('Time (sec)') + end %discrete - Ts=1/50; % deltatau std. frq. is 5kHz + Ts=1/5000; % deltatau std. frq. is 5kHz %The discrete system works with sampling >100Hz,. the bigger the frequency the better the result %With sampling = 80Hz hte system already becomes instable. ss_t=ss(At,Bt,Ct,Dt); - figure();pzplot(ss_t) + %figure();pzplot(ss_t) ss_tz=c2d(ss_t,Ts); - figure();pzplot(ss_tz) + %figure();pzplot(ss_tz) [Atz,Btz,Ctz,Dtz]=ssdata(ss_tz); diff --git a/matlab/testObserverSim.slx b/matlab/testObserverSim.slx index df07c9da0217bc03d72208a807cfff08f1ca418d..72b479a6dda1157aa582e73ab557b42867cd5865 100644 GIT binary patch delta 5872 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 ISO5S30IbPf5dZ)H