はじめに
こんにちは、こうへいです。
前回まで、DCモータの速度PI制御について考えてみました。
これからは、さらに進んでマイクロマウスやロボットでは速度を台形状に制御する事が多いので、 その検証をできるように考えてみたいと思うのですが。 まずは、基本のステップ入力とランプ入力について見ていきます。
制御におけるステップ入力とランプ入力
階段状の信号を入力として捉えたものがステップ入力、直線の坂道状の信号を入力と捉えたものがランプ入力と 呼ばれています。
ステップ入力について
制御において、この値を目標にしてそこまで速やかに達して欲しい等と考える場合はステップ入力と考えてよく、階段の高さが目標値になり 基本的にはその値は変わりません。
単位ステップ入力のラプラス変換は次式で表されます。
単位なので、1以外の大きさの場合は任意の数値をかけて表現します。
これまでの、記事では特に説明してなかったかもしれませんがステップ入力を入力として考えていたわけです。
ランプ入力について
一方でだんだん大きくなっていく(または、小さくなっていく)目標を設定したい場合は、線形に増大していく場合はランプ入力を使います。
こちらも傾きが1の場合を表し任意の傾きのランプを表現したければ、任意の数値をかけて表現します。
前回のPI制御システム(1型)のランプ応答
モータのモデルは以下の1次遅れモデルで、機械的時定数を、モータゲインをとします。
それぞれのパラメータについては、モータの各種値を用いて
以上のようになります。
これらついては以前の記事を確認してみてください。
kouhei-no-homepage.hatenablog.com
比例ゲインを、積分ゲインをとすると 制御系の伝達関数は以下のようになります。
このシステムの極を、とすると傾きのランプ入力を入れた際の応答を表す式は、以下のようになります。
ここで、については、以下のようになります。
1型サーボと定常偏差
前回のPI制御器は積分器が一つしか入っていないので、これを1型サーボと呼びます。 二つ入ると2型サーボとなります。
通常、ステップ入力は積分器一つと同じ形をしているので、1型にすると定常偏差がなくなりますが、ランプ入力では 2型サーボにしなければ定常偏差が残ります。
したがって、今回のように1型サーボにランプ入力を加えると、上の応答の式からわかるのは
の定常偏差が残るということです。
分母の積分ゲインを大きくすると、定常偏差を小さくできる事がわかりますが。を大きくすると、応答が振動的になります。
ランプ入力に対する応答
それでは、目標の傾きを1として、いくつかゲインを決めて、実際に計算した結果を比較してみましょう。
PI制御システムの特性方程式(伝達関数の分母=0)は次のようになります。
この式の判別式から、極が異なる実数解、共益複素解、重解になるかならないかの境界値は重解になる場合の値です。 判別式は次のようになります。
上式からの値から極が重解になるを求めるには次式を計算すると良いです。
この時にのときには境界値の値が程度となり。 この値より小さいと異なる二つの実数解、大きいと共役複素解になります。
異なる実数解の場合
kp=6/500, ki=1として計算すると ランプ応答は次のようになります。
誤差を計算してみると次のようになります。
十分に時間が経つと、定常偏差が残る事がわかります。
共役複素解の場合
kp=6/500, ki=100として計算すると、極が共役複素解になり、 ランプ応答は次のようになります。
ki=1の場合とは時間軸の範囲が違うので注意です。
こちらも、誤差のグラフを示します。
理屈どうりに、定常偏差は小さくなりますが、応答は振動的になります。
ランプ応答計算プログラム
import numpy as np import matplotlib.pyplot as plt #1724DCモータの諸元 R=3.41 K=6.59e-3 L=75e-6 D=1.4e-7 J=1e-7 #1次遅れモデルのパラメータ K_m=K/(D*R+K**2) tau_m=J*R/(D*R+K**2) # 比例ゲインと積分ゲイン kp=6/500 ki=100 # 傾きの目標値 ref=1 # 特性方程式の係数 A=tau_m B=1+K_m*kp C=K_m*ki # 極の計算 p=np.roots([A, B, C]) print('Pole={}'.format(p)) # 応答式の係数 k1=ref*K_m*(kp*p[0]+ki)/tau_m/(p[0]-p[1])/p[0]/p[0] k2=ref*K_m*(kp*p[1]+ki)/tau_m/(p[1]-p[0])/p[1]/p[1] k32=ref k31=-ref/K_m/ki print(k1,k2,k32,k31) # 応答の計算 t=np.linspace(0, 0.1, 15000) y=k1*np.exp(p[0]*t) + k2*np.exp(p[1]*t) + k32*t + k31 #y=k32*t - (k1*np.exp(p[0]*t) + k2*np.exp(p[1]*t) + k32*t + k31) #誤差を計算する場合はこちら # 可視化 plt.figure(figsize=(8,4)) plt.plot(t, y, linewidth=1, label='1stOrderModel') plt.plot(t, k32*t, label='Reference') #誤差を表示するときはこちらをコメントにする plt.legend(loc='lower right') plt.xlabel('Time(s)') plt.ylabel('Anglurr Velocity(rad/s)') plt.grid() plt.show()
おわりに
ランプ入力にたいするモータの応答を見てみました。 ランプ入力の場合に定常偏差をなくす場合は2型のサーボにする必要がありますが、今回のお話では
- 1型のPI制御ではどんな応答になるのか?
- 多くの場合に1型のPI制御が使われているが、それで、理屈の上でもうまくいくのか?
ということを計算で確かめてみました。
まとめとしては
- 1型のPI制御系にランプ入力を入れると定常偏差が残る
- 積分ゲインを大きくすると、定常偏差は小さくなる
- 積分ゲインを大きくすると振動的になる
- 振動的になるのは極が共役複素数になるためで、その境界を見定めて調整する
2型のサーボにしなくても、1型でも積分ゲインを適切にすることで満足なレベルにいくかもしれません。 次回以降は2型サーボについても調べてみたいと思います。 さらには、台形加減速について考えるために、まずは台形入力について話したいと思います。
以後の予定は
- 台形信号の取り扱い
- 台形加減速制御
- 実際のマイコン制御を考慮した計算
- PWM制御
- モータドライバに関する妄想
等々を細々と続けていきたいと思います。
一連のモータ制御シリーズは以下となります。