17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンバータ制御設計に役立つ状態平均化モデルをsimulinkで書いてみた4

Last updated at Posted at 2022-12-06

前回までのあらすじ

記事その1https://qiita.com/griffin921/items/47c4efe95550b36f15d1
記事その2https://qiita.com/griffin921/items/53dc2f3218bcd8d8c188
記事その3https://qiita.com/griffin921/items/4078d4bb6e1302d6237c

でコンバータのモデリングについてずっと話してきた。
大体記事3で話は終わっているが、ちょっと蛇足的にマニアックな話を書いてみたいと思う。

いきなりポエム:Simscape っていらなくね?

このポエムは割と今回の話の中核なので隠さないで行こうと思います!(ドーン!)

すでにアドベントカレンダーでSimscape Multibodyが登場しているが、
SimscapeはSimscape Electricalという電気回路に特化した物理モデリングツールがある。
一方で、今まで一貫して理論ベースの式とSimulinkでコンバータのモデリングについて説明してきた。

そして前回の記事でプラントのモデリングができてしまっている。

・・・じゃあさ
Simscapeいらなくね?
という意見がでてきてもおかしくない。

たしかにそうとも言える。

実際に制御設計屋さん目線でいうとSimulinkでプラントモデリングされている方が都合がいいときもある。
その理由についてはここで語っている

物理モデリングされてしまうと
途中の演算過程を引っ張ってきにくいのがちょっと嫌だ。

一方で、それと引き換えに実際の電気回路と対応がつくモデリングができるので
回路設計屋さん目線でいうとSimscape記述のほうがわかりやすいと思う。

もっというと、Simsapeによる電気回路モデリングは

  • Spiceライブラリレベルの細かいモデリングから、コンバータを電圧源に置き換えた平均モデルまで様々な抽象度で物理モデリングができる
  • 単一のSimulinkモデルファイル内にSimulink記述とSimscapを混在できるため、制御による統合シミュレーションがやりやすい
    などといったメリットが有るのではないかなと思う。

回路設計屋さん目線で言ってしまうと、ブロック線図は回路図で捉えている自分の脳内イメージを
数式に変換しないといけないので逆にダルイと思う事がある。
そういうときにもSimscapeは便利だとおもう。

Simscapeは要るとして どういうときに使い分ける?

Simscapeの更に良いところは、やはり何と言っても実際の回路に即したモデリングができるってのが良い。

例えばコンバータだが、今までは本当に純粋なコンバータ部だけモデリング対象と見てきた。
image_0.png

だが、実際の回路はこんなに単純じゃない。

PowerConverterSystemDiagram.png

この図で書ききれているかわかんないし、不足や間違いもありそうだけど
とにかくいっぱいあるというのが伝わればいいと思って割り切って書いています。

こんな風に製品として成立させるには色々他の回路が必要で、
そういう回路とくっつけたときでも、結構シンプルに考えた数式モデルが妥当なのか?誤差はあっても許容範囲なのか?
みたいなのは気になる。


それ以外にもすでにちょこちょこ言及してきたが、
このLとCだけでモデリングした状態平均化モデルも、かなりシンプルすぎる。

誤解を恐れずにいうと「こんな単純なモデルをわざわざ書き起こして何が嬉しい?」と思う人もいるはずだ。ぼくもそう思うがすでに十分マニアックな話をしてる中で最初から飛ばしすぎると誰もついてこないので我慢している。

本当は

  • スイッチングデバイスQ1にはターンオン時に存在する抵抗成分RdsOnがある
  • インダクタンスにも直流抵抗成分Lrがある
  • インダクタンスは電流によって非線形に値が変わるので固定パラメータとして扱ってきたけど実はL(t,iL)の関数である
  • コンデンサも直流抵抗成分(ESR)がある
  • 出力コンデンサCから負荷Roまでのケーブルの長さがすごく長い場合、寄生インピーダンスとしてLやCを考慮しないといけない

・・・・等もう挙げたらキリがないんじゃねぇかってくらい要素がある。

これに関しても
どこまで忠実にモデリングしたら妥当なのか?
みたいなのは気になる。

え?忠実度や抽象度のレベルの議論はなかなか不毛だからいっそのこと全部全部ぜーんぶ含めたい?

それも良いけど、究極的にそれを突き詰めると「実機でやれ」となってしまい、後述する実機のデメリットを受諾することになる。
「簡略化しつつどこまでが妥当か?」判断することはとても重要だと僕は思う。

そこで、Simscapeでなるべく忠実というか、現実に近しいモデルを作って
Simulinkでモデリングした制御屋さんが使うブロック線図モデルとどんだけずれがあるんだ?をチェックして
その差が許容できない場合、どんな要素をSimulinkモデル側に含めれば良いのかしらみたいな議論をしたくなる。

そういうシチュエーションが一つSimscapeの使いどころじゃないかなと思っている。
というわけでやってみます。

0.モデルを用意する

A716AE2A-B5E8-42A4-BB32-4712E4C2022E.GIF

こんな感じで2つのサブシステムを用意して、

  • 上はSimscapeのバックコンバータ回路モデル
  • 下はSimulinkの状態平均化モデル
    って感じで一つのモデルファイル内で用意してみた。

1.パラメータの設定

パラメータは下記のように設定する。
Simscape側には直流抵抗成分 ESRやインダクタンスの直流抵抗成分などの要素を追加してモデリングしてみたので
そのパラメータも含まれている。

Code
C1 = 300e-6;%[F]
esr = 1e-4;%[Ohm]

L1 = 200e-6;%[H]
l1r =1e-4; %[Ohm]

fsw = 20000;%{Hz]
Tsw = 1 / fsw;%[Sec]

HighVth = 10;
LowVth = 10;

Ro = 5;
Vin = 12;
Duty = 0.5;

2.シミュレーションを実行してスイッチングモデルと平均化モデルの挙動比較

このパラメータでモデルをMATLABからキックして動かす。

このスクリプトでは2つのモデルの出力を比較してみた。

Code
Simdata = sim("Model\Script04_Model\Diff_Simulink_SimscapeModel.slx");

for i = 1:2
    subplot(2,1,i)
    Simdata.ScopeData{i}.Values.plot()
    grid on;
end
subplot(2,1,1)
ylabel('IL')
legend('Simscape','Simulink');
subplot(2,1,2)
legend('Simscape','Simulink');
ylabel('Vout')

結果はこちら。
image.png

上がコイル電流、下が出力電圧になっているが、わりと一致しているようにみえる。

上のグラフを拡大すると
image.png
SimscapeはちゃんとPWMでスイッチングしているのでリップルがあるが
Simulinkは平均化されているのでリップルがない

でも平均値としては一致した応答になっているのもわかる。

コンバータの制御は瞬時値によってスイッチを切り替えるケースもあるが(PFCの臨界モード制御とかはインダクタンスの補助巻線電圧を使って電流がゼロになったタイミングでスイッチ切り替えている。)
そういうコンバータではない場合は平均モデルで制御組んでも問題なさそうに見える。

では本当にこれで良いのだろうか?

3.パラメータを更新して再度シミュレーション(実回路の寄生成分の影響)

コンデンサの直流抵抗成分:esr

インダクタの直流抵抗成分:l1r

が増加した際の応答を比較する。
それなりの大容量の機種になるとインダクタの物理的な大きさも大きくなりがち、導線も長くなりがちなのであまりこの値を無視できなくなる。

また、平滑コンデンサを電解コンデンサを選択すると
ESRが大きくなりがちなのでこれもまた無視できなくなる。

とりあえず動かしてみる。

Code
esr = 1e-1;%[Ohm]
l1r = 1e-2; %[Ohm]

Simdata = sim("Model\Script04_Model\Diff_Simulink_SimscapeModel.slx");

figure;
for i = 1:2
    subplot(2,1,i)
    Simdata.ScopeData{i}.Values.plot()
    grid on;
end
subplot(2,1,1)
ylabel('IL')
legend('Simulink','Simscape');
subplot(2,1,2)
legend('Simulink','Simscape');
ylabel('Vout')

Snag_fdc7849.png

なんと違いが出てきた。
Simscapeのほうが振動の収束が早く、振動の振幅も小さくなっているようにみえる。

これも実はこういった抵抗成分を最初の代数式から登場させて式整理をして、
それを標準2次遅れの伝達関数記述に整形すると

G(s) = \frac{K\omega_n^2}{s^2+2\xi\omega_ns+\omega_n^2}

の$\xi$の項にコンデンサの直流抵抗成分:esr インダクタの直流抵抗成分:l1rが入っており、ダンピング性能に寄与することがわかる。

ESRを低くするとコンデンサの内部発熱が減るし、ESR起因のリプル電圧も小さくなるので、高い電圧精度が求められる電源だとなるべく直流抵抗成分をへらすという考え方がアプリケーションによっては多分、あったりするのかなと思うが、(想像を持って言及してるので実際にそんなアプリがあるかは知らん。すまない)
そっちに振りすぎると制御的に見れば逆にダンピング性能が悪くなって制御しにくい回路になるというのもわかる。

こういうトレードオフも見方を変えた2つのモデルを比較することで見えてくる。

4.パラメータを更新して再度シミュレーション(電流不連続モードの存在)

次はわざと状態平均化法の前提を崩すような回路を作ってしまって
ズレちゃうよねというのを明らかにするというのをやってみたいと思う。

コンバータには電流連続モード、電流不連続モードという回路動作モードがある。
(臨界モードについての解説はGoogle先生におまかせしたい)

このモードの違いはROHMさんのWebサイトにも載っている。
https://techweb.rohm.co.jp/product/power-ic/acdc/acdc-design/3551/

上記の記事のほうがわかりやすいのだけれど、
本来軽負荷になるとダイオードの単方向にしか電流を流さない仕組みによって
インダクタが電流を吐き切ると電流が0に固定されてしまう。
これが不連続モードと呼ばれるモードである。

一方今の回路では実は不連続モードは発生しない。
何故ならば本来ダイオードでよく実装されるローサイドのスイッチがFETで実装されており、いわゆる同期整流方式で整流しているからだ。

ダイオードは単方向、すなわち回路図で言うと下から上の電流は通すが、逆は通さない。
同期整流動作している場合は上から下への電流通過が許されるのでインダクタがマイナスの電流を流すことを許容しているのでずーっと連続モードで動作する。

わざと不連続モードになるようなパラメータを設定

ここで、わざとローサイドのスイッチのゲート閾値(スイッチがオンするために必要な電圧閾値)をめちゃめちゃ高くしてPWM信号に対して不感にしてみる。

そうするとFETのドレインソースに寄生しているボディダイオードが動作し、
回路が不連続モードとして動作するはずである。

Code

%ここでゲート閾値を引き上げてローサイドをスイッチ動作からDiode動作に切り替える
LowVth = 20;

Simdata = sim("Model\Script04_Model\Diff_Simulink_SimscapeModel.slx");

figure;
for i = 1:2
    subplot(2,1,i)
    Simdata.ScopeData{i}.Values.plot()
    grid on;
end
subplot(2,1,1)
ylabel('IL')
legend('Simulink','Simscape');
subplot(2,1,2)
legend('Simulink','Simscape');
ylabel('Vout')

image.png

もう全く一致していない。
でもそれは想定通りなのでこれはこれで嬉しい。

一致してない部分のうちコイル電流部分だけクローズアップしてみると
image.png

たしかに電流が0で底打ちになっていて逆流していないので
ダイナミクスが切り替わっている事がわかる。

不連続モードのときは状態平均化モデルは使えないってこと?

そんなことはないです。
連続モードの状態平均化モデルはそのまま使えないのですが
このような違いはすでに議論をされていて、参考文献では不連続モードを

  • ターンオン期間
  • ターンオフ期間
  • ターンオフかつ電流も0で底打ちしてる期間
    の3状態で分離して計算し3つを各Duty比で重み付けしたらちゃんと不連続モードで状態平均化モデルを作れることが述べられている。
    ので参考にしてみると良いと思う。

スクリプトベースでSimulinkを動作させる

今回はPlantモデルだけをシミュレーションしているけれど、
制御を加えたシミュレーションでもスクリプトベースのシミュレーションはかなり役に立つ。

例えば、制御パラメータを決めるときに
「回路のばらつきがあったとしてもある一つの制御パラメータですべての領域で動作仕様を確保できるか?」みたいなのもある。

(ゲインスケジューリングを使えば良いという意見もあるが、だいたいコンバータに用いるマイコンは安いものを使えという回路やさんからのプレッシャーが強いのでそんなもんを入れられるほど余裕がなかったりする)

そうすると、
「ひとつの制御補償器で実質複数のPlantモデルで動作する」みたいなことになるが、
そういう複数のプラント(というか複数のパラメータ)を切り替えて安定解析してみたいこともある。
そういうのも一度スクリプトを組んでしまって、あとは変更するパラメータの種類や範囲を指定するだけで評価できるようにすれば楽ちんだ。

この辺もスクリプトでの演算環境のMATLABとグラフィカルなモデル定義、実行ができるSimulinkが連携して動く環境だからこそはかどるのかなと使ってみて思っている。

最初からsimscapeだとだめ?

まぁ悪くない。悪くないが、両方使った方がいい。

例えば上で述べたような直流抵抗成分が系の振動に寄与することは、トレードオフをシミュレーションで試行錯誤しないと気が付かない。私は先輩に「電源の気持ちになって考えたら自ずとわかるはずだ。コイルの声を聞け。」と言われたことがあるが最初はわからなかったし、新しい回路に手を出すたびに一から振り出しになり分からなくなる。

一方代数式ならどのパラメータが式のどの項に効くかよく見えるのでトレードオフを理解しやすくなる。なので、特に新しい回路に手を出すときはあった方がいい。

代数式とモデルの対応について十分議論が済めば、一旦代数式は置き、simulinkモデルかsimscapeモデルをメインとして使うといいだろう。

代数式は実際に動作した時のダイナミクスはイメージしにくいからだ。

各モデルにはそれぞれの良さがある。横断的に使える環境を存分に使って開発を効率化しよう。

実機でやれば?

まぁいいのだが、みなさんもあるあるだと思うが実機はとにかく早いので机上で検討するよりやった方が早いこともある。
でも、不具合が発生すると現実世界の挙動はありとあらゆる事象を同時に解いて全部まとめて結果を出すのでその原因の切り分けが大変になる。
そういう時にあえて実機と完全一致しないものの簡略化されたモデルがあると解釈が捗る。なのでモデルがあった方がいいと思う。

まとめ

  • Simscapeも使うと嬉しいことある
  • Simulink派の人も実際の回路挙動に近いSimscapeモデルと比較することで、妥当なSimulinkモデルか検証できて嬉しい
  • この2つのモデルが同一環境で動くと比較がはかどる

ここまできたらほとんどパワエレ制御オタクです。
お疲れ様でした!

Reference

[1] 安部 征哉, 財津 俊行, 上松 武. デジタル電源の基礎と設計法 -スイッチング電源のデジタル制御-. 科学情報出版株式会社, 2020,246p, ISBN978-4-904774-84-7.

[2] Frede Blaabjerg, ed. Yanfelng Shen, Zian Qi and Huai Wang. Control of Power Electronic Converters And Systems. Volume 1, Chapter 3 "Modeling and Control of DC-DC Converters" p69-p92, Academic Press, 2018, ISBN 978-0-12-804254-7.

17
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?