サイトマップ

回路の素101 012 反転アンプ単電源用 バイポーラ・トランジスタ使用

回路の素101 012 反転アンプ単電源用 バイポーラ・トランジスタ使用

オペアンプより高い周波数の出力が可能

回路図作成

  • 基本的な構成

電圧ゲイン  A_v トランジスタの特性で決まる
 h_{fe} : トランジスタの電流増幅率
 h_{ie} : トランジスタの入力インピーダンス

 A_v \fallingdotseq \frac{-h_{fe} R_c}{h_{ie}}

入力のハイパスフィルタのカットオフ周波数は下記になる
 f_c = \frac{1}{2 \pi C_1 R},  R = \frac{h_{ie} R_B / A_v}{h_{ie} + R_B / A_v}

応答性確認

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

import matplotlib.pyplot as plt
import numpy as np

from PyLTSpice import RawRead

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

fname = 'PrimaryCircuit1-012.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)
ax2.plot(x * 1000, tmp1, label='Vout')

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

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

fig.tight_layout()

fig.savefig('PrimaryCircuit1-012_Graph1.png')

ゲインは、5mVが、350mVほどになっていて、70倍ほど

周波数特性

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-012'
LTC = SimCommander(fname + '.asc')
!more +1 PrimaryCircuit1-012.net
Vp +Vcc 0 5
RLoad Vout 0 10k
V1 Vin+ 0 SINE(0 0.01 1k) AC 1
RB N001 N002 390k
RC N002 +Vcc 4.7k
C1 N001 Vin+ 1u
C2 Vout N002 10u
XU2 N002 N001 0 2SC2712
.tran 0 5m 0 0.1u
;ac oct 40 10 10Meg
.lib 2SC2712.mod
.backanno
.end

Vin+(V1) に AC 1の設定がついているので、シミュレーションモードをacにすれば良い

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-012'
fname_tmp = '_ac'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('.tran')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('.tran', ';tran')
line_no = LTC._get_line_starting_with(';ac')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace(';ac', '.ac')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
.ac oct 40 10 10Meg
True
from PyLTSpice import RawRead

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

fname = 'PrimaryCircuit1-012'
fname_tmp = '_ac'
LTR = RawRead(fname + fname_tmp + '.raw')

freq  = np.abs(LTR.get_trace('frequency').get_wave(0))
Vout  = LTR.get_trace("V(vout)").get_wave(0)
ax1.plot(freq, 20*np.log10(np.abs(Vout)))
ax2.plot(freq, np.angle(Vout) / np.pi * 180)

ax1.grid()
ax1.set_xlabel("[Hz]"); ax1.set_ylabel("Gain[dB]")
ax1.set_xscale('log')
ax1.set_ylim(30, 40)

ax2.grid()
ax2.set_xlabel("[Hz]"); ax2.set_ylabel("Phase[deg]")
ax2.set_xscale('log')

fig.tight_layout()

fig.savefig('PrimaryCircuit1-012_Graph2.png')

低域側は、60Hzほどがカットオフ周波数になっている
高域側は、トランジスタの性能で決まり、今回の場合10MHzほどになっている

改良された回路

トランジスタのばらつきによる回路性能の差を減らす

この回路では、ゲインが下記のようになる

 A_v \fallingdotseq \frac{-h_{fe} R_c}{h_{ie} + (1 + h_{fe}) R_E} \fallingdotseq \frac{-R_c}{R_E}

今回の場合だと、3kΩ / 1kΩ で、約3倍になる

動作確認

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 = 'PrimaryCircuit1-012-2.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('PrimaryCircuit1-012_Graph3.png')

150mVが330mVほどになり、Av=-2.2 となり、ある程度ゲインを操作できている

周波数特性

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-012-2'
fname_tmp = '_ac'
LTC = SimCommander(fname + '.asc')

line_no = LTC._get_line_starting_with('.tran')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace('.tran', ';tran')
line_no = LTC._get_line_starting_with(';ac')
sim_cmd = LTC.netlist[line_no]
LTC.netlist[line_no] = sim_cmd.replace(';ac', '.ac')
print(LTC.netlist[line_no], end='')  # 確認

# 編集したnetlistの情報でバッチ処理を実行する
run_net_file = fname + fname_tmp + '.net'
LTC.run(run_filename=run_net_file)
LTC.wait_completion()
.ac oct 40 10 10Meg
True
from PyLTSpice import RawRead

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

fname = 'PrimaryCircuit1-012-2'
fname_tmp = '_ac'
LTR = RawRead(fname + fname_tmp + '.raw')

freq  = np.abs(LTR.get_trace('frequency').get_wave(0))
Vout  = LTR.get_trace("V(vout)").get_wave(0)
ax1.plot(freq, 20*np.log10(np.abs(Vout)))
ax2.plot(freq, np.angle(Vout) / np.pi * 180)

ax1.grid()
ax1.set_xlabel("[Hz]"); ax1.set_ylabel("Gain[dB]")
ax1.set_xscale('log')
ax1.set_ylim(-5, 10)

ax2.grid()
ax2.set_xlabel("[Hz]"); ax2.set_ylabel("Phase[deg]")
ax2.set_xscale('log')

fig.tight_layout()

fig.savefig('PrimaryCircuit1-012_Graph4.png')

入力のハイパスフィルタのカットオフ周波数は、
 f_c = \frac{1}{2 \pi C_1 R},  R = \frac{R_1 R_2}{R_1 + R_2}
この回路の場合、18.5Hzほどになり、
シミュレーションでもそれぐらいになっている

参考文献

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