サイトマップ

回路の素101 058 半波整流 反転アンプ型

回路の素101 058 半波整流 反転アンプ型

入力信号の負側を通す
100kHz程度までの低周波で使用する

回路図作成

  • 基本的な構成

オペアンプでの反転増幅と、ダイオードを使用して、入力信号を反転しつつ、負側のみ抽出する

応答性確認

シミュレーションを tranモード(デフォルト) で実行し、応答を見る

import matplotlib.pyplot as plt
import numpy as np

from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 3))
ax1 = fig.add_subplot(1, 1, 1)

fname = 'PrimaryCircuit6-058.raw'
LTR = RawRead(fname)
x     = LTR.get_trace('time').get_time_axis(0)

tmp1  = LTR.get_trace('V(vin+)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vin+')
tmp1  = LTR.get_trace('V(vout)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vout')

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

fig.tight_layout()

fig.savefig('PrimaryCircuit6-058_Graph1.png')

負側が反転して出力されている

高周波の場合

入力信号の周波数を1kHzから50kHzに変更する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit6-058'
fname_tmp = '_50kHz'
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('1k', '50k')
print(LTC.netlist[line_no], end='')  # 確認

line_no = LTC._get_line_starting_with('.tran')
sim_cmd = LTC.netlist[line_no]
sim_cmd = sim_cmd.replace('5m', '0.1m')
LTC.netlist[line_no] = sim_cmd.replace('0.1u', '5n')
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 Vin+ 0 SINE(0 0.5 50k)
.tran 0 0.1m 0 5n
True
from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 3))
ax1 = fig.add_subplot(1, 1, 1)

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

tmp1  = LTR.get_trace('V(vin+)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vin+')
tmp1  = LTR.get_trace('V(vout)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vout')

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

fig.tight_layout()

fig.savefig('PrimaryCircuit6-058_Graph2.png')

周波数が高くなると、ひずみが発生する

ダイオードを反転する

2つのダイオードを反転すると、正側を反転して通すようになる

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit6-058'
fname_tmp = '_reverse'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('D1')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('N001 N002', 'N002 N001')
print(LTC.netlist[line_no], end='')  # 確認

line_no = LTC._get_line_starting_with('D2')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('N002 Vout', 'Vout N002')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
D1 N002 N001 1SS133
D2 Vout N002 1SS133
True
from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 3))
ax1 = fig.add_subplot(1, 1, 1)

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

tmp1  = LTR.get_trace('V(vin+)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vin+')
tmp1  = LTR.get_trace('V(vout)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vout')

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

fig.tight_layout()

fig.savefig('PrimaryCircuit6-058_Graph3.png')

正側の信号が反転して抽出されている

高周波の場合

入力信号の周波数を1kHzから50kHzに変更する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit6-058'
fname_tmp = '_reverse_50kHz'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('D1')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('N001 N002', 'N002 N001')
print(LTC.netlist[line_no], end='')  # 確認

line_no = LTC._get_line_starting_with('D2')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('N002 Vout', 'Vout N002')
print(LTC.netlist[line_no], end='')  # 確認

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

line_no = LTC._get_line_starting_with('.tran')
sim_cmd = LTC.netlist[line_no]
sim_cmd = sim_cmd.replace('5m', '0.1m')
LTC.netlist[line_no] = sim_cmd.replace('0.1u', '5n')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
D1 N002 N001 1SS133
D2 Vout N002 1SS133
V1 Vin+ 0 SINE(0 0.5 50k)
.tran 0 0.1m 0 5n
True
from PyLTSpice import RawRead

fig = plt.figure(figsize=(6, 3))
ax1 = fig.add_subplot(1, 1, 1)

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

tmp1  = LTR.get_trace('V(vin+)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vin+')
tmp1  = LTR.get_trace('V(vout)').get_wave(0)
ax1.plot(x * 1000, tmp1, label='Vout')

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

fig.tight_layout()

fig.savefig('PrimaryCircuit6-058_Graph4.png')

周波数が高くなると、ひずみが発生する

参考文献

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