. PID制御の実装 -位置型と速度型- - とりあえずフィードバック制御
PID制御の実装 -位置型と速度型- - とりあえずフィードバック制御
PID制御の実装 -位置型と速度型- - とりあえずフィードバック制御

とりあえずフィードバック制御

「なんとなく」ではなく、「きちんと」動かすための古典制御に関する技術ブログを目指しています。開発言語は主にMATLAB/Octaveです。

トップ > 制御工学 > PID制御の実装 -位置型と速度型-

PID制御の実装 -位置型と速度型-

キーワード:PID制御実装位置型速度型

ディジタルPIDコントローラ

ここで、\(u(t)\)は現時刻\(t\)における操作量(MV: Manipulate Value)、\(e(t)\)は制御偏差(E: Error)で目標値\(r(k)\)(SV: Set Value)と制御量\(y(k)\)(PV: Process Value)の差\(r(t)-y(t)\)である。ところで、汎用計算機やマイコン等のディジタル回路にプログラムとして(\(\ref\))式を実装しようとすると、積分動作や微分動作の実現方法を考えなければならない。ディジタル制御に限らないが、このようなとき 離散化 、つまり 近似 で実現する 。では、プログラムに実装するために離散化したPIDコントローラの制御則を以下に示す。

位置型PID制御と速度型PID制御

(\ref)式は過去や現在の制御偏差\(e(k)\)のみに基づいて操作量\(u(k)\)の絶対量を過去の\(u\)に関係なく計算する。このようなPID制御を 位置型PID制御 と呼ぶが、プログラムとして実装するに当たっては、主に以下のような扱いづらい点がある。

  • 手動から自動へのモード変更やコントローラの切り替え時に不連続な変化(bump)が発生する。
  • \(u(k)\)のままだと諸所の演算処理(リセットワインドアップや変化量制限)が難しい。
  • 半永久的な制御で\(\sum\)の計算のためにメモリが肥大化する(メモリが小さいマイコンなどで問題となる)。

\begin u(k) &= u(k - 1) + \Delta u(k) \label \end

と計算するのである。このような前回値\(u(k - 1)\)を始点に、次に必要となる変化量\(\Delta u(k)\)分だけを計算・加算することで現在の\(u(k)\)を決定するPID制御を 速度型PID制御 と呼ぶ。主にプログラムとして実装する際は(\ref)と(\ref)を採用するのが良いと思われる。この計算の工夫により、バンプレスな切り替え(図1)、リセットワインドアップ、メモリ節約が可能となる。

PIDコントローラの実装とその要領 % 設計パラメータ Ts = 1; % サンプリング時間 N = XXX; % サンプル時刻の終点(シミュレーション回数) flg = 'v'; % p:position, v:verocity offset_time = 2; y = zeros(N + offset_time, 1); r = [zeros(offset_time, 1); ones(N, 1) * 5]; e = zeros(N + offset_time, 1); u = zeros(N + offset_time, 1); for k = (1 : N) + offset_time % 制御量の読込み y(k) = read_PV(); % 制御偏差の計算 e(k) = r(k) - y(k); % PID制御則による操作量の計算 if strcmp(flg, 'p') u(k) = kp * (e(k) + Ts/Ti*sum(e(1:k)) + Td/Ts*(e(k) - e(k-1))); else du = kp * ((e(k) - e(k - 1)) + Ts/Ti*e(k) + Td/Ts*(e(k) - 2*e(k - 1) + e(k - 2))); u(k) = u(k - 1) + du; end % 制御量の書き込み write_MV(u(k)); end
  • 時系列データをベクトルなどで実装したとき、各演算で過去データを参照する際は、例えば、u(- 1)やe(- 1)のような要素の指定がマイナスになるケースを回避する方法が必要である。上のコードの場合、offset_timeなど。
まとめ
  • パッケージとしてすでに実装されているのは、殆どが速度型アルゴリズム(DCSなんかはそうだったり)
  • (\ref)式の変化量を計算する考え方はモデル予測制御や他の制御則でも使われるから意外と重要
制御対象のモデリングは、賢い制御系設計をするための基本的な… ディジタルPID制御のシミュレーションをやっていこうかと思いま… 前回の記事では、基本的なPID制御則のアルゴリズムについて書き… 今回は、むだ時間の伝達関数の離散化について書きたいと思いま… MathJaxのテスト ラプラス変換 \begin F(s) &= \int_0^ 最終更新: 2021-01-02 23:42
  • GNU Octave - Wikibooks
  • https://www.gnu.org/software/octave/doc/v4.0.0/index.html
  • JIS Z 8116:1994 自動制御用語−一般
📎📎📎📎📎📎📎📎📎📎