【LTspice&PYTHON】昇圧コンバータの回路モデルを設計したので解説します。

昇圧コンバータのLTspiceの回路モデルを作りましたので、設計手順を解説します。

昇圧コンバータの動作を見てみたい。

どういう制御で出力が安定しているか知りたい。

という方の参考になれば幸いです。

スポンサーリンク

作成した回路図と制御計算PYTHONコード

回路図

作成した回路図は以下です。

今回作成した昇圧コンバータの回路のスペックを簡単に説明します。↓

出力電圧:14.5V
出力電流:5A
入力電圧:8V
スイッチング周波数:300kHz
制御モード:電圧モード制御

設計した回路図ファイルはこちらです。何かに利用して頂けると幸いです。。

制御系計算用PYTHON全コード

制御設計もチマチマと計算しました。計算にはPYTHONを使用しました。PYTHONの記述スクリプトも載せておきます。具体的に何しているの?かというと、制御対象の伝達関数を計算して、それが安定するように制御器の伝達関数を設定して、全体のボード線図で安定しているかをチェックしています。


#import
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
import control as ctl

#外部条件の設定
Vi_typ = 8#入力電圧[V]
Vo = 14.5#出力電圧[V]
f_pwm = 300*10**3#スイッチング周波数[Hz]
Ts = 1/f_pwm#周期[sec]
Io_typ = 5#出力電流typcal値[A]

Duty = 1-Vi_typ/Vo
Ton = Ts * Duty
IL = 5*0.3 #コイル電流は出力電流の30%くらい。
L = Vi_typ/IL *Ton

L = 10e-6
r_L = 0.03
Iripple = Vi_typ/L * Ton

C = 440e-6
r_C = 0.01

#プラント伝達関数
D_d=Vi_typ/Vo
delta = (r_L + D_d*r_C)/(2*D_d)*np.sqrt(C/L)
w_n = 1/np.sqrt(L*C)*Vi_typ/Vo
wRHP= 1/(L*Io_typ)*(Vi_typ**2)/Vo
wesr= 1/(C*r_C)
tf_Gdv = ctl.tf([-Vi_typ/D_d**2/(wesr*wRHP),Vi_typ/(D_d**2)*(1/wesr-1/wRHP),Vi_typ/D_d**2],[1/(w_n**2),2*delta/w_n,1])

#無駄時間の伝達関数
num_delay, den_delay = ctl.pade(Ts, 1)
#プラント+むだ時間の伝達関数
Gplant = tf_Gdv * ctl.tf(num_delay, den_delay)

#プラントのボード線図の計算
gain_plant, phase_plant, w = ctl.bode(Gplant, Plot=False)
f = w/2/np.pi#単位を[rad/sec]を[Hz]に変換
gain_plant_dB = 20*np.log10(gain_plant)#単位を[dB]に変換
phase_plant_deg = phase_plant * 180/np.pi#単位を[rad]から[deg]に変換

#plantのボード線図表示
fig, ax = plt.subplots(2,1)
ax[0].semilogx(f, gain_plant_dB)
ax[0].set_yticks([-20,0,20,40,60])
ax[0].grid(which = "both", axis = "x")
ax[0].grid(which = "both", axis = "y")
ax[0].set_ylabel("gain[dB]")
ax[1].semilogx(f, phase_plant_deg)
ax[1].set_yticks([-180,-135,-90,-45,0])
ax[1].grid(which = "both", axis = "x")
ax[1].grid(which = "both", axis = "y")
ax[1].set_ylabel("phase[deg]")
ax[1].set_xlabel("f[Hz]")

#コントローラー設定
fz1=1.5e3
fz2=1.5e3
f1=400

wz1 = 2*np.pi*fz1
wz2 = 2*np.pi*fz2
w1 = 2*np.pi*f1

Gz1 = ctl.tf([1/wz1,1],[1])
Gz2 = ctl.tf([1/wz2,1],[1])
Gw1 = ctl.tf([w1],[1,0])

x = ctl.series(Gz1,Gz2)
Gc = ctl.series(Gw1,x)

#トータルの制御伝達関数
Gtotal = ctl.series(Gc,tf_Gdv)

#トータル伝達関数のボード線図
gain, phase, w = ctl.bode(Gtotal, Plot=False)
f = w/2/np.pi#rad/secをHzに変換
gain_dB = 20*np.log10(gain)#dBに変換
phase_deg = phase * 180/np.pi#radをdegに変換


#系全体のボード線図表示
fig, ax = plt.subplots(2,1)
ax[0].semilogx(f, gain_dB)
ax[0].set_yticks([-20,0,20,40,60])
ax[0].grid(which = "both", axis = "x")
ax[0].grid(which = "both", axis = "y")
ax[0].set_ylabel("gain[dB]")
ax[1].semilogx(f, phase_deg)
ax[1].set_yticks([-180,-135,-90,-45,0])
ax[1].grid(which = "both", axis = "x")
ax[1].grid(which = "both", axis = "y")
ax[1].set_ylabel("phase[deg]")
ax[1].set_xlabel("f[Hz]")

#回路定数への落とし込み
Vref=1
#R2/(R1+R2)=Vref/Vo
#R2=Vref/Vo*(R1+R2)
#(1-Vref/Vo)*R2 = Vref/Vo*R1
#R1 = Vo/Vref(1-Vref/Vo)*R2
R2 = 5e3#フィードバック抵抗の下側
R1 = Vo/Vref*(1-Vref/Vo)*R2#フィードバック抵抗の上側

Cz2=1/(w1*R1)#エラーアンプのコンデンサ容量
Cz1=1/(wz1*R1)#フィードバック抵抗に付くコンデンサ容量
Rz2=1/(wz2*Cz2)#エラーアンプの抵抗

これを「jupyter notebook」に書いて、ボード線図を表示したり、定数を変えて計算したり、を繰り返して設計しました。

波形と系の安定性

LTspiceの動作波形は以下です。

ちゃんと設計通りに14.5Vが出力しており、エラーアンプ出力も安定しています。問題ありません。

系全体のボード線図は以下の通りです。

結構安定性が危ないです。45degを切ってますね。

昇圧コンバータの動作原理

簡単に動作原理を説明します。回路はこんな感じですね。

スイッチONのときはこういう電流経路で

スイッチOFFのときはこういう電流経路です。

コイルの電流を流し続ける特性を活かして出力に電力を送ってます。

入出力電圧関係式は以下の通りです。

$$V_{out}=\frac{1}{1-D}*V_{in}$$

入出力電圧関係式の導出

ON/OFFでコイル電流の増減は0になります。

スイッチON時のコイル電流
$$V_{in}=L\frac{di_{ON}}{dt}$$
$$di_{ON}=\frac{V_{in}}{L}dt$$

スイッチOFF時のコイル電流
$$V_{in}-V_{out}=L\frac{di_{OFF}}{dt}$$
$$di_{OFF}=\frac{V_{in}-V_{out}}{L}dt$$

これを足したら0になります。
$$di_{ON}+di_{OFF}=0$$
$$\frac{V_{in}}{L}dt_{ON}+\frac{V_{in}-V_{out}}{L}dt_{OFF}=0$$
$$\frac{V_{in}}{L}dt_{ON}=-\frac{V_{in}-V_{out}}{L}dt_{OFF}$$
Lを消します。
$$V_{in}dt_{ON}=-(V_{in}-V_{out})dt_{OFF}$$
$$V_{in}dt_{ON}=-(V_{in}-V_{out})dt_{OFF}$$
dt_ON=T_ON,dt_OFF=T_OFFなので、そう書きますね。
$$V_{in}T_{ON}+V_{in}T_{OFF}=V_{out}T_{OFF}$$
$$\frac{V_{in}T_{ON}+V_{in}T_{OFF}}{T_{OFF}}=V_{out}$$
$$V_{out}=\frac{V_{in}T_{ON}+V_{in}T_{OFF}}{T_{OFF}}$$

TON/TOFFはDUTY比とスイッチング周期TPWMを使って以下のように表せます。
$$T_{ON}=T_{PWM}Duty_{on}$$
$$T_{OFF}=T_{PWM}(1-Duty_{on})$$

$$V_{out}=\frac{V_{in}T_{PWM}Duty_{on}+V_{in}T_{PWM}(1-Duty_{on})}{T_{PWM}(1-Duty_{on})}$$
TPWMを消します。
$$V_{out}=\frac{V_{in}Duty_{on}+V_{in}(1-Duty_{on})}{(1-Duty_{on})}$$
$$V_{out}=\frac{V_{in}}{1-Duty_{on}}$$
はい。こんな感じですね。

ON時間が大きくなるとVoutも大きくなるって感じですね。

インダクタの設定

インダクタは10uHとしました。インダクタはコイルのリップル電流をどのくらいにするか?で決定します。といってもこれが特性にクリティカルになるというわけではないので、ざっくり設定してしまえば良いと思います。

電流モード制御ではコイル電流をフィードバック制御に利用するため、出力電流の30%程度が望ましいようです。

コイルリップル電流は以下の式で計算できます。

$$ΔiL==\frac{V_{in}}{L}T_{ON}$$

以下で今回のケースのリップル電流を試しに計算してみます。

まずTonを計算します。

$$T_{ON}=T_{PWM}D_{on}$$

$$V_{out}=\frac{V_{in}}{1-D_{on}}$$

これらの式を利用します。下の方の式をDon=の式に直すと

$$V_{out}-V_{out}D_{on}=V_{in}$$
$$-V_{out}D_{on}=V_{in}-V_{out}$$
$$D_{on}=\frac{-V_{in}+V_{out}}{V_{out}}$$

となります。今回Vin=8V、Vout=14.5Vなので

$$D_{on}=\frac{14.5-8}{14.5}=0.448$$

ですね。これをTon=の式に代入してTonを計算します。

$$T_{ON}=T_{PWM}D_{ON}=3.3333usec*0.4482=1.494usec$$

これを最初のΔiL=の式に代入します。

$$ΔiL==\frac{V_{in}}{L}T_{ON}=\frac{8}{10u}1.494u=1.1952≒1.2A$$

はい。今回のケースでは1.2Aとなりました。5Aに対しては24%。まぁいいんじゃないですかね。電圧モード制御だし。

出力コンデンサの容量設定

出力のリップル電圧から決定するのがセオリーですが、ぶっちゃけ適当です。今回は440uFとしました。でかすぎると制御が安定させるのが難しくなったり、突入電流がでかくなったりとあるので、このくらいにしておきました。問題あれば、変更すれば良いかと思います。

帰還の分圧抵抗の設定

下の赤枠の部分です。

今回は誤差増幅器の電圧値を1Vとしました。負帰還が効いている限りFBは1Vとなります。出力値を14.5Vとするので、

$$V_{FB}=\frac{R_3}{R_2+R_3}V_{out}$$

で計算できます。私はR3を先に固定値5kΩと決め打ちして、R2を67.5kΩね。と計算しました。R2,R3は合計で大体100kΩ程度にすると良いかと思います。抵抗値が小さすぎると消費電流が大きくなりますし、抵抗値が大きすぎるとノイズに弱くなります。

フィードバック回路の設計

フィードバック制御がやってること

フィードバック制御では以下のように制御します。

出力電圧低下➡DUTYを太くして出力電圧値を上げる。
出力電圧増加➡DUTYを細くして出力電圧値を下げる。

これを安定して行えるようにフィードバック位相補償設計をしてやります。

フィードバック制御の安定性判別

安定、不安定を判別する手段があります。細かい話をすると「ラウス・フルビッツの安定性判別法」や「ナイキスト安定性判別法」など色々ありますが、とりあえず抑えておけば良いのが

系のゲインが0のときに位相が180deg回っていれば、不安定

系のゲインが0のときに位相が180deg回っていなければ、安定

ということです。そうなる様に設計します。最初に示したボード線図では安定と判断できます。(結構ギリギリですが。)

このように判定するためにはまず系全体のボード線図を描く必要があります。それには系全体の伝達関数を解かなければなりません。大変ですね。先ほど提示したPYTHONのコードに系全体の伝達関数を計算しておりますが、今回はざっくり制御設計のイメージを解説します。

ざっくり制御設計のイメージ解説

まず制御対象の昇圧コンバータのプラント部分(出力LC)のボード線図がどうなるかをイメージしましょう。まぁこんな感じになります。

ここで重要なのはgainとphaseが急激に変化している10^3Hzのポイントです。これがLCで決まる共振周波数でgainが-40dB/decade、phaseが-180deg回ります。系の安定の条件は↓です。

系のゲインが0のときに位相が180deg回っていなければ、安定

もうこのLCで180deg回ってしまってるじゃん!!がスタートラインです。この180degの位相回りを位相補償回路でここを持ち上げる。というのが制御設計のイメージです。(180degを↓の赤ラインみたいにすると安定ですね。)

具体的設計手順

ここではざっくり設定手順を紹介します。

設計手順

①LCの共振周波数fpoleを計算する。
②fpoleと同じか少し遅い周波数でゼロ点を2つ設定する。
③シミュレーションでエラーアンプ出力が安定しているかチェック
④エラーアンプ接続された抵抗を調整して②、③を繰り返す。

トライアンドエラーで恐縮ですが、ざっくり設定方法はこれですね。厳密に行きたい人は全ての伝達関数を計算して上記のようなボード線図を計算しましょう。

では実際にやってみます。

①LCの共振周波数を計算する。

この式で計算できます。↓

$$f_{pole}=\frac{1}{2\pi\sqrt{LC}}$$

今回はL=10uH C=440uFなので、

$$f_{pole}=\frac{1}{2\pi\sqrt{LC}}=\frac{1}{2\pi\sqrt{10u*440u}}=2399.35=2.4kHz$$

2.4kHzですね。LCのボード線図を見てみると

1.5kHzくらいですね。ん~ちょっと合ってないですが、まぁ大体そのくらいです。この点をfpoleとします。

②fpoleと同じ or 少し遅い周波数でゼロ点を2つ設定する。

回路的には以下の赤枠の箇所の抵抗とコンデンサの値を設定します。

これらの抵抗とコンデンサではゼロ点(位相進み)が作られます。これをさっきのLCのポール(位相遅れ)の2.4kHz付近にブチ当ててやれ!そしたら-180degの位相遅れが解消されるだろ!って発想です。

具体的には以下の計算式でゼロ点周波数を計算できます。

$$f_{z1}=\frac{1}{2\pi R_2C_3}$$

$$f_{z2}=\frac{1}{2\pi R_4C_4}$$

今回はゼロ点周波数を1.5kHzとします。R2は67.5kΩと決まっているので、逆算します。

$$C_3=\frac{1}{2\pi R_2f_{z1}}=\frac{1}{2\pi 67.5k*1.5k}=1.5719n=1.6nF$$

f_z2は2つの変数があるので設定に迷いますが、私は大体R4=10kΩ、12kΩ、14kΩと振りながらC4を設定してシミュレーションで安定しているかを確認しながら設定しました。(上記の③、④をやっていったってことです。)

今回は18kΩで落ち着きました。計算としては以下の通りです。

$$C_4=\frac{1}{2\pi R_4f_{z2}}=\frac{1}{2\pi 18k*1.5k}=5.89n=5.9nF$$

コントローラーのボード線図はこんな感じですね。

1.5kHzを超えたあたりで位相が+90deg進んでおり、2つのゼロ点が入っているのがわかります。

これで大体終わりです。

C5はどうなるか?気になる方がおられるかもしれませんが、これは高周波の位相進みです。一応おまじない程度にいれています。100kHz以上に設定したかな。そこでもゲインがもし落ちてなかったら嫌なので、バキッと落ちとけよ!!でいれています。

まとめ

今回は昇圧コンバータの回路を作成しました。電圧モードのフィードバック制御も加えたものです。フィードバック設計は最初は戸惑う方もおられると思いますが、やってみると案外簡単です。

以上です。何かの参考になれば幸いです。最後までお読みいただきありがとうございした。