work on tuning
This commit is contained in:
@@ -16,7 +16,6 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
%
|
||||
% https://www.youtube.com/watch?v=Lax3etc837U
|
||||
|
||||
%ss_ol=mot.ssPlt;
|
||||
ssPlt=mot.ssPlt; %real plant (model of real plant)
|
||||
ssPlt.Name='open loop plant';
|
||||
ssMdl=mot.ssMdl;%ssMdl; %simplified model (observable,controlable) for observer
|
||||
@@ -93,6 +92,7 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
P=[p1 p1' p2 p2' p3 p3'];% p4 p4' p5 p5' p6 p6'];
|
||||
end
|
||||
end
|
||||
%P=P*.1; % P was too aggressive
|
||||
K = place(Am,Bm,P);
|
||||
%K = acker(Am,Bm,Pm);
|
||||
end %if lqr
|
||||
@@ -118,29 +118,7 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
% *** observer controller ***
|
||||
%
|
||||
%observer poles-> 5 times farther left than system poles
|
||||
if mot.id==1
|
||||
op1=(p1*5);
|
||||
op2=(p2*5);
|
||||
if length(poles)>4
|
||||
op3=(p3*5);
|
||||
OP=[op1 op1' op2 op2' op3 op3'];
|
||||
else
|
||||
OP=[op1 op1' op2 op2'];
|
||||
end
|
||||
|
||||
else
|
||||
op1=(p1*2);
|
||||
op2=(p2*2);
|
||||
if length(poles)>4
|
||||
op3=(p3*2);
|
||||
op4=(p4*2);
|
||||
op5=(p5*2);
|
||||
op6=(p6*2);
|
||||
OP=[op1 op1' op2 op2' op3 op3'];% op4 op4' op5 op5' op6 op6'];
|
||||
else
|
||||
OP=[op1 op1' op2 op2'];
|
||||
end
|
||||
end
|
||||
OP=2*P;
|
||||
L=place(Am',Cm',OP)';
|
||||
%L=acker(A',C',OP)';
|
||||
|
||||
@@ -150,8 +128,9 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
zeros(size(Bm)) ];
|
||||
Ct = [ Cm zeros(size(Cm)) ];
|
||||
|
||||
Dt=0;
|
||||
% step answer on closed loop with observer controller:
|
||||
ss_t = ss(At,Bt,Ct,0,'Name','observer controller','InputName',{'desPos'},'OutputName',mot.ssMdl.OutputName);
|
||||
ss_t = ss(At,Bt,Ct,Dt,'Name','observer controller','InputName',{'desPos'},'OutputName',mot.ssMdl.OutputName);
|
||||
figure();lsim(ss_t,ones(size(t)),t,[xm0 xm0]);title('step on closed loop with observer');
|
||||
|
||||
|
||||
@@ -159,12 +138,12 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
%
|
||||
Ts=1/5000; % 5kHz
|
||||
ss_tz = c2d(ss_t,Ts);
|
||||
[Atz,Btz,Ctz,Dtz]=ssdata(ss_tz );
|
||||
ss_tz .Name='discrete obsvr ctrl';
|
||||
% step answer on closed loop with disctrete observer controller:
|
||||
t = 0:Ts:.05;
|
||||
figure();lsim(ss_tz ,ones(size(t)),t,[xm0 xm0]);title('step on closed loop with observer discrete');
|
||||
|
||||
|
||||
%plot all bode diagrams of desPos->actPos
|
||||
figure();
|
||||
h=bodeplot(ss_cl(3),ss_t(3),ss_tz(3));
|
||||
@@ -182,20 +161,23 @@ function [ssc]=StateSpaceControlDesign(mot)
|
||||
Do=zeros(size(Co,1),size(Bo,2));
|
||||
|
||||
ss_o = ss(Ao,Bo,Co,Do,'Name','observer controller','InputName',{'desPos','iqMeas','iqVolts','actPos'},'OutputName',{'k*xt'});
|
||||
|
||||
|
||||
%discrete plant
|
||||
ssPltz = c2d(ssPlt,Ts);
|
||||
[Apz,Bpz,Cpz,Dpz]=ssdata(ssPltz);
|
||||
|
||||
%discrete observer controller
|
||||
ss_oz = c2d(ss_o,Ts);
|
||||
[Aoz,Boz,Coz,Doz]=ssdata(ss_oz);
|
||||
mdlName='observer';
|
||||
open(mdlName);
|
||||
|
||||
|
||||
ssPltz = c2d(ssPlt,Ts);
|
||||
[Apz,Bpz,Cpz,Dpz]=ssdata(ssPltz);
|
||||
|
||||
|
||||
%state space controller
|
||||
ssc=struct();
|
||||
for k=["Ts","Ap","Bp","Cp","Dp","Ao","Bo","Co","Do","Apz","Bpz","Cpz","Dpz","Aoz","Boz","Coz","Doz","V","K","L","ss_cl","ss_o","ss_oz","numV","denV"]
|
||||
for k=["Ts","At","Bt","Ct","Dt","Atz","Btz","Ctz","Dtz","Ap","Bp","Cp","Dp","Am","Bm","Cm","Dm","Ao","Bo","Co","Do","Apz","Bpz","Cpz","Dpz","Aoz","Boz","Coz","Doz","V","K","L","ss_cl","ss_o","ss_oz","numV","denV"]
|
||||
ssc=setfield(ssc,k,eval(k));
|
||||
end
|
||||
save(sprintf('/tmp/ssc%d.mat',mot.id),'-struct','ssc');
|
||||
|
||||
Reference in New Issue
Block a user