秋月ファンクラブ掲示板 過去ログ

spiceでステップごとに抵抗変化 - mulucky

2014/07/18 (Fri) 00:23

はじめて投稿します。
コイルと抵抗とで構成された回路計算を検討しています。コイルは温度によって抵
抗を変えて計算します。spiceでは固定抵抗の入力はできますが、ステップごとに
別のサブルーチンで計算した抵抗に変えることはできないと認識しています。
LTSpiceでは時間を変数として多項式近似による抵抗値を入力できるということな
ので、ゼロステップからnステップ目までの各ステップでの発熱からコイル温度を
計算し、多項式で近似した抵抗値を使ってn+1ステップ目の電流を計算するという
ループを繰り返すことを試みています。この方法では無駄な計算が多いですが、よ
い方法がありましたらご教示願えれば幸いです。宜しくお願いします。

Re: spiceでステップごとに抵抗変化 - inara1

2014/07/18 (Fri) 20:09

LT-spiceでは、抵抗値が時間変化するような抵抗を定義することができます。それ
を使えば、発熱によって直流抵抗が変わるコイルをシミュレーションに組み込むこ
とができます。

LT-spiceの過渡シミュレーションでは、時間を細かく区切って、その時間ステップ
ごとに回路の状態を計算している(時間ステップは一定ではありませんんが)の
で、ご質問の「ステップごとに温度を変化」というのもその意味だと思います。

具体例は明日添付します。

Re: spiceでステップごとに抵抗変化 - mulucky

2014/07/19 (Sat) 02:00

inara1さん

早速コメントいただき有難うございます。
私が描いている計算の流れはこんな感じです。
(データ引渡しなどこんな風にはいかないかもしれませんが)

?LT-spiceでコイル抵抗初期値に対して電流計算
?電流、抵抗からコイルのジュール発熱計算
?初期温度から、発熱と比熱を用いて温度差?Tを計算して次ステップのコイル温度T
を更新
?温度からコイル抵抗計算(別に作成したコードを使用。spiceの電流出力を外部
ファイルなど何らかの形で受け取る。計算した抵抗値も外部ファイル経由などで
spiceに戻す)
?コイル抵抗値を用いて次のステップの電流計算

を繰り返す。
spiceでの電流計算時に前のステップの状態を保持していれば、コイル抵抗値だけ
を変更して次のステップの電流を計算できるので、それができれば大変ありがたい
ですが、無理でしょうか。お知恵を拝借できればと思います。
宜しくお願い致します。

Re: spiceでステップごとに抵抗変化 - inara1

2014/07/19 (Sat) 05:58

添付図は、インダクタンスL1、直流抵抗R0(常温で10Ω)のコイルに10Vのステッ
プ電圧を印加したときの、コイル電流とコイル温度の過渡応答をLT-spiceでシミュ
レーションした結果です。

下のグラフのV(temp)がコイルの上昇温度、I(B1)がコイルに流れる電流です。縦
軸の左側が上昇温度(単位はVとなっていますが1V=1℃です)、右側がコイルに流
れる電流です。コイルに流れる電流が最初は徐々に大きくなっているのはインダク
タンスの影響で、ある時間で最大値に達し、その後徐々に小さくなっていきます。
電流値が下がっていくのは温度上昇による抵抗値の上昇のためです。充分時間が経
過するとコイルの上昇温度も電流も定常値になっていきます。

B1が「抵抗値の温度依存がある抵抗」です。B1は、LT-spiceのメニューの Edit →
Comonent → bi で出てくるビヘイビア電流源です。この記号を右クリックしたと
きに、Value欄に書かれた I=F(...) を消して
R=式
と書くと、時間変化する抵抗値を定義できます。R=の右辺の式は、添付図の例では
{R0}*(1+{a}*V(temp)) --- (1)
となっていますが、R0は常温での抵抗値、a は抵抗値の温度係数、V(temp) は抵抗
の上昇温度です。

R0とaの数値は
.param R0=10 a=2000e-6 Rth=50 tc=1
で指定しているように定数としていますが、a が温度に対して非線形の場合は、
V(temp)の関数として式(1)の中に書いてもいいです。V(temp)が時間変化したと
き、B1の抵抗値は式(1)のように変化することになります。LT-spiceでは、ユーザ
が定義した変数を式の中で使うときには、{}で囲む約束があるのでそのようにし
ています。

V(temp)というのは、添付図のビヘイビア電圧源B2の出力電圧です。これは、メ
ニューの Edit → Comonent → bv で出てくる記号です。この記号を右クリックし
たときに、Value欄に
V=式
と書くと、時間変化する電圧を定義できます。右辺の式は、添付図の例では
{Rth}*(V(out1)-V(out2))*I(B1)*(1-exp(-time/{tc})) --- (2)
ですが、これは抵抗の上昇温度の時間変化を表したものです。Rthは抵抗の熱抵
抗、V(out1)は端子out1の電圧、V(out2)は端子out2の電圧、I(B1)はB1に流れる電
流、timeは時間(単位は秒)、tcは抵抗の温度上昇の時定数です(コイルの比熱と
比重と体積の積)。(V(out1)-V(out2))*I(B1) はB2の消費電力になります。

RthとTCは
.param R0=10 a=2000e-6 Rth=50 tc=1
で定義しています(Rth=10℃/W、tc=1秒)。

添付図の例では、抵抗の上昇温度を見るために、式(2)の結果を別回路として、そ
の出力電圧にtempというラベルをつけています。tempの電圧(V単位)が上昇温度
(℃単位)に対応しています。

このシミュレーションでは、最初に電源V1の初期値を0Vとして回路中の電流や電圧
の初期値を計算し、次にV1を10Vに変化させたときの回路中の電流や電圧の過渡的
な変化を計算しているので、muluckyさんの?から?までのステップを実行している
はずです。ステップ時間の幅はこちらからコントロールできませんが、変化が速い
時は幅を小さく、変化が遅いときは幅を大きくしていると思います。

この結果を数値データとしてExcelなどに取り込む方法はここ
(http://akizuki-fan.bbs.fc2.com/?act=reply&tid=10583965)にあるので、
その数値を見れば、どのような時間ステップで計算しているのか分かります。

Re: spiceでステップごとに抵抗変化 - mulucky

2014/07/26 (Sat) 22:30

inara1さん

御礼が遅くなり申し訳ありません。具体的にわかりやすく示して頂き、とても勉強になります。有難うございます。
1点確認させてください。抵抗の温度依存についてですが、事前に多項式で与えられるケースでは教えて頂いた方法で出来ると思いますが、例えばコイルに三次元温度分布があってコイル抵抗を1個の温度関数で表せないようなケースでは、コイル抵抗をspice以外で計算して、その値を回路計算中のコイル抵抗として入力したい場合があります。spice単独では閉じない計算はできるのでしょうか。
普段はこのようなことを考える必要はないのですが、ここまで気にする計算をしています。細かい話ですみません。

Re: spiceでステップごとに抵抗変化 - inara1

2014/07/27 (Sun) 08:48

他のファイルのデータからLTspiceにパラメータを取り込みたいということでしょうか。
過渡解析での各ノードの電圧値の途中経過を保存したり、各ノードの電圧の初期値を別ファイルから読み込むことはできます。

添付図の上半分の例では、積分回路の過渡応答での1msでの電圧値を savebiasコマンドで、test.txtというファイルに保存しています。下半分の例では、各電圧の初期値をloadbaisというコマンドで、test1.txtというファイルから読み込んでいます(savebaiasもloadbiasも冒頭にドットがついていることに注意)。

途中までの状態(test.txt)を外部で処理し、test1.txtという新たな初期値のデータを生成し、それを使ってLTspiceで実行すれば、途中の計算を外部で行うようなシミュレーションができます。時間ステップを変えて大量のデータ処理を実行するときは、コマンドラインによる実行(http://jaco.ec.t.kanazawa-u.ac.jp/edu/ec2/ltspice/11.html)を使うと便利かもしれません(こちらではやったことはありません)。

Re: spiceでステップごとに抵抗変化 - mulucky

2014/07/30 (Wed) 00:55

inara1さん

たびたび有難うございます。
まだ試してはおりませんが、文面を拝見するに私がやりたいことができそうです。1点確認させてください。.loadbiasコマンドで次ステップに入力する情報は(1)外部ツールで計算するコイル抵抗値と、(2)電流変化で誘導される起電力Ldi/dt(他コイルとの磁気カップルもありますがここでは簡単にこれだけとします)です。di/dtの情報を.savebiasコマンドで保存することはできるのでしょうか。例で示して頂いたようにコイル両端電圧Vを.savebiasコマンドで保存して、それをコイル両端初期値として.loadbiasで読み込むことで対応できる気もしますが、あれば教えて頂ければ幸甚です。
途中データの引継ぎができると、spiceだけでなくFEMや磁場ソルバのような他の解析ツールとの連携解析が可能となり、とても重宝すると思います。

Re: spiceでステップごとに抵抗変化 - inara1

2014/07/30 (Wed) 05:59

L*di/dtはコイル両端の電圧なので、どこにもつながっていないノードを新規に作って(ノード名だけつける)、di/dtの値を、そのノードの電圧として引き渡し、LTspice側でその電圧にLをかけた値をコイル両端の電圧とすればいいのではないでしょうか。

両端の電圧差を指定するには、Nxxx, Nyyyをコイル両端のノード番号またはノード名として
.ic V(Nxxx, Nyyy)=V(新規に作ったノード)
とすればいいと思います(試していません)。

Re: spiceでステップごとに抵抗変化 - mulucky

2014/07/31 (Thu) 00:31

inara1さん

ありがとうございます。
ダミーのノードに電圧を引き渡す方法、おっしゃるとおりですね。早速試してみたいと思います。
.loadbias, .savebiasコマンドを教えて頂いたので、いろいろ調べてみましたが、一般的な書籍には書かれていないコマンドがたくさん用意されているのですね。勉強すればもっと便利な使い方ができそうです。