回路の素101 071 フル・ブリッジ MOSFET使用
負荷を正負両方向で駆動することができる
単電源で動作することができる
トランジスタよりスイッチング動作が速い
回路図作成
- 基本的な構成
動作仕様
3条件に分ける
V1/V2 = Lo/Lo
= ON
= OFF
入力 | 入力 | 入力 | 入力 | MOSFET | MOSFET | MOSFET | MOSFET | 出力 | ||
---|---|---|---|---|---|---|---|---|---|---|
Lo | Lo | Lo | Lo | ON | OFF | ON | OFF | 0 | ||
Lo | Lo | Hi | Lo | ON | OFF | OFF | OFF | 不定 | 不定 | |
Lo | Lo | Hi | Hi | ON | OFF | OFF | ON |
V1/V2 = Hi/Lo
= OFF
= OFF
入力 | 入力 | 入力 | 入力 | MOSFET | MOSFET | MOSFET | MOSFET | 出力 | ||
---|---|---|---|---|---|---|---|---|---|---|
Hi | Lo | Lo | Lo | OFF | OFF | ON | OFF | 不定 | 不定 | |
Hi | Lo | Hi | Lo | OFF | OFF | OFF | OFF | 不定 | 不定 | 不定 |
Hi | Lo | Hi | Hi | OFF | OFF | OFF | ON | 不定 | 不定 |
V1/V2 = Hi/Hi
= OFF
= ON
入力 | 入力 | 入力 | 入力 | MOSFET | MOSFET | MOSFET | MOSFET | 出力 | ||
---|---|---|---|---|---|---|---|---|---|---|
Hi | Hi | Lo | Lo | OFF | ON | ON | OFF | - | ||
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通りで使用する
入力 | 入力 | 入力 | 入力 | MOSFET | MOSFET | MOSFET | MOSFET | 出力 | ||
---|---|---|---|---|---|---|---|---|---|---|
Lo | Lo | Lo | Lo | ON | OFF | ON | OFF | 0 | ||
Lo | Lo | Hi | Hi | ON | OFF | OFF | ON | |||
Hi | Hi | Lo | Lo | OFF | ON | ON | OFF | - | ||
Hi | Hi | Hi | Hi | OFF | ON | OFF | ON | 0 | 0 | 0 |
改良された回路
入力を , と、 , でまとめて入力する
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')
不定状態がなくなり、この入力条件の方が使い勝手が良い
参考文献
この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください