位相遅れ補償の設計

古典制御

PID制御はよく知られています。この制御手法のメリットは何と言っていも設計パラメータが3つのみである点です。この制御をもっと高い自由度で設計できるのが位相遅れ補償、位相進み補償です。
この手法を使うと、PID制御では手の届かなかった痒いところに手が届くかもしれません。

今回は定常偏差を低減PI制御

位相遅れ補償とは

位相遅れ補償はPI制御と同様に定常特性を改善する目的で用いられます[1]。
伝達関数は次のようにあらわせます。

\begin{align}
K(s)=k\frac{1+\alpha Ts}{1+ Ts} \quad ,\quad 0<\alpha<1, \quad T>0,\quad k>0
\end{align}

周波数応答は図1のようになっています。

図1 位相遅れ補償のボード線図

この図1からも分かる通り、低周波でゲインが大きくなっています。
少しステップ応答のようなものをイメージしていただくと、、その役割が見えてきます。
最後に定常値に近づくときは高周波ではなく、低周波です。そして、$\alpha$は低周波ゲインの増加量を決める設計パラメータとなっています。

例題

以下の制御対象に対して、速度偏差定数$K_{v}\geqq10$, 位相余裕$PM\geqq40°$を満足する位相遅れ補償を設計する。

\begin{align}
P(s)=\frac{10}{s(s+1)(s+10)} \tag{1}
\end{align}

速度偏差定数とは

設計仕様によく出る速度偏差定数
これは一言でいえば、定常偏差をどれだけ小さくしたいか、を表す定数です。
定義は、システム(下の図3)にランプ入力(下の図2のような)を入れたとき、
\begin{align}
e_{s}=\lim_{s \to 0} s\frac{1}{1+P(k)K(s)}\frac{1}{s^2}=\lim_{s \to 0}\frac{1}{sL(s)}
\end{align}
これを定常速度偏差といい、分母の
\begin{align}
K_{v}=\lim_{s\to 0}sL(s)
\end{align}
速度偏差定数といいます。これが大きいと定常偏差が小さくなっていきます。

(1)式は以下の図4のようなボード線図になります。

図4 制御対象のボード線図

また位相余裕は47.4度、ゲイン交差周波数が0.8[rad/s]になります。

ちなみに上のボード線図は以下のコードから確認できます。


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

plt.rcParams['font.family'] = 'MS Gothic' # Windowsで日本語フォントが使えないとき利用

#warningを無視する
import warnings
warnings.filterwarnings('ignore')

#cntrol
from control.matlab import tf, bode, logspace, mag2db, margin, feedback, step

P = tf( [10], [1,11,10,0] )
Klead=tf([1,0.1],[1,0.01])


def linestyle_generator():
    linestyle = ['-','--','-.',':']
    lineID=0
    while True:
        yield linestyle[lineID]
        lineID = (lineID+1)%len(linestyle)
        
def plot_set(fig_ax,*args):
    fig_ax.set_xlabel(args[0])
    fig_ax.set_ylabel(args[1])
    fig_ax.grid(ls=':')
    if len(args)==3:
        fig_ax.legend(loc=args[2])

def bodeplot_set(fig_ax,*args):
#     ゲイン線図のグリッドとy軸ラベルの設定
    fig_ax[0].grid(which='both',ls=':')
    fig_ax[0].set_ylabel('gain[dB]',size=20)
    fig_ax[0].tick_params(labelsize=15)

#     位相線図のグリッドとx軸y軸ラベルの設定
    fig_ax[1].grid(which='both',ls=':')
    fig_ax[1].set_xlabel('$\omega$[rad/s]',size=20)
    fig_ax[1].tick_params(labelsize=15)
    
    fig_ax[1].set_ylabel('Phase[deg]',size=20)
    
    if(len(args))>0:
        fig_ax[1].legend(loc=args[0]) #引数が一つ以上:ゲイン線図に表示
    if len(args)>1:
        fig_ax[0].legend(loc=args[1])
        

LS=linestyle_generator()
fig,ax = plt.subplots(2,1,figsize=(10,10))

    
#     ゲイン線図と位相線図
mag,phase ,w = bode(P,logspace(-1,2,10000),plot=False)
#     pltargs = {'ls':next(LS),'label':f'$k_P$={kp[i]}'}
ax[0].semilogx(w,mag2db(mag))
ax[1].semilogx(w,np.rad2deg(phase))


#     ゲイン余裕、位相余裕、位相交差周波数、ゲイン交差周波数
gm,pm,wpc,wgc = margin(P)
print('gm=',gm)
print('pm=',pm)
print('wgc=',wgc)
print('wpc=',wpc)
ax[0].scatter(wgc,0)
ax[1].scatter(wpc,-180)
bodeplot_set(ax,3)

#参考:・「Pythonによる制御工学入門」南祐樹, オーム社, 2021年

ステップ1 ゲイン$k$の決定

速度偏差定数$K_{v}\geqq10$より、
\begin{align}
K_{v}&\geqq10\\
\lim_{s \to 0}sL(s) &\geqq 10\\
\lim_{s \to 10}sP(s)K(s) &\geqq 10\\
\lim_{s \to 10}s\frac{10}{s(s+1)(s+10)}K&\geqq 10\\
K &\geqq 10
\end{align}

ステップ2 位相進み角$\phi_m$の決定

$kP(s)$に対して、目標位相余裕以上となる位相余裕として47度となる(ゲイン交差)周波数$w_{c}$を求める。

以下の図5は$kP(s)$のボード線図ですが、位相余裕が47度となる(ゲイン交差)周波数を求めると$w_{c}$はおよそ0.8[rad/s]とわかる。

図5 kP(s)のボード線図

ステップ3 $\alpha$の決定

$w_{c}$における開ループ伝達関数のゲインは20dBである。位相遅れ補償によってゲインを20dB下げ、この角周波数を新たなゲイン交差周波数とする。
\begin{align}
20log_{10}\alpha = -20\\
\alpha=0.1
\end{align}

ステップ4 $T$の決定

新たなゲイン交差周波数において、位相遅れの影響が極力出ないように設計するため、補償器のゲインが十分に低下する角周波数$\frac{1}{\alpha T}$の10倍の角周波数をゲイン交差周波数とする。
\begin{align}
\frac{10}{\alpha T}=0.8\\
T=125
\end{align}

ステップ5 確認

以上のステップで求まった位相遅れ補償器は以下の式で表せます。
\begin{align}
&K(s)=k\frac{1+\alpha Ts}{1+ Ts} \quad ,\quad 0<\alpha<1, \quad T>0,\quad k>0\\
&K=10,\quad \alpha=0.1,\quad T=125
\end{align}

位相遅れ補償器を加えた制御対象のボード線図を以下の図6に示します。要求仕様通り、位相余裕が出ていることがわかります。

図6 K(s)P(s)のボード線図

また位相遅れ補償を加える前と加えた後のボード線図を比較したものが図7になります。
低周波ゲインが若干上がり定常偏差が改善し、位相余裕は若干減っているものの要求仕様を満たしてはいます。

位相進み補償($K(s)$)を加えたものと、元々の制御器の比較を比べたものを図7に示します。(周波数範囲が変わっていますので注意してください。)

図7 補償前P(s)と補償後P(s)K(s)のボード線図の比較

参考文献

[1]「Pythonによる制御工学入門」南祐樹, オーム社, 2021年
[2]「フィードバック制御入門」, 杉江俊治,藤田真之, コロナ社, 2020年

雑談

制御しないといけないプラントに何でもかんでもPID制御を入れればいいわけではないです。
仮に、プラント自体に積分器が含まれている場合にPID制御を入れると余計に応答遅れが生じてしまうかもしれない。
例えば、液面レベルを制御するときの蛇口から出る水量をコントロールするための弁の開度。これは一度電圧を加え続ければ一定の開度を保ちます。言い換えれば系自体が積分器を持っています。
 反対に、熱を加えて温度を制御する場合を考えます。この場合は何もしないと、温度が自然に下がってしまいます。なので目標値との誤差を利用した積分器を用いることで定常誤差がなくなります。

コメント

タイトルとURLをコピーしました