IoTで使うPython入門 Step5-Python3 VISA⑦DMM Keithley 2000 +電源E3631A トランジスタ2SC1815
トランジスタ1石を使う回路の中で、エミッタ接地が最も一般的です。静特性を測ります。
ベース電流用の電源とコレクタの電源用は、3出力をもつKeysightのE3631Aを使います。電流と電圧を同時に測定するために、DMMは4台必要です。SCPI言語が使えるといっても、同じ会社のDMMが使えるに越したことはありませんが、手持ちの関係で、三つの会社の製品を使います。いずれも1/2 6桁のDMMです。
- Keithley(テクトロニクス)の2000を2台。GPIB-USB経由
- Keysightの34461Aを1台。USB経由
- 岩通のVOAC7602を1台。USBケーブル、COMポート経由
●接続の確認
上記の機器以外に電源HP6632Aもつないでいます。この機材はSCPIではなくHP-IB言語です。プログラミングには、visaライブラリを使います。機器のアドレスは、KeysightのIOライブラリ・スイート(Keysight Connection Expert 2020)を使って見つけ、接続を確認しました。
import pyvisa Keithley2000_1_Addr = "GPIB0::6" Keithley2000_2_Addr = "GPIB0::18" AgilentE3631A_Addr = "GPIB1::10" Keysight34461A_Addr = "USB0::0x2A8D::0x1301::MY53216054::0::INSTR" IwatsuVOAC7602_Addr = "ASRL5::INSTR" HP6632A_Addr = "GPIB1::11" r = pyvisa.ResourceManager() keithley2000_1 = r.open_resource(Keithley2000_1_Addr) keithley2000_2 = r.open_resource(Keithley2000_2_Addr) agilentE3631A = r.open_resource(AgilentE3631A_Addr) keysight34461A = r.open_resource(Keysight34461A_Addr) iwatsuVOAC7602 = r.open_resource(IwatsuVOAC7602_Addr) HP6632A = r.open_resource(HP6632A_Addr) keithley2000_1.write('*IDN?') keithley2000_2.write('*IDN?') agilentE3631A.write('*IDN?') keysight34461A.write('*IDN?') iwatsuVOAC7602.write('*IDN?') HP6632A.write('ID?') print(keithley2000_1.read()) print(keithley2000_2.read()) print(agilentE3631A.read()) print(keysight34461A.read()) print(iwatsuVOAC7602.read()) print(HP6632A.read())
実行すると、型番を返してきました。
●ベース電流-コレクタ電流
DUTのトランジスタは、小信号用の2SC1815(UTC)です。
keithley2000、keysight34461Aともに電流測定の指定でエラーが出ます。
iwatsuVOAC7602は、READ?でレスポンスが返りません。マニュアルに、INITとFETCh?の発行と同じと書かれていますが、この二つのコマンドを実行すると、データを読みました。
測定中、コレクタには10Vを配給しています。ベースの電圧Vbbを変化させ、結果、ベース電流を可変しました。
import visa from time import sleep import matplotlib.pyplot as plt Keithley2000_6_Addr = "GPIB0::6" Keithley2000_18_Addr = "GPIB0::18" AgilentE3631A_Addr = "GPIB1::10" Keysight34461A_Addr = "USB0::0x2A8D::0x1301::MY53216054::0::INSTR" IwatsuVOAC7602_Addr = "ASRL5::INSTR" dataIc =[] dataVc =[] dataVb =[] dataIb =[] r = visa.ResourceManager() Ic_keithley2000_6 = r.open_resource(Keithley2000_6_Addr) Vc_keithley2000_18 = r.open_resource(Keithley2000_18_Addr) Ib_keysight34461A = r.open_resource(Keysight34461A_Addr) Vb_iwatsuVOAC7602 = r.open_resource(IwatsuVOAC7602_Addr) Ic_keithley2000_6.write("*RST;*CLS") Vc_keithley2000_18.write("*RST;*CLS") Ic_keithley2000_6.write(":CONF:CURR; DC:RANG AUTO") Vc_keithley2000_18.write(":CONF:VOLT:DC:RANG 10") sleep(1) Ib_keysight34461A.write("*RST;*CLS") Vb_iwatsuVOAC7602.write("*RST;*CLS") Ib_keysight34461A.write(":CONF:CURR; DC:RANG AUTO") Vb_iwatsuVOAC7602.write(":CONF:VOLT:DC:RANG AUTO") Vb_iwatsuVOAC7602.write("INIT") sleep(1) print('--start--') agilentE3631A = r.open_resource(AgilentE3631A_Addr) agilentE3631A.write(":INST:SEL P6V") agilentE3631A.write(":TRIG:SOUR IMM") agilentE3631A.write(":VOLTage:TRIG 1.1") # Vb agilentE3631A.write(":CURR:TRIG 0.1") agilentE3631A.write(":OUTPut ON") agilentE3631A.write("INIT") sleep(1) agilentE3631A.write(":INST:SEL P25V") agilentE3631A.write(":TRIG:SOUR IMM") agilentE3631A.write(":VOLTage:TRIG 10.0") # Vc agilentE3631A.write(":CURR:TRIG 0.1") agilentE3631A.write(":OUTPut ON") agilentE3631A.write("INIT") sleep(1) for baseVolt in range(1,10): agilentE3631A.write(":INST:SEL P6V") agilentE3631A.write(":VOLTage:TRIG " + str(2 + float(2*baseVolt/10.0))) # Vb agilentE3631A.write(":CURR:TRIG 0.1") agilentE3631A.write("INIT") #print('base V', (1 + float(baseVolt/10.0)) ) sleep(0.3) Ic = Ic_keithley2000_6.query(":READ?") dataIc.append(Ic) Vc = Vc_keithley2000_18.query(":READ?") dataVc.append(Vc) Ib = Ib_keysight34461A.query(":READ?") dataIb.append(Ib) Vb_iwatsuVOAC7602.write("INIT") Vb = Vb_iwatsuVOAC7602.query(":FETCh?") dataVb.append(Vb) #atoshimatsu agilentE3631A.write("CURRent:TRIG 0") agilentE3631A.write("VOLTage:TRIG 0") agilentE3631A.write("INIT") sleep(2) print('--done--') agilentE3631A.write(":OUTPut OFF") Ic_keithley2000_6.write(":READ?") Vc_keithley2000_18.write(":READ?") Ib_keysight34461A.write(":READ?") Vb_iwatsuVOAC7602.write(":READ?") dataVoltageC = [float(f) for f in dataVc] dataCurrentC = [float(f)*1000 for f in dataIc] dataVoltageB = [float(f) for f in dataVb] dataCurrentB = [float(f)*1000000 for f in dataIb] print('\n', dataVoltageC, "V Vc") print(dataCurrentC, "mA Ic") print(dataVoltageB, "V Vb") print(dataCurrentB, "uA Ib") plt.plot(dataCurrentB, dataCurrentC, marker="v") plt.xlabel("Base Current [uA]") plt.ylabel("Corrector Current [mA]") plt.show()
実行結果です。
●コレクタ電圧-コレクタ電流
DUTのトランジスタは、小信号用の2SC1815(UTC)です。コレクタ電圧を変化させ、コレクタ電流との関連をグラフにします。
import visa from time import sleep import matplotlib.pyplot as plt Keithley2000_6_Addr = "GPIB0::6" Keithley2000_18_Addr = "GPIB0::18" AgilentE3631A_Addr = "GPIB1::10" Keysight34461A_Addr = "USB0::0x2A8D::0x1301::MY53216054::0::INSTR" IwatsuVOAC7602_Addr = "ASRL5::INSTR" dataIc =[] dataVc =[] dataVb =[] dataIb =[] r = visa.ResourceManager() Ic_keithley2000_6 = r.open_resource(Keithley2000_6_Addr) Vc_keithley2000_18 = r.open_resource(Keithley2000_18_Addr) Ib_keysight34461A = r.open_resource(Keysight34461A_Addr) Vb_iwatsuVOAC7602 = r.open_resource(IwatsuVOAC7602_Addr) Ic_keithley2000_6.write("*RST;*CLS") Vc_keithley2000_18.write("*RST;*CLS") Ic_keithley2000_6.write(":CONF:CURR; DC:RANG AUTO") Vc_keithley2000_18.write(":CONF:VOLT:DC:RANG 10") sleep(1) Ib_keysight34461A.write("*RST;*CLS") Vb_iwatsuVOAC7602.write("*RST;*CLS") Ib_keysight34461A.write(":CONF:CURR; DC:RANG AUTO") Vb_iwatsuVOAC7602.write(":CONF:VOLT:DC:RANG AUTO") Vb_iwatsuVOAC7602.write("INIT") sleep(1) print('--start--') agilentE3631A = r.open_resource(AgilentE3631A_Addr) agilentE3631A.write(":INST:SEL P6V") agilentE3631A.write(":TRIG:SOUR IMM") agilentE3631A.write(":VOLTage:TRIG 2.5") # Vb agilentE3631A.write(":CURR:TRIG 0.5") agilentE3631A.write(":OUTPut ON") agilentE3631A.write("INIT") sleep(1) agilentE3631A.write(":INST:SEL P25V") agilentE3631A.write(":TRIG:SOUR IMM") agilentE3631A.write(":VOLTage:TRIG 0.0") # Vc agilentE3631A.write(":CURR:TRIG 0.1") agilentE3631A.write(":OUTPut ON") agilentE3631A.write("INIT") sleep(2) for CorrectorVolt in range(0,25): agilentE3631A.write(":INST:SEL P25V") agilentE3631A.write(":VOLTage:TRIG " + str((float(CorrectorVolt)+0.1)/10.0)) # Vc agilentE3631A.write(":CURR:TRIG 0.2") agilentE3631A.write("INIT") print('Corrector V', (float(CorrectorVolt/10.0)) ) sleep(0.5) Ic = Ic_keithley2000_6.query(":READ?") dataIc.append(Ic) Vc = Vc_keithley2000_18.query(":READ?") dataVc.append(Vc) Ib = Ib_keysight34461A.query(":READ?") dataIb.append(Ib) Vb_iwatsuVOAC7602.write("INIT") Vb = Vb_iwatsuVOAC7602.query(":FETCh?") ## dataVb.append(Vb) #atoshimatsu agilentE3631A.write("CURRent:TRIG 0") agilentE3631A.write("VOLTage:TRIG 0") agilentE3631A.write("INIT") sleep(2) print('--done--') agilentE3631A.write(":OUTPut OFF") Ic_keithley2000_6.write(":READ?") Vc_keithley2000_18.write(":READ?") Ib_keysight34461A.write(":READ?") Vb_iwatsuVOAC7602.write(":FETCh?") dataVoltageC = [float(f) for f in dataVc] dataCurrentC = [float(f)*1000 for f in dataIc] dataVoltageB = [float(f) for f in dataVb] dataCurrentB = [float(f)*1000000 for f in dataIb] print('\n', dataVoltageC, "V Vc") print(dataCurrentC, "mA Ic") print(dataVoltageB, "V Vb") print(dataCurrentB, "uA Ib") plt.plot(dataVoltageC, dataCurrentC, marker="v") plt.xlabel("Corrector Voltage [V]") plt.ylabel("Corrector Current [mA]") plt.show()
ベース電流が約18uA時の実行結果です。ベース電流は、ベース側の電源Vbbの電圧を変更すると、変わります。
ベース電流が約9uAと少ないときの実行結果です。コレクタ電流は減少します。
ベース電流が約29uA時の実行結果です。Vbbはプログラムを直接変更しています。