サイトマップ

回路の素101 009 アンプ: インスツルメンテーション・アンプ 2アンプ型

回路の素101 009 アンプ: インスツルメンテーション・アンプ 2アンプ型

差動アンプよりも同相ノイズの除去能力が高い

回路図作成

  • 基本的な構成

ゲインは  A_v = 1 + \frac{R_4}{R_3}
ただし  \frac{R_4}{R_3} =\frac{R_1}{R_2} とする

応答性確認

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

設定としては下記

  • 差動信号として、0.1V/1kHz を入力
  • 同相信号として、0.1V/20kHz を入力
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-009.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(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-009_Graph1.png')

同相のノイズが消えて、差動信号が10倍になっている

周波数特性

Vin+に対する周波数特性を取得する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-009'
LTC = SimCommander(fname + '.asc')
!more +1 PrimaryCircuit1-009.net
Vp +Vcc 0 5
RLoad Vout 0 10k
Vm -Vcc 0 -5
XU1 Vin- N001 +Vcc -Vcc N002 AD8676
R1 0 N001 10k
R2 N002 N001 1.1k
R3 N003 N002 1.1k
V1 Vin+ Vnoise SINE(0 0.1 1k) AC 1
V2 Vin- Vnoise SINE(0 0.1 1k 0 0 180)
XU2 Vin+ N003 +Vcc -Vcc Vout AD8676
R4 Vout N003 10k
V3 Vnoise 0 SINE(0 0.1 20k)
.tran 0 5m 0 0.1u
;ac oct 40 1 10Meg
.lib AD8676.lib
.backanno
.end

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

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-009'
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 1 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-009'
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(15, 22)

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

fig.tight_layout()

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

オペアンプの性能で特性は決まるが、今回の場合1MHzほどがカットオフ周波数になっている

ノイズ除去性能

同相信号に対する周波数特性を取得する

Vin+(V1) に AC 1の設定を削除して、V3(Vnoise) に追加する

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-009'
fname_tmp = '_ac2'
LTC = SimCommander(fname + '.asc')

line_no = LTC.get_component_info('V1')['line']
LTC.netlist[line_no] = 'V1 Vin+ Vnoise SINE(0 0.1 1k)\n'
print(LTC.get_component_info('V1'))  # 確認

line_no = LTC.get_component_info('V3')['line']
LTC.netlist[line_no] = 'V3 Vnoise 0 SINE(0 0.1 20k) AC 1\n'
print(LTC.get_component_info('V3'))  # 確認

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()
{'designator': 'V1', 'nodes': ' Vin+ Vnoise', 'value': 'SINE(0 0.1 1k)', 'line': 8}
{'designator': 'V3', 'nodes': ' Vnoise 0', 'value': 'SINE(0 0.1 20k) AC 1', 'line': 12}
.ac oct 40 1 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-009'
fname_tmp = '_ac2'
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')

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

fig.tight_layout()

fig.savefig('PrimaryCircuit1-009_Graph3.png')

1MHz以下のノイズは除去できる

ノイズ除去性能の悪化について

R1/R2の比と、R4/R3の比に差が出ると、ノイズ除去性能が悪化する
試しに、R3の値を、5%ほど変化させたときに、同相信号への周波数特性がどう変化するか見てみる

from PyLTSpice import SimCommander

fname = 'PrimaryCircuit1-009'
fname_tmp = '_ac3'
LTC = SimCommander(fname + '.asc')

line_no = LTC.get_component_info('V1')['line']
LTC.netlist[line_no] = 'V1 Vin+ Vnoise SINE(0 0.1 1k)\n'
print(LTC.get_component_info('V1'))  # 確認

line_no = LTC.get_component_info('V3')['line']
LTC.netlist[line_no] = 'V3 Vnoise 0 SINE(0 0.1 20k) AC 1\n'
print(LTC.get_component_info('V3'))  # 確認

line_no = LTC.get_component_info('R3')['line']
LTC.netlist[line_no] = 'R3 N003 N002 1.05k\n'
print(LTC.get_component_info('R3'))  # 確認

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()
{'designator': 'V1', 'nodes': ' Vin+ Vnoise', 'value': 'SINE(0 0.1 1k)', 'line': 8}
{'designator': 'V3', 'nodes': ' Vnoise 0', 'value': 'SINE(0 0.1 20k) AC 1', 'line': 12}
{'designator': 'R3', 'nodes': ' N003 N002', 'model': None, 'value': '1.05k', 'line': 7}
.ac oct 40 1 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-009'
fname_tmp = '_ac3'
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')

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

fig.tight_layout()

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

10kHz以下のゲインが-25dB程度で張り付き、性能が悪化している

参考文献

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