PID制御のソフトウェア実装

PID制御におけるゲイン調整は、システムの応答性能を大きく左右する重要な工程です。この記事では、比例(P)・積分(I)・微分(D)それぞれのゲインを増減させたときに、ステップ応答がどのように変化するかをシンプルに整理しました。

PID制御とは

PID制御とはP/I/Dの3要素を組み合わせて、制御する対象を目標値に収束するように調整するフィードバック制御手法です。温度制御などに用いられ、センサで現在の値を確認しながら、自動で調整を重ねます。

この3要素において、Pは現在の偏差に比例して操作量を出し、Iは過去の偏差の蓄積で定常偏差を消し、Dは偏差の変化率で振動的な応答を抑制します。

オン・オフのみの動作では目標値に到達するまで時間がかかったり、目標を通り過ぎてしまったりします。効率良く誤差を補正しながら調整するPID制御を使うと、時間もエネルギー効率も最適に近い状態での動作ができるようになります。

PIDゲインチューニングの方法

PIDの各ゲインを増減させたときのステップ応答の変化を示した表。P(比例ゲイン)は、小さいと立ち上がりが遅く、適正ならバランスのとれた応答になり、大きいとオーバーシュートと振動が大きくなる。I(積分ゲイン)は、小さいと定常偏差が残り、適正なら定常偏差がなくなり、大きいとオーバーシュートと振動が大きくなる。D(微分ゲイン)は、小さいとオーバーシュートが大きく、適正ならオーバーシュートを抑えて安定し、大きいと応答が遅くなる。

初期値を設定したあと、応答を見ながら微調整していくのがPIDゲインチューニングです。

制御ゲインの適切な範囲を決める

P/I/Dのそれぞれの値の入力と範囲を決めます。

入力値の範囲は想定値からのずれと、適正範囲を超えた場合の影響を基準に計算します。ずれが起きやすかったり、適正範囲を超えると壊れたりする場合は、安全を重視して適正値に対して入力値を加減して設定することが不可欠です。

ただし細かく刻んでいくと、適正値を得るのに時間がかかるため、適正範囲を超えることが許される制御では上限に近いところの入力を狙うほうが検証を効率化できます。

ゲインチューニングをする

ゲインチューニングでP/I/Dを調整し、目標軌道に近い値を探していきます。おおよその初期値を設定したうえで、試行錯誤を繰り返すのが一般的な流れです。

有名な調整法であるジーグラー・ニコルスの限界感度法では、まずI=D=0の状態でKpをゼロから徐々に大きくし、システムが持続振動(ハンチング)する臨界点の限界ゲインKuと限界周期Puを測定します。その後Ku・Puからの経験式(Kp=0.6Ku、Ti=0.5Pu、Td=0.125Pu)で比例ゲイン・積分時間・微分時間を算出します。実装形式に応じてKi=Kp/Ti、Kd=Kp×Tdに換算して使用します。

積分効果(I)を強くしていくと定常偏差の解消は早くなりますが、オーバーシュートやハンチングが起きやすくなります。Dを大きくしていくとオーバーシュートやアンダーシュートは減っていきますが、細かいハンチングが発生する要因になります。微分はノイズに敏感なため、一般にD項には一次遅れフィルタ(ローパスフィルタ)を入れます。どの値も変更してステップを踏んでいきながら、応答の波形を見つつ調整するのが基本です。

変数を保存する処理を入れる

PIDの各項目などパラメータとして変更できる項目は、評価、分析のために後から確認できる処理を入れておきます。入出力の信号も増えると変動要素が多くなり、検証が徐々に難しくなります。変数や配列を使ってプログラム上で検証可能な状態を作ることを心がけます。

制御したいものによっては電流計や温度計などセンサで入力値を明確にしておくのも有効です。

実装上の工夫

PID制御を実装する際の注意点を列挙します。

サンプリング周期

デジタルの実装では連続したアナログデータを離散化して取り扱います。周期が長すぎると応答が遅れる原因になります。周期を短くすると高周波ノイズや量子化の影響が目立ち、特にD項がある場合は制御出力が振れやすくなります。また演算負荷も増えるため、帯域・ノイズ・CPU負荷のバランスで決めます。

組み込み系のプログラムはほぼリアルタイムで処理しなければならず、短い間隔での制御を求められます。性能が高く、安定して使える実装にするためにはサンプリング周期でバランスを取る必要があります。

デッドバンド

偏差が微小な範囲では制御動作を発生させない領域のことをデッドバンドといいます。入力値の細かい変動による、無駄な動作や頻繁なオン・オフを防ぐために使われるのが一般的です。ノイズの多い環境やセンサの精度がそれほど高くないときにはデッドバンドを広く取り、センサの出力が安定することを優先します。

制御系では出力を変えるときに電力を消費するため、微細な変更を繰り返すと物理的な機器自体の寿命も縮めることになりかねません。システムを長期で安定して使うために必要な範囲です。

アンチワインドアップ

出力にリミットがかかった状態でも偏差が残っていると、積分項は偏差を積分し続けて過大に蓄積されます。この積分項の過大蓄積現象がワインドアップと呼ばれるものです。ワインドアップが発生すると、偏差が反転しても積分項がすぐに減少しないため、応答が遅れる原因になります。

特に出力にリミットがかかっている場合は、たまった積分値を放出するのに時間がかかり、なかなか収束しません。アンチワインドアップの代表的な実装方法の一つに、出力がリミットに達した際に積分値の増加を停止するクランプ法(条件付き積分)があります。ほかにバック計算(back-calculation)などの方式もあります。

外乱とモデル誤差への対応

開発の段階では周りの環境から影響を受けない安定した環境で試験していても、実際に使用する場所によっては環境の変化や負荷の変動が存在します。単純にプログラムを書いて試験するだけでは特定の負荷や誤差の確認をするのは難しく、エミュレータでの試験か実機での試験のどちらかは実施しておくべきです。

環境条件が悪化した場合でも安定して十分な性能が出せるようにP/I/Dそれぞれの項目をコントロールする必要があります。

組み込みソフトの世界 トップへ戻る