PI 離散化計算機(Tustin・オイラー・ZOH)

連続時間の PI 制御器 Kp + Ki/s を差分方程式の 2 つの係数に変換し、手法ごとの違いとサンプリング遅延によってクロスオーバーでのゲインと位相がどれだけずれるかを示します。

PI 制御器

サンプリングと評価周波数

空欄または 0〜fs/2 の範囲外なら PI 零点を使います。Ki = Kp/Ti。

PI 零点

636.6 Hz

Ki = 2000 s⁻¹

連続ゲイン

-4.54 dB

1 kHz にて

連続位相

-32.482°

1 kHz にて

1 kHz での遅延による位相遅れ

ZOH (0.5T)

9.00°

ZOH + 1 サンプル遅延 (1.5T)

27.00°

1.5T は計算結果が PWM 1 周期後に反映されると仮定した値です。この遅れは下の誤差に加わり、離散化手法を変えても消えません。

1 kHz での係数と誤差

手法b0b1ゲイン誤差 (dB)位相誤差
Tustin0.55-0.45-0.021+0.214°
プリワーピング Tustin0.550167-0.449833-0.012+0.128°
後退オイラーこのサイトの PID コード生成器が使う手法0.6-0.5+0.587+2.627°
前進オイラー = ZOH0.5-0.4-0.655-2.569°

差分方程式

Tustin
u[k] = u[k-1] + 0.55*e[k] - 0.45*e[k-1]
プリワーピング Tustin
u[k] = u[k-1] + 0.550167*e[k] - 0.449833*e[k-1]
後退オイラー
u[k] = u[k-1] + 0.6*e[k] - 0.5*e[k-1]
前進オイラー = ZOH
u[k] = u[k-1] + 0.5*e[k] - 0.4*e[k-1]

制御器のボード線図

動作原理

s 領域で調整した PI 制御器を MCU や DSP で動かすには、差分方程式に直す必要があります。よく使われる手法はどれも u[k] = u[k-1] + b0·e[k] + b1·e[k-1] の形になり、変わるのは b0 と b1 だけです。この計算機は Tustin(双一次変換)、周波数プリワーピング付き Tustin、後退オイラー、前進オイラーの係数を求めます。PI の場合、前進オイラーは零次ホールド(ZOH)等価とまったく同じです。

求めた離散制御器を単位円 z = e^(jωT) 上で評価し、入力した周波数(通常はループのクロスオーバー)で連続の Kp + Ki/(jω) と比較します。ボード線図はナイキスト周波数 fs/2 まで描き、その付近で離散応答が連続応答から離れていく様子がわかります。

実際により重要なのは最後の結果です。サンプル&ホールドで失う位相(ωT/2)と、1 サンプルの演算遅延でさらに失う位相(ωT)です。これらは制御器ではなくループ側のものなので、離散化手法を変えても消えません。

設計手順

  1. 1プラントモデルを使って連続時間で Kp、Ki を決め、クロスオーバー周波数を控えておきます。
  2. 2制御ループが実際に動くサンプリング周波数を入力します。割り込みが PWM 周期を間引いて動くなら、PWM 周波数より低くなります。
  3. 3特に理由がなければ Tustin を選び、b0、b1 を書き写します。プリワーピング周波数は PI 零点に置くか、クロスオーバーで正確に合わせたいならクロスオーバーにします。
  4. 4設計した位相余裕からここに表示される遅延位相を引きます。小さすぎる場合はクロスオーバーを下げるか遅延を減らしてください。離散化手法を変えても取り戻せません。

計算式

差分方程式
u[k] = u[k−1] + b0·e[k] + b1·e[k−1]
Tustin
b0 = Kp + Ki·T/2, b1 = −Kp + Ki·T/2
ωp でプリワーピングした Tustin
K = ωp / tan(ωp·T/2); b0 = Kp + Ki/K, b1 = −Kp + Ki/K
後退オイラー
b0 = Kp + Ki·T, b1 = −Kp
前進オイラー = ZOH
b0 = Kp, b1 = −Kp + Ki·T
遅延による位相
φ_ZOH = ω·T/2, φ_ZOH+1 sample = 1.5·ω·T (degrees: ×180/π)

計算例

Kp = 0.5、Ki = 2000 s⁻¹(PI 零点 637 Hz)、fs = 20 kHz、クロスオーバー 1 kHz とします。Tustin は b0 = 0.55、b1 = −0.45、後退オイラーは 0.60 / −0.50、前進オイラー(ZOH)は 0.50 / −0.40 です。1 kHz で連続 PI の位相は −32.48° で、Tustin との差は 0.21°、0.02 dB しかありません。2 つのオイラー法は逆方向にそれぞれ約 2.6°、0.6 dB ずれます。遅延と比べると、1 kHz ではホールドだけで 9.0°、1 サンプルの演算遅延を加えると 27.0° を失い、fs を 10 kHz に半減すると 54° になります。位相余裕が足りないときは、Tustin かオイラーかよりも、まずサンプリングと更新のタイミングを見直すべきです。

よくある間違い

  • 単位の混同:ここでの Ki は 1/s 単位で、∫e dt に掛かる積分ゲインです。Ti で調整した場合は Ki = Kp/Ti です。
  • 制御器が PWM の 2 周期や 4 周期に 1 回しか動かないのに、fs に PWM 周波数を入れてしまうこと。T は制御器自身の更新周期です。
  • アンチワインドアップの入れ忘れ。上の差分方程式には出力制限がありません。u が飽和したら出力を制限して積分を止めないと、大きなステップの後に大きくオーバーシュートします。

よくある質問

どの手法を使えばよいですか?

クロスオーバーが fs/10 より十分低い PI なら Tustin です。ゲインと位相が連続設計に最も近く、安定な連続極をすべて単位円の内側に写します。クロスオーバーが fs よりずっと低ければオイラー法でも問題なく、コードレビューで説明しやすい利点もあります。

PI でプリワーピングすると何が変わりますか?

ほとんど変わりません。プリワーピングは 1 つの周波数で離散応答を正確に合わせるものです。fs/20 にある PI なら、係数は小数点以下 4 桁目が変わる程度です。周波数そのものが重要なノッチフィルタや共振制御器で意味があります。

なぜここでは前進オイラーと ZOH が同じなのですか?

積分器 Ki/s の ZOH 等価は Ki·T/(z−1) で、前進オイラーの積分器と同じです。比例項はそのまま通るので、PI では 2 つの手法の b0、b1 が一致します。他の伝達関数では異なります。

このサイトの PID コード生成器はどの手法ですか?

生成されるコードは積分値を使う前に e[k]·dt を先に加えるので、後退オイラーです(b0 = Kp + Ki·T、b1 = −Kp)。上の例の条件では連続 PI より位相が約 2.6° 進みます。遅延に比べれば小さいですが、知っておく価値があります。

参考文献

  1. G. F. Franklin, J. D. Powell, M. L. Workman, "Digital Control of Dynamic Systems," 3rd ed., Addison-Wesley, 1998.

計算結果は工学的な推定値です。データシート、シミュレーション、実測で設計を確認してください。

関連ガイド

関連する計算ツール