回路の素101 010 アンプ: インスツルメンテーション・アンプ 3アンプ型
2アンプ型よりも、さらに同相ノイズの除去能力が高い
回路図作成
- 基本的な構成
ゲインは
ただし とする
(R6のGNDをVRにするとオフセットの印加も可能)
応答性確認
シミュレーションを 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-010.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-010_Graph1.png')
同相のノイズが消えて、差動信号が10倍になっている
周波数特性
Vin+に対する周波数特性を取得する
from PyLTSpice import SimCommander fname = 'PrimaryCircuit1-010' LTC = SimCommander(fname + '.asc')
!more +1 PrimaryCircuit1-010.net
Vp +Vcc 0 5 RLoad Vout 0 10k Vm -Vcc 0 -5 XU1 Vin- N003 +Vcc -Vcc N001 AD8676 V1 Vin+ Vnoise SINE(0 0.1 1k) AC 1 V2 Vin- Vnoise SINE(0 0.1 1k 0 0 180) XU2 Vin+ N005 +Vcc -Vcc N006 AD8676 V3 Vnoise 0 SINE(0 0.1 20k) XU3 N004 N002 +Vcc -Vcc Vout AD8676 R1 N001 N003 10k R2 N006 N005 10k R3 N002 N001 10k R4 Vout N002 10k R5 N004 N006 10k R6 0 N004 10k RG N005 N003 2.2k .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-010' 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-010' 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-010_Graph2.png')
オペアンプの性能で特性は決まるが、今回の場合1MHzほどがカットオフ周波数になっている
ノイズ除去性能
同相信号に対する周波数特性を取得する
Vin+(V1) に AC 1
の設定を削除して、V3(Vnoise) に追加する
from PyLTSpice import SimCommander fname = 'PrimaryCircuit1-010' 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': 5} {'designator': 'V3', 'nodes': ' Vnoise 0', 'value': 'SINE(0 0.1 20k) AC 1', 'line': 8} .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-010' 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-010_Graph3.png')
2アンプ型より1MHz以上の除去性能が良さそう
参考文献
この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください