どうもメガネです。
最近作ったシミュレーションを離散系に直してマイコンへ実装するとう作業に着手したのですが、
その際「ローパスフィルタを離散系に直す」という処理が必要になりました。
手順は簡単なんですが、制御工学の教科書などを見ても
「じゃあ実際どうやったらいいの?」
ってなることが以外に多いと思ったのでまとめておきます。
LPFを離散系に直そう(やりたいこと)
ということで今回扱うのはローパスフィルタです。
ローパスフィルタは伝達関数として表現するとラプラス変換をsとして以下の式で表されます。
$G(s)=\dfrac{1}{1+sT_i}$
なんでこれがローパスフィルタの式なのか、ということは電気回路と照らし合わせて考えるととてもわかりやすいのですが、これは後で別にまとめておきます。
ラプラス変換した後のこの式は、そのままでは連続時間系なので古のアナログ制御(オペアンプとかでロボット制御するようなやつ)でないと使えません。
もちろん今時そんなことはやらないので、マイコン、つまりデジタルで使えるように離散系に直したいわけですね。
どの方法を使って離散系に直すか決める
それでは実際にやっていきます。
まず離散系に直すには、「離散系に直す手法」をきめる必要があります。
まぁ、手法ってなんや、という話なんですが、簡単な話でまとめるとすでに連続時間系から離散系に同じシステムとして成り立つように変換する手法が確立されているというわけです。
ただその直し方も複数あるのでまずはこれを選びましょうという話です。
結構マニアックな手法も探せばあるみたいですが、一般的に使われたり教科書に載っていたりするのは以下の方法です。
- インパルス不変方式
- 後退差分方式
- 双一次変換
- 整合z変換
どれにもメリット・デメリットはありますが、その説明はぶきます。(後で追記するかも)
今回はこのうち簡単に変換できる「後退差分方式」を用いることにします。
後退差分方式を用い、LPFのような伝達関数に入力する前に着ける補償器を変換する場合、
定義式は以下のようになります。
$C[z] =C_c(s){|}
s={\dfrac{z-1}{Tz}} $
ん?だから何?
となりそうですが、別に難しくはないです。
意味は連続系(Continuas)の伝達関数$C_c(s)$に含まれるラプラス変換の$s$を、$\frac{z-1}{Tz}$に置き換える。
ただそれだけです。
ちなみに$T$はサンプル時間で、離散系のシステムで動かした際に値を取得する間隔、その時間になります。ローパスフィルタの応答時間を示す$T_i$と混同しないように注意です。
実際にローパスフィルタの伝達関数に対してこれをやってみると次のようになります。
$\dfrac{1}{1+sT_i}
\rightarrow
\dfrac{1}{1+T_i*( \dfrac{z-1}{Tz})}=
\dfrac{Tz}{T_iz-T_i+Tz} =
\dfrac{Tz}{(T_i+T)z-T_i}$
一番左側の式が最終形になります。連続時間系のLPFと比較するとだいぶ見た目が変わっていることが分かります。
一般に、と言えるのかはわかりませんが、経験上離散系に直すと見た目が複雑になることが多いので、連続系より簡単な形になったら、もしかしたらそこが間違っているかもですね。
動作を確かめてみる
とりあえず変換は終わりました。
次に離散系でもローパスフィルタとして動作しているのかを確かめてみましょう。
いろいろ確かめる方法はあるのですが、今回は視覚的にわかりやすいシミュレーションを用います。
シミュレーションソフトにはPLECSを用いてみます。
サンプル時間$T$を適当に0.01[ms]、指令値4のステップ信号を与える回路を作成してみます。
LPFの応答時間$T_i$は適当に0.0005と設定しておきます。
回路としては次のような感じです。

公式参考までに設定画面も載せておきます。

このシミュレーションを実行すると、指令値に対する応答は以下のようになりました。

赤が離散、青が連続の時の応答ですが、ほとんど差がないことが分かります。
きれいな一次遅れ系です。
少し拡大してみてみます。

連続系ではその名の通り、連続の直線になっているのに対し、離散系の方は出力が階段状になっている、つまりゼロ次ホールドされて離散時間で動作していることが分かります。
結果からほぼ同じ特性を示すものとして扱えることがわかりました。
(もちろんシミュレーションソフトの環境や、変換の方法、また入力信号の条件によって応答が連続と離散系で一致の度合いが異なることはあります。)
以上で動作確認が取れたので、正しく離散系に変換できたことが確認できました。
まとめ
今回は「連続系のローパスフィルタを後退差分方式を用いて離散系に直す方法」を解説してみました。
離散系のLPFは連続系の式とはだいぶ異なりますが、シミュレーション結果からも正しく動作していることが確認できました。
時間があれば双一次変換や前置差分方式などとの比較もしてみたいですね。
おまけのコメント
今回は無事動作確認ができたわけなんですが、ちょっと余談です。
一番最初、私はこれがローパスの動作だ!って言われてもピンと来ませんでした。(しない?)
なぜかというと、私のなかのLPFと言ったら、オペアンプ回路とかで入力の周波数に対してカットオフ周波数でゲインが減衰して、、、、、
とかの見方しか知らなかったからですね。
最初「どの辺がローパスなんだよ。」と感じてました。
ただそれは見ているところ・見る観点が違うからでした。
実際そういう見方をするなら入力指令値が周波数可変の信号でないと分かりません。
今見ているのは周波数fが固定のある一点における応答を見ているのです。
長々と言い換えると、一般的なLPFの特性は横軸が周波数で縦軸がゲインですが、今見ているのは横軸が時間で、グラフはある一点の周波数、縦軸はその周波数において指令値が与えられたときにどのように追従するのかの「過渡応答」を見ているわけです。
正直基本中の基本なんですが、制御をろくにやってこなかった私にはこの辺がごっちゃになってしまい、最初とても苦労しました。
やっぱり用語や公式よりもそれぞれの関係性とかを最初に説明したほうが理解が深まるんじゃないかなぁ~とか思いますね。
話を戻しますが、今考えているのは周波数応答ではなく過渡応答です。LPFの伝達関数の形はいわゆる「一次遅れ系」なので、一次遅れ系の応答と同じになります。
よって今回は応答が連続系、離散系ともに「一次遅れ系」の応答になった。ので、
おなじローパスフィルタとして正しく変換できたと確認できたんですね。
こういう「○○系」と同じ応答になった!みたいな考え方は制御でよく出てくるようなので、覚えておきましょう。
周波数応答というローパスフィルタの機能としての特性だけでなく、伝達関数としての見方、別の観点からの特性でも評価できる、という認識をあらかじめもっておけば、頭の中が整理できますね。
少しでも参考になれば幸いです。
それでは。