scilabで遊ぼう (11) [プログラム三昧]
scilabで遊ぼうの11回目には、scilabは登場しません。 今回は、scilabの成果をLTspiceで確認してみます。
被制御システムを決める
前回の記事で取り上げた被制御システムは、参考文献(1)から持ってきました。
G(s) = 0.1 / (s + 0.5)3
これを現実の回路で表現すると、RCによる一次ローパスフィルタを三段連ねたものになります。 この時の時定数は、
ω = 1 / (C * R) = 0.5
となります。 適当に R=1kΩ と定めると、 C=2000µF となります。
ところが、これだけコンデンサの容量が大きくなるとシミュレータが収束してくれなくなりました。 仕方なく、二桁落として、 C=20µF としました。 時定数は、 C×R=20msec です。 全体の伝達関数は、
G(s) = 1.25 × 105 / (s + 50)3
と、オリジナルとは少し異なりますが、あとはPID制御器のゲイン調整でカバーします。
実際にCRを三段重ねにすると、入出力インピーダンスの不整合から、伝達関数は変形します。 ですが、今日の記事では、入出力のインピーダンスはあえて無視しています。 作ってみて、出たとこ勝負で調整していこうと考えてのことです。
P制御器
次は、P制御器を接続して、安定して発振するポイントを探します。 P制御器は、エラー検出機能込みの増幅器をOPアンプで構成しました。 電源電圧は、3Vにしています。
ゲインは、パラメータ"Kc"で与えられます。 "Rs"を 10kΩ として、"Rf"をゲインから計算しています。
電源電圧の半分の電圧に仮想グランド(VSS)を作るために、二個目のOPアンプが使われています。 ここでは、8ピンDIPにOPアンプが二個搭載されているLM358を想定しています。
全体の構成
全体の構成は、このようになります。 フィードバック・ループには、ループ・ゲインを測定するために電圧源を挿入してあります。 これは、参考文献(2)で使われていた方法です。
この回路図を見て、気づいた方もいらっしゃるかと思いますが、これは、「移相形発振器」そのものです。 ループ・ゲインを上げると発振してあたりまえの回路です。
トランジェント・シミュレーション
この回路図で、トランジェント(過渡)シミュレーションをかけます。 シミュレーション時間2秒、最大ステップ時間0.2m秒としました。
.tran 0 2 0 0.2m
すると、 Kc=32 の時に振幅の安定した発振波形が現れました。 これが、限界感度法で求めるべきゲインです。
また、この波形から発振周期も求めることが出来ます。 周期は、Tc=49.90m秒でした。
ACシミュレーション
次にコントロール・カードを入れ替えて、ACシミュレーションを行います。
.ac dec 100 0.1 1meg
ここで、興味があるのは、ループゲイン(V(vy)/V(vx))です。 カーソルを当てて、ループゲインの利得(実線)が0dBになる周波数と位相(破線)が0°になる周波数を求めます。 すると、どちらも20.5Hz付近であることがわかりました。 二つの条件が揃った周波数で安定して発振が起こっているというわけです。
このボード線図によると、100Hz付近でゲインの落ち込みがあり、位相が回っています。 これは、どこかに共振回路ができてしまったことを意味するのですが、その原因が何処にあるのか判断できませんでした。 おそらく、OPアンプのモデルと外部回路の相互作用によるものであろうと推測しています。
PID制御器を定義する
シミュレーションで求めた、 Kc と Tc から Kp, Ti, Td を計算します。
Kp = Kc * 0.6 Ti = Tc / 2 Td = Tc / 8
次は、この三つのパラメータを実現するPID制御器を作ります。 "Rs"と並列に"Cs"を、"Rf"と直列に"Cf"を追加しました。 伝達関数は、こうなります。
C(s) = (Rf + (1/sCf)) / (Rs // (1/sCs)) C(s) = (Rf + (1/sCf)) * (Rs + (1/sCs)) / (Rs * (1/sCs)) C(s) = (Rf / Rs) * (1 + (1/sCfRf)) * (1 + sCsRs) C(s) = (Rf / Rs) * ((1 + CsRs/CfRf) + (1/sCfRf) + sCsRs) Kp = (Rf / Rs) * (1 + CsRs/CfRf) Ti = CfRs * Kp = Tc / 2 Td = CsRf / Kp = Tc / 8
これらの方程式から、各抵抗およびコンデンサの値を導きます。 方程式を解くとこうなりました。
Rf = (Kp * Rs) / 2 Cs = Tc / (4 * Rs) Cf = Tc / (2 * Kp * Rs)
再び、トランジェント・シミュレーション
P制御によるシミュレーション結果から、各パラメータは以下のように求まります。
.param Kc=32 .param Tc=49.90m .param Kp=Kc*0.6=19.2 .param Rs=10k .param Rf=Kp*Rs/2=96k .param Cs=Tc/(4*Rs)=1.25u .param Cf=Tc/(2*Kp*Rs)=0.130u
パラメータが決まったので、トランジェント・シミュレーションにかけてみます。 すると、オーバーシュートはありますが、かなり目標値に追従した出力が得られるのがわかります。
さらにACシミュレーション
次は、周波数特性を見てみます。 まあ、発振こそしませんが、位相余裕(フェーズ・マージン)は、22.5°しかありません。 おまけに、870Hz付近に妙なピークがあります。 そこで、被制御システムとPID制御器の部分について周波数特性をとりました。
その結果、PID制御器(赤いグラフ)が870Hzにピークを持っていることがわかりました。 これは、微分制御部分でゲインが上がりすぎたためにできたピークです。
そこで、ピークをやわらげるために、コンデンサ"Rs"に直列に抵抗を付けました。 値は、試行錯誤で100Ωとしました。
これで、ちょっとは安心できます。
オーバーシュートを減らしたい
このシステムは、目標にたどりつくまでに、行きつ戻りつを繰り返しています。 これをオーバーシュートと呼んでいます。 次は、オーバーシュートを減らしてみます。
.param Kc=32 .param Tc=49.90m .param Kp=Kc*0.6*1.2 .param Rs=10k .param Rf=Kp*Rs/2 .param Cs=Tc/(4*Rs)*3 .param Cf=Tc/(2*Kp*Rs)*3
積分定数と微分定数を3倍に調整して、不足気味のゲインを1.2倍に増やしてみました。 まだ、オーバーシュートは残っていますが、なかなか、いい感じです。
結論
このように、LTspiceでPID制御のシミュレーションを行うことが出来ましたが、 なぜか、周波数特性にへこみが出来てしまい、何が原因なのか探り当てる所までいきませんでした。 おそらく、インピーダンスの計算をさぼったためであろうとは思っていますが、まだまだ、修行が足りんな。
付録 : 「scilab で遊ぼう」索引
- scilabで遊ぼう (1)
- scilabで遊ぼう (2)
- scilabで遊ぼう (3)
- scilabで遊ぼう (4)
- scilabで遊ぼう (5)
- scilabで遊ぼう (6)
- scilabで遊ぼう (7)
- scilabで遊ぼう (8)
- scilabで遊ぼう (9)
- scilabで遊ぼう (10)
- scilabで遊ぼう (11)
- scilabで遊ぼう (12)
- scilabで遊ぼう (13)
参考文献
- (1)
- (2)
-
トランジスタ技術 (Transistor Gijutsu) 2009年 02月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2009/01/10
- メディア: 雑誌
コメント 0