ダイナミックシステムとしてのDC-DCバックコンバータ
モデル
上の回路図1の電圧$V$と電流 $I$は以下のような非自律的ノンスムースシステムで表される。これをDC-DCバックコンバータDC-DC Buck Converterと呼ぶ。
$$ \begin{align*} \dot{V} =& - {{ 1 } \over { RC }} V + {{ 1 } \over { C }} I \\ \dot{I} =& - {{ V } \over { L }} + \begin{cases} 0 & , \text{if } V \ge V_{r} (t) \\ E / L & , \text{if } V < V_{r} (t) \end{cases} \\ V_{r} (t) =& \gamma + \eta \left( t \bmod T \right) \end{align*} $$
変数
- $V(t)$: $t$時点の電圧を表す。
- $I(t)$: $t$時点の電流を表す。
- $V_{r}(t)$: $t$時点の$T$周期のコントロールシグナル。このシグナルより電圧が低ければスイッチを開けてバッテリーを充電し、高ければスイッチを閉じて電流を供給する。
パラメータ
- $\gamma , \eta , T > 0$: コントロールの設定に関連する定数。$\gamma = 11.75238 V$が小さくなるほど低い電圧で電流が供給され、$\eta = 1309.524Vs^{-1}$が大きくなるほど高い電圧でバッテリーが充電される。$T = 400 \mu s$が小さいほどスイッチングが頻繁に行われ、電圧をより均一に保つ。
- $C = 47 \mu F$: キャパシタンス。
- $E = 53.500001$: バッテリー電圧。
- $L = 20 mH$: インダクタンス。
- $R = 22 \Omega$: 抵抗。
パラメータのデフォルト値は、このポストで再現されるすべてのシミュレーションに使用された値であり、$m = 10^{-3}$、$\mu = 10^{-6}$である。ちなみに主要な参考文献(Bernardo)では$C$は$4.7 \mu F$だったが、別の参考文献(Deane)では$C = 47 \mu F$を使ったときにシミュレーションがうまく行かなかったため、$C$を異なる設定にした。
説明
DC-DCバックコンバータ、つまりバックコンバータは、入力電圧よりも電圧を下げる目的のコンバータ2だが、実際にはこの’アイテム’についてはよく知らない。タイトルの通り、システムについての説明だけをしたいと思う。
ノンスムースシステム
方程式から分かるように、バックコンバータシステムは微分が連続ではないため、ノンスムースなシステムである。赤い線はコントロールシグナル$V_{r} (t)$であり、電圧$V(t)$がこのシグナルを超えるかどうかによって、システムがジャンプしてノンスムースに変化することが確認できる。このため、システムの電圧はおおよそ11.5~14.0Vの間で維持される。
カオスシステム
スイッチが開いたり閉じたりする部分システムsubsystemだけ見れば、それぞれが線形システムであるため難しくなさそうだ。しかし、問題は $V(t) = V_{r}(t)$な時点$t$、つまりスイッチが入ったり切れたりするタイミングが全く一貫性がないことだ。
上の図はトラジェクトリーでいつスイッチングが発生するかを示している。見ての通り、点々がある程度群をなしている帯、つまり$V \approx V_{r}$の領域は存在しているが、$V,I$だけ見て確実に言えるわけではない。このようなノンスムース性のため、この見た目ほど単純ではないシステムは実際にはカオスであり、長い間多く研究されてきた3。
バイフルケーション
パラメータ$E$を変えながらシグナルの周期に合わせて$V$の値をプロットすると、上の図のようなバイフルケーションを見ることができる4。$E \approx 25$で2つの枝が出現し、交差して、$E \approx 30$で枝周辺に周期的オービットが現れるのは正常である。
コード
トラジェクトリー
次は、システムを解いてジャンピングポイントの位置を示した図を再現できるジュリアコードだ。
using CSV, DataFrames, Clustering
function RK4(f::Function,v::AbstractVector, h=10^(-2))
V1 = f(v)
V2 = f(v + (h/2)*V1)
V3 = f(v + (h/2)*V2)
V4 = f(v + h*V3)
return v + (h/6)*(V1 + 2V2 + 2V3 + V4)
end
if !isfile("./buck.csv")
m = 10^(-3)
μ = 10^(-6)
R = 22
C = 47μ
L = 20m
T = 400μ
γ = 11.75238
η = 1309.524
E = 53.500001
Vr(t) = γ + η * (mod(t, T))
function buck(v)
V, I, t = v
V̇ = - V/(R*C) + I/C
İ = - (V/L) + ifelse(V < Vr(t), E/L, 0)
return [V̇, İ, 1]
end
u0 = [12.3, 0.55, 0.0]
u_ = [u0]
∇_ = []
dt = 0.00001; tend = 0.25
for t in dt:dt:tend
push!(∇_, buck(u_[end]))
push!(u_, RK4(buck, u_[end], dt))
end
push!(∇_, buck(u_[end]))
U = stack(u_)[Not(end), :]
∇ = stack(∇_)[Not(end), :]
CSV.write("buck.csv", DataFrame(
[collect(0:dt:tend)'; U; ∇; Vr.(0:dt:tend)']'
, ["t", "V", "I", "dV", "dI", "Vr"]))
end
DATA = CSV.read("data/buck.csv", DataFrame)
Y = select(DATA, [:dV, :dI]) |> Matrix .|> Float32
X = select(DATA, [ :V, :I]) |> Matrix .|> Float32
XY = [X Y]
dbs = dbscan(col_normalize(Y)', 0.01); nsubsys = length(dbs.clusters); println(nsubsys, " clusters found!")
a1 = plot(DATA.V, DATA.I, alpha = 0.1, legend = :best, label = "Trajectory", xlabel = L"V", ylabel = L"I")
scatter!(a1,
DATA.V[Not(1)][.!iszero.(diff(dbs.assignments))]
, DATA.I[Not(1)][.!iszero.(diff(dbs.assignments))]
, color = 1, shape = :+, label = "Jumping points")
バイフルケーションダイアグラム
次はバイフルケーションダイアグラムのコードだ。注意してほしいのは、少し技術的な問題があって、実際にバックコンバータをシミュレーションする場合は、時間間隔が$h = 10^{-7}$くらい必要である。オイラーメソッドを使用しても、Intel i7-12700Fを基準にすると10時間ほどかかる。
https://upload.wikimedia.org/wikipedia/commons/c/ca/Commutation_cell_in_converters.svg ↩︎
J. H. B. Deane and D. C. Hamill, “Analysis, simulation and experimental study of chaos in the buck converter,” 21st Annual IEEE Conference on Power Electronics Specialists, San Antonio, TX, USA, 1990, pp. 491-498, doi: https://doi.org/10.1109/PESC.1990.131228. ↩︎
M. di Bernardo, F. Garefalo, L. Glielmo and F. Vasca, “Switchings, bifurcations, and chaos in DC/DC converters,” in IEEE Transactions on Circuits and Systems I: Fundamental Theory and Applications, vol. 45, no. 2, pp. 133-141, Feb. 1998, doi: https://doi.org/10.1109/81.661675 ↩︎