MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 その77【PID制御⑥】
を書き直したもの。
DCモータの状態空間モデルは作成したが、
そこにPID制御器を追加。
これをMATLABで実現する話。
PID制御器のブロック線図と全体構成
PID制御器のブロック線図と全体構成は以下となる。
MATLABコード
上記を元にMATLABコードを起こすと以下となる。
% statespacemodel.m
function [x,y] = statespacemodel(A, B, C, D, u, dt, x)
% 様態方程式
x = x + (A*x + B*u) * dt;
% 出力方程式
y = C*x + D*u;
end
% PIDController.m
function [state, u]=PIDController(state, target, actual, Kp, Ki, Kd, dt, t1)
e_i = target - actual;
e_p = (t1/dt)*(e_i - state.pzi);
e_d = (t1/dt)*(e_p - state.dzi);
u = (dt/t1)*(e_p*Kp + e_i*Ki + e_d*Kd) + state.izi;
state.pzi = e_i;
state.dzi = e_p;
state.izi = u;
end
% statespacemodel_pid.m
function []=statespacemodel_pid()
K=0.016;
J=0.000000919;
R=1.34;
L=0.00012;
A=[0,1,0 ; 0,0,K/J ; 0,-K/L,-R/L];
B=[0 ; 0; 1/L];
C=[1,0,0;0,1,0;0,0,1];
D=[0;0;0];
dt = 0.0001;
t = linspace(0, 1, 10000); % 時間(横)軸
u = zeros(1,10000); % 入力信号生成
u(1,5000:10000)=1; % 0.5秒後に0から1へ
y = zeros(3,numel(t));
x = zeros(3,1);
state.pzi = 0;state.dzi = 0;state.izi = 0;
ratio = 1/60;
Kp = 0.8;
Ki = 0.45;
Kd = 0.0;
t1 = 0.005;
omega = 0;
uPID = zeros(1,10000);
for i = 1:numel(t)
[state,uPID(1,i)] = PIDController( state, u(:,i), omega*ratio, Kp, Ki, Kd, dt, t1 );
[x,y(:,i)] = statespacemodel(A,B,C,D,uPID(:,i),dt,x);
omega = y(2,i);
end
subplot(3,1,1);
plot(t,uPID','-r', t,u', '--b');
xlim([0,1]);ylim([-0.1,1.1]);
subplot(3,1,2);
plot(t,y(1:2,:));
xlim([0,1]);ylim([-5,65]);
subplot(3,1,3);
plot(t,y(3,:));
xlim([0,1]);ylim([-0.1,1]);
end
MATLABの場合、1関数1ソースコードの制約があるため、
状態空間モデルとPID制御器とそれを取りまとめるコードの
合計3つのソースコードファイルが必要となる。
forループの中でPID制御器と状態空間モデルが動作し、
信号の繋ぎはローカル変数で実現。
PID制御器では前回値を保持する必要があり、
そこは構造体の機能を利用している。
以下の部分が該当。
state.pzi = e_i;
state.dzi = e_p;
state.izi = u;
シミュレーション結果
シミュレーション結果は以下となる。
\(u(t)\)を見ると分かるが、PID制御の挙動となっている。
PIDの各ゲインを調整するとこの挙動は変化する。
まとめ
- PID制御器のブロック線図と全体構成を再掲。
- 上記をMATLABで実現。
- 接続に関してはコード上では分かり難いので全体構成図と見比べながら確認した方が良い。
- シミュレーション実施。
- u(t)の挙動と見るとPID制御っぽい挙動になっている。
- 各PIDゲインを調整すると挙動が変わるはず。
- u(t)の挙動と見るとPID制御っぽい挙動になっている。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント