サイトマップ

LTspice with Python 3. シミュレーションの条件変更

LTspice with Python 3. シミュレーションの条件変更

LTspiceの電気回路シミュレータをPythonで利用する方法を紹介する
今回は、Pythonでシミュレーションを実行する際にコンポーネントのパラメータを変更する

回路図作成

PチャネルMOSFET (SSM3J351R) を使って、圧空系の電磁弁を駆動する回路を作成する

  1. ロジック側(5VD)とドライブ側(24VL)との分離のため、フォトカプラを間に使用する
  2. PチャネルMOSFETを使用して、電磁弁をソース駆動させる
  3. 電磁弁のインダクタンスによる逆起電圧の防止用にダイオードを追加する

パラメータの変更

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側の駆動ができなくなることがわかる

私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください