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はプログラムを直接変更しています。