LTspice with Python 3. シミュレーションの条件変更
LTspiceの電気回路シミュレータをPythonで利用する方法を紹介する
今回は、Pythonでシミュレーションを実行する際にコンポーネントのパラメータを変更する
回路図作成
PチャネルMOSFET (SSM3J351R) を使って、圧空系の電磁弁を駆動する回路を作成する
- ロジック側(5VD)とドライブ側(24VL)との分離のため、フォトカプラを間に使用する
- PチャネルMOSFETを使用して、電磁弁をソース駆動させる
- 電磁弁のインダクタンスによる逆起電圧の防止用にダイオードを追加する
パラメータの変更
ascファイルから、netファイルを生成し、netファイルを直接編集してパラメータを変更する
今回は、フォトカプラの入力側の抵抗 R4 の抵抗値を変更する
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
このネットリストの R4 の 1kΩ を変更して、シミュレーションを実行する
シミュレーションの実行
抵抗値を 1kΩ ~ 50kΩ でシミュレーションを実行する
fname = 'P-MOSFET_R4' infos_ = [ ['R4 50k', 'R4 N005 0 50k\n'], ['R4 20k', 'R4 N005 0 20k\n'], ['R4 5k', 'R4 N005 0 5k\n'], ['R4 1k', 'R4 N005 0 1k\n'], ] # 該当の行番号を取得する line_no = LTC.get_component_info('R4')['line'] for i, [name_, info_] in enumerate(infos_): # netlistを編集し、編集後の中身を確認する LTC.netlist[line_no] = info_ print(LTC.get_component_info('R4')) # 確認 # 編集したnetlistの情報でシミュレーションを実行する run_net_file = fname + '_%d' % i + '.net' LTC.run(run_filename=run_net_file) LTC.wait_completion()
{'designator': 'R4', 'nodes': ' N005 0', 'model': None, 'value': '50k', 'line': 7} {'designator': 'R4', 'nodes': ' N005 0', 'model': None, 'value': '20k', 'line': 7} {'designator': 'R4', 'nodes': ' N005 0', 'model': None, 'value': '5k', 'line': 7} {'designator': 'R4', 'nodes': ' N005 0', 'model': None, 'value': '1k', 'line': 7}
各条件でシミュレーションが実行され、結果のファイル(P-MOSFET_R4_0.raw ~ P-MOSFET_R4_3.raw)が生成される
シミュレーション結果の確認
生成された各rawファイルを可視化する
from PyLTSpice import RawRead fig = plt.figure(figsize=(8, 4)) ax1 = fig.add_subplot(2, 2, 1) ax2 = fig.add_subplot(2, 2, 3, sharex=ax1) ax3 = fig.add_subplot(2, 2, 2, sharex=ax1) ax4 = fig.add_subplot(2, 2, 4, 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 Vn002 = LTR.get_trace("V(n002)").get_wave(0) IR4 = LTR.get_trace("I(R4)").get_wave(0) * 1e3 ax1.plot(x, Vn006, label=name_) ax2.plot(x, IR1, label=name_) ax3.plot(x, Vn002, label=name_) ax4.plot(x, IR4, 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]') ax3.legend(); ax3.grid(which='both', ls=':') ax3.set_xlabel('[ms]'); ax3.set_ylabel('V$_{in}$[V]') ax4.legend(); ax4.grid(which='both', ls=':') ax4.set_xlabel('[ms]'); ax4.set_ylabel('I$_{R4}$[mA]') fig.tight_layout()
各条件のシミュレーションが正常に実行できている
抵抗値が大きいと、電流が小さくなり、FET側の駆動ができなくなることがわかる
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください