実現したいこと
- Simulinkとmファイルを用いたPID制御シミュレータの構築
- SimulinkのPIDブロックを用いずに実現
- 各PIDゲインの特性を理解するためのプログラム
- 不完全微分が含まれない形式のPID制御
Matlabのバージョン
Matlab2021a
※ダウンロード形式として過去のバージョンも用意
必要なtoolbox
ダウンロードURL
【ダウンロードリンク】
PID_Control - Google ドライブ
※ご利用中のMatlabバージョンのフォルダをダウンロードしてください。
例:2021aバージョンであれば,上記リンクの「2021a」を選択
※上記プログラムの利用で生じたトラブルは一切の責任を負いかねます。
フォルダ構成
上記ダウンロードし展開。
(下記のようなフォルダ構成になっていることを確認)
実行方法
「Main_PID.m」を実行
Simulinkファイル(PID.slx)
mファイルソースコード(Main_PID.m)
%% 初期化
clc % コマンドウィンドウの初期化
clear % ワークスペースの初期化
close all % グラフを全部閉じる
%% 変数宣言
% ===== PIDゲイン =====
Kp = 1; % Pゲイン
Ki = 1; % Iゲイン
Kd = 1; % Dゲイン
% ===== 制御対象 =====
K = 1;
A = 1;
B = 1;
C = 1;
% ===== 目標値 =====
r_val = 10; % ステップ状の目標値
% ===== Simulink関係 =====
N_File = 'PID.slx'; % simulinkファイル名
FinalTime = 30; % シミュレーション終了時刻[s]
SamplingTime = 0.1; % サンプリング時間[s]
%% Simulinkの実行
open(N_File); % Simulinkを起動
sim(N_File); % Simulinkの実行
%% グラフ化
% ===== Simulinkデータ格納 =====
t = ScopeData.time; % 時刻情報
y = ScopeData.signals(1).values(:, 1); % 出力
r = ScopeData.signals(1).values(:, 2); % 目標値
u = ScopeData.signals(2).values(:, 1); % 入力
% ===== グラフ描画 =====
% ----- y -----
figure;
subplot(211);
plot(t,y);
hold on;
plot(t,r,'--');
grid on;
xlabel('$ t {\rm [s]} $', 'interpreter', 'latex');
ylabel('$ y(t) $', 'interpreter', 'latex');
legend('$ y(t) $', '$ r(t) $', 'interpreter', 'latex');
% ----- u -----
subplot(212);
plot(t,u);
hold on;
grid on;
xlabel('$ t {\rm [s]} $', 'interpreter', 'latex');
ylabel('$ u(t) $', 'interpreter', 'latex');
実行結果
考察・まとめ
Simulinkの微分に「ブロック」を利用している。このブロックは微分を近似しているため誤差が生じる。具体的には下記の記事を参照されたい。
Matlab_Simulink:微分ブロックの近似精度検証(無料公開)
補足:にした場合
上記の微分近似の誤差をゼロにするため,とした場合の結果を下図に示す。下図の結果から,①mファイルのみ,②python の結果と一致していることが確認できる(詳細は下記の記事参照)。
mファイルのみ:PID制御プログラム(無料公開)
python:PID制御プログラム(無料公開)