LTspice with Python 4. シミュレーションの条件変更2
LTspiceの電気回路シミュレータをPythonで利用する方法を紹介する
今回は、Pythonでシミュレーションを実行する際にコンポーネントとの接続を切る方法を紹介する
回路図作成
PチャネルMOSFET (SSM3J351R) を使って、圧空系の電磁弁を駆動する回路を作成する
- ロジック側(5VD)とドライブ側(24VL)との分離のため、フォトカプラを間に使用する
- PチャネルMOSFETを使用して、電磁弁をソース駆動させる
- 電磁弁のインダクタンスによる逆起電圧の防止用にダイオードを追加する
パラメータの変更
ascファイルから、netファイルを生成し、netファイルを直接編集してパラメータを変更する
今回は、逆起電圧防止にダイオードを切断し、有無を比較する
ascファイルの読み込み
SimCommander を使って、ascファイルを読み込む
読み込むと同時に、netファイルが生成される
import matplotlib.pyplot as plt from PyLTSpice import SimCommander LTC = SimCommander("P-MOSFET.asc")
生成されたnetファイルを確認する
!more P-MOSFET.net
* c:\Users\XXXX\P-MOSFET.asc L1 N006 N007 10m R1 N007 0 240 V1 N001 0 24 R2 N004 N003 10k R3 N001 N004 20k V2 N002 0 PULSE(0 5 2m 0 0 10m 20m 1) R4 N005 0 1k D1 0 N006 RB400D XU1 N006 N004 N001 PMOS_SSM3J351R XU2 N002 N005 0 N003 TLP291_SE .model D D .lib C:\Users\XXXX\AppData\Local\LTspice\lib\cmp\standard.dio .tran 0 20m 0 1u .lib Contrib/Toshiba/LVMOS/SSM3J351R_G0_00.mod .lib importsub/TLP291_SE.mod .backanno .end
上記の D1 の 接続情報を変更して、シミュレーションを実行する
シミュレーションの実行
D1の接続を切る場合は、NC
の適当な番号に接続させれば良い
fname = 'P-MOSFET_D1' infos_ = [ ['Diode OFF', 'D1 0 NC_999 RB400D\n'], ['Diode ON', 'D1 0 N006 RB400D\n'], ] # 該当の行番号を取得する line_no = LTC.get_component_info('D1')['line'] for i, [name_, info_] in enumerate(infos_): # netlistを編集し、編集後の中身を確認する LTC.netlist[line_no] = info_ print(LTC.get_component_info('D1')) # 確認 # 編集したnetlistの情報でシミュレーションを実行する run_net_file = fname + '_%d' % i + '.net' LTC.run(run_filename=run_net_file) LTC.wait_completion()
{'designator': 'D1', 'nodes': ' 0 NC_999', 'value': 'RB400D', 'line': 8} {'designator': 'D1', 'nodes': ' 0 N006', 'value': 'RB400D', 'line': 8}
各条件でシミュレーションが実行され、結果のファイル(P-MOSFET_D1_0.raw, P-MOSFET_D1_1.raw)が生成される
シミュレーション結果の確認
生成された各rawファイルを可視化する
from PyLTSpice import RawRead fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) for i, [name_, info_] in enumerate(infos_): run_raw_file = fname + '_%d' % i + '.raw' LTR = RawRead(run_raw_file) x = LTR.get_trace('time').get_wave(0) * 1e3 Vn006 = LTR.get_trace("V(n006)").get_wave(0) IR1 = LTR.get_trace("I(R1)").get_wave(0) * 1e3 ax1.plot(x, Vn006, label=name_) ax2.plot(x, IR1, label=name_) ax1.legend(); ax1.grid(which='both', ls=':') ax1.set_xlabel('[ms]'); ax1.set_ylabel('V$_{out}$[V]') ax2.legend(); ax2.grid(which='both', ls=':') ax2.set_xlabel('[ms]'); ax2.set_ylabel('I$_{out}$[mA]') fig.tight_layout()
各条件のシミュレーションが正常に実行できている
ダイオードを外すと、コイルにより逆起電圧が発生し、発振していることがわかる
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください