回路の素101 040 電圧-電流変換 反転アンプ型
接地した負荷に対して、電流をドライブできる
回路図作成
- 基本的な構成
出力電流 は下記になる
ただし、 が必要
今回の回路の場合は、1V -> 1mA に変換される
応答性確認
シミュレーションを tranモード(デフォルト) で実行し、応答を見る
import matplotlib.pyplot as plt import numpy as np from PyLTSpice import RawRead fname = 'PrimaryCircuit4-040.raw' LTR = RawRead(fname) fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) 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('I(Rload)').get_wave(0) ax2.plot(x * 1000, tmp1 * 1000, label='Iout') ax1.legend(); ax1.grid() ax1.set_xlabel('[ms]'); ax1.set_ylabel('[V]') ax2.legend(); ax2.grid() ax2.set_xlabel('[ms]'); ax2.set_ylabel('[mA]') fig.tight_layout() fig.savefig('PrimaryCircuit4-040_Graph1.png')
Ioutは、振幅1mAで出力されている
負荷の抵抗値を変えた場合
負荷の抵抗値を100Ωから1kΩに変更した場合の、供給される電圧/電流を確認する
from PyLTSpice import SimCommander fname = 'PrimaryCircuit4-040' fname_tmp = '_R1k' LTC = SimCommander(fname + '.asc') line_no = LTC._get_line_starting_with('RLoad') sim_cmd = LTC.netlist[line_no] LTC.netlist[line_no] = sim_cmd.replace('100', '1k') print(LTC.netlist[line_no], end='') # 確認 # 編集したnetlistの情報でバッチ処理を実行する run_net_file = fname + fname_tmp + '.net' LTC.run(run_filename=run_net_file) LTC.wait_completion()
RLoad Vout 0 1k
True
from PyLTSpice import RawRead fnames = [ ['PrimaryCircuit4-040.raw', '100'], ['PrimaryCircuit4-040_R1k.raw', '1k'], ] fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) for fname, name in fnames: LTR = RawRead(fname) x = LTR.get_trace('time').get_time_axis(0) tmp1 = LTR.get_trace('V(vout)').get_wave(0) ax1.plot(x * 1000, tmp1, label=name) tmp1 = LTR.get_trace('I(Rload)').get_wave(0) ax2.plot(x * 1000, tmp1 * 1000, label=name) ax1.legend(); ax1.grid() ax1.set_xlabel('[ms]'); ax1.set_ylabel('Vout[V]') ax2.legend(); ax2.grid() ax2.set_xlabel('[ms]'); ax2.set_ylabel('Iout[mA]') fig.tight_layout() fig.savefig('PrimaryCircuit4-040_Graph2.png')
負荷の抵抗値が変わっても、供給電圧が変わって、電流値は同じになる
改良した回路
基本の回路では、R4にも電流が流れるため、出力電流が少し小さくなってしまう(特に負荷の抵抗値が大きいとき)
出力側にボルテージフォロワを設けることで、R4に流れる電流を別途供給することができる
入力電圧を10mV(出力電流を10uA)にして、負荷抵抗を100kΩにしている
基本回路で同じ条件のときと比較する
from PyLTSpice import SimCommander fname = 'PrimaryCircuit4-040' fname_tmp = '_R100k' LTC = SimCommander(fname + '.asc') line_no = LTC._get_line_starting_with('RLoad') sim_cmd = LTC.netlist[line_no] LTC.netlist[line_no] = sim_cmd.replace('100', '100k') 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('SINE(0 1 1k)', 'SINE(0 0.01 1k)') print(LTC.netlist[line_no], end='') # 確認 # 編集したnetlistの情報でバッチ処理を実行する run_net_file = fname + fname_tmp + '.net' LTC.run(run_filename=run_net_file) LTC.wait_completion()
RLoad Vout 0 100k V1 Vin+ 0 SINE(0 0.01 1k) AC 1
True
from PyLTSpice import RawRead fnames = [ ['PrimaryCircuit4-040_R100k.raw', 'basic'], ['PrimaryCircuit4-040-2.raw', 'improve'], ] fig = plt.figure(figsize=(6, 3)) ax1 = fig.add_subplot(1, 1, 1) for fname, name in fnames: LTR = RawRead(fname) x = LTR.get_trace('time').get_time_axis(0) tmp1 = LTR.get_trace('I(Rload)').get_wave(0) ax1.plot(x * 1000, tmp1 * 1e6, label=name) ax1.legend(); ax1.grid() ax1.set_xlabel('[ms]'); ax1.set_ylabel('Iout[uA]') fig.tight_layout() fig.savefig('PrimaryCircuit4-040_Graph3.png')
R4が100kΩに対して、負荷も100kΩだと、R4側の電流が無視できなくなり、
10uA指令に対して、7uA程度になってしまうが、
改良した回路だと、指令通りに出力できている
参考文献
この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください