サイトマップ

回路の素101 071 フル・ブリッジ MOSFET使用

回路の素101 071 フル・ブリッジ MOSFET使用

負荷を正負両方向で駆動することができる
単電源で動作することができる
トランジスタよりスイッチング動作が速い

回路図作成

  • 基本的な構成

動作仕様

3条件に分ける

V1/V2 = Lo/Lo

 M_1 = ON
 M_2 = OFF

入力  V_1 入力  V_2 入力  V_3 入力  V_4 MOSFET  M_1 MOSFET  M_2 MOSFET  M_3 MOSFET  M_4  V_{out+}  V_{out-} 出力  V_{out}
Lo Lo Lo Lo ON OFF ON OFF  V_{CC}  V_{CC} 0
Lo Lo Hi Lo ON OFF OFF OFF  V_{CC} 不定 不定
Lo Lo Hi Hi ON OFF OFF ON  V_{CC} -  V_{DS}  V_{DS}  V_{CC} - 2V_{DS}

V1/V2 = Hi/Lo

 M_1 = OFF
 M_2 = OFF

入力  V_1 入力  V_2 入力  V_3 入力  V_4 MOSFET  M_1 MOSFET  M_2 MOSFET  M_3 MOSFET  M_4  V_{out+}  V_{out-} 出力  V_{out}
Hi Lo Lo Lo OFF OFF ON OFF 不定  V_{CC} 不定
Hi Lo Hi Lo OFF OFF OFF OFF 不定 不定 不定
Hi Lo Hi Hi OFF OFF OFF ON 不定  V_{DS} 不定

V1/V2 = Hi/Hi

 M_1 = OFF
 M_2 = ON

入力  V_1 入力  V_2 入力  V_3 入力  V_4 MOSFET  M_1 MOSFET  M_2 MOSFET  M_3 MOSFET  M_4  V_{out+}  V_{out-} 出力  V_{out}
Hi Hi Lo Lo OFF ON ON OFF  V_{DS}  V_{CC} -  V_{DS} - V_{CC} + 2V_{DS}
Hi Hi Hi Lo OFF ON OFF OFF 0 不定 不定
Hi Hi Hi Hi OFF ON OFF ON 0 0 0

応答性確認

V1/V2 = Lo/Lo

import matplotlib.pyplot as plt
import numpy as np

from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 5))
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2, sharex=ax1)
ax3 = fig.add_subplot(3, 1, 3, sharex=ax1)

fname = 'PrimaryCircuit7-071.raw'
LTR = RawRead(fname)
x     = LTR.get_trace('time').get_time_axis(0)

tmp1  = LTR.get_trace('V(vin1)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_1$')
tmp1  = LTR.get_trace('V(vin2)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_2$')
tmp1  = LTR.get_trace('V(vin3)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_3$')
tmp1  = LTR.get_trace('V(vin4)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_4$')

tmp1  = LTR.get_trace('V(vout+)').get_wave(0)
ax2.plot(x * 1000, tmp1, label='Vout+')
tmp2  = LTR.get_trace('V(vout-)').get_wave(0)
ax2.plot(x * 1000, tmp2, label='Vout-')
ax2.plot(x * 1000, tmp1 - tmp2, label='Vout')

tmp1  = LTR.get_trace('I(Rl)').get_wave(0)
ax3.plot(x * 1000, tmp1 * -1000, label='I$_{RL}$')

ax1.legend(); ax1.grid()
ax1.set_xlabel('[ms]'); ax1.set_ylabel('[V]')

ax2.legend(); ax2.grid()
ax2.set_xlabel('[ms]'); ax2.set_ylabel('[V]')

ax3.legend(); ax3.grid()
ax3.set_xlabel('[ms]'); ax3.set_ylabel('[mA]')

fig.tight_layout()

fig.savefig('PrimaryCircuit7-071_Graph1.png')

V1/V2 = Hi/Lo

Vin1の固定電圧を変更する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit7-071'
fname_tmp = '_Vin1Hi_Vin2Lo'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('V1')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('0 0', '5 0')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
V1 Vin1 5 0
True
fig = plt.figure(figsize=(6, 5))
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2, sharex=ax1)
ax3 = fig.add_subplot(3, 1, 3, sharex=ax1)

LTR = RawRead(fname + fname_tmp + '.raw')
x     = LTR.get_trace('time').get_time_axis(0)

tmp1  = LTR.get_trace('V(vin1)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_1$')
tmp1  = LTR.get_trace('V(vin2)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_2$')
tmp1  = LTR.get_trace('V(vin3)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_3$')
tmp1  = LTR.get_trace('V(vin4)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_4$')

tmp1  = LTR.get_trace('V(vout+)').get_wave(0)
ax2.plot(x * 1000, tmp1, label='Vout+')
tmp2  = LTR.get_trace('V(vout-)').get_wave(0)
ax2.plot(x * 1000, tmp2, label='Vout-')
ax2.plot(x * 1000, tmp1 - tmp2, label='Vout')

tmp1  = LTR.get_trace('I(Rl)').get_wave(0)
ax3.plot(x * 1000, tmp1 * -1000, label='I$_{RL}$')

ax1.legend(); ax1.grid()
ax1.set_xlabel('[ms]'); ax1.set_ylabel('[V]')

ax2.legend(); ax2.grid()
ax2.set_xlabel('[ms]'); ax2.set_ylabel('[V]')

ax3.legend(); ax3.grid()
ax3.set_xlabel('[ms]'); ax3.set_ylabel('[mA]')

fig.tight_layout()

fig.savefig('PrimaryCircuit7-071_Graph2.png')

V1/V2 = Hi/Hi

同様にVin1/Vin2の固定電圧を変更する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit7-071'
fname_tmp = '_Vin1Hi_Vin2Hi'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('V1')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('0 0', '5 0')
print(LTC.netlist[line_no], end='')  # 確認

line_no = LTC._get_line_starting_with('V2')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('0 0', '5 0')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
V1 Vin1 5 0
V2 Vin2 5 0
True
fig = plt.figure(figsize=(6, 5))
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2, sharex=ax1)
ax3 = fig.add_subplot(3, 1, 3, sharex=ax1)

LTR = RawRead(fname + fname_tmp + '.raw')
x     = LTR.get_trace('time').get_time_axis(0)

tmp1  = LTR.get_trace('V(vin1)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_1$')
tmp1  = LTR.get_trace('V(vin2)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_2$')
tmp1  = LTR.get_trace('V(vin3)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_3$')
tmp1  = LTR.get_trace('V(vin4)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_4$')

tmp1  = LTR.get_trace('V(vout+)').get_wave(0)
ax2.plot(x * 1000, tmp1, label='Vout+')
tmp2  = LTR.get_trace('V(vout-)').get_wave(0)
ax2.plot(x * 1000, tmp2, label='Vout-')
ax2.plot(x * 1000, tmp1 - tmp2, label='Vout')

tmp1  = LTR.get_trace('I(Rl)').get_wave(0)
ax3.plot(x * 1000, tmp1 * -1000, label='I$_{RL}$')

ax1.legend(); ax1.grid()
ax1.set_xlabel('[ms]'); ax1.set_ylabel('[V]')

ax2.legend(); ax2.grid()
ax2.set_xlabel('[ms]'); ax2.set_ylabel('[V]')

ax3.legend(); ax3.grid()
ax3.set_xlabel('[ms]'); ax3.set_ylabel('[mA]')

fig.tight_layout()

fig.savefig('PrimaryCircuit7-071_Graph3.png')

仕様通りに駆動している
基本的に、ドライバICなどを利用して、下記の4通りで使用する

入力  V_1 入力  V_2 入力  V_3 入力  V_4 MOSFET  M_1 MOSFET  M_2 MOSFET  M_3 MOSFET  M_4  V_{out+}  V_{out-} 出力  V_{out}
Lo Lo Lo Lo ON OFF ON OFF  V_{CC}  V_{CC} 0
Lo Lo Hi Hi ON OFF OFF ON  V_{CC} -  V_{DS}  V_{DS}  V_{CC} - 2V_{DS}
Hi Hi Lo Lo OFF ON ON OFF  V_{DS}  V_{CC} -  V_{DS} - V_{CC} + 2V_{DS}
Hi Hi Hi Hi OFF ON OFF ON 0 0 0

改良された回路

入力を  V_1 ,  V2 と、  V_3 ,  V4 でまとめて入力する

import matplotlib.pyplot as plt
import numpy as np

from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 5))
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2, sharex=ax1)
ax3 = fig.add_subplot(3, 1, 3, sharex=ax1)

fname = 'PrimaryCircuit7-071-2.raw'
LTR = RawRead(fname)
x     = LTR.get_trace('time').get_time_axis(0)

tmp1  = LTR.get_trace('V(vin1-2)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_{1,2}$')
tmp1  = LTR.get_trace('V(vin3-4)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='$Vin_{3,4}$')

tmp1  = LTR.get_trace('V(vout+)').get_wave(0)
ax2.plot(x * 1000, tmp1, label='Vout+')
tmp2  = LTR.get_trace('V(vout-)').get_wave(0)
ax2.plot(x * 1000, tmp2, label='Vout-')
ax2.plot(x * 1000, tmp1 - tmp2, label='Vout')

tmp1  = LTR.get_trace('I(Rl)').get_wave(0)
ax3.plot(x * 1000, tmp1 * -1000, label='I$_{RL}$')

ax1.legend(); ax1.grid()
ax1.set_xlabel('[ms]'); ax1.set_ylabel('[V]')

ax2.legend(); ax2.grid()
ax2.set_xlabel('[ms]'); ax2.set_ylabel('[V]')

ax3.legend(); ax3.grid()
ax3.set_xlabel('[ms]'); ax3.set_ylabel('[mA]')

fig.tight_layout()

fig.savefig('PrimaryCircuit7-071_Graph4.png')

不定状態がなくなり、この入力条件の方が使い勝手が良い

参考文献

この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください