IoTで使うPython入門 Step5-Python3 VISA⑤DMM Keithley 2000 +電源E3631A ポリスイッチ

 前回、実験用電源の電圧を変えて、線形素子である抵抗の両端にかかる電圧と電流を測定しました。ここでは、非線形素子をつないでみます。最初は、ポリスイッチです。電流が規定値より流れ過ぎると発熱して抵抗値を急激に増加させ、結果電流を制限するデバイスです。原因を取り除き、温度が下がると、元の低い抵抗値の戻ります。

ポリスイッチ①

 250V/80mA、常温で抵抗値16.1Ωのポリスイッチを測ります。25V/1Aの電源を用い、抵抗と同じ接続で測定します。

 プログラムです。1Vから15Vへ1Vステップで電圧を可変しました。

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"

r = visa.ResourceManager()
agilentE3631A   = r.open_resource(AgilentE3631A_Addr)
keithley2000_6  = r.open_resource(Keithley2000_6_Addr)
keithley2000_18 = r.open_resource(Keithley2000_18_Addr)

dataI = []
dataE = []
agilentE3631A.write("*RST;*CLS")
agilentE3631A.write("INST:SEL P25V")
agilentE3631A.write("TRIG:SOUR IMM")
agilentE3631A.write("OUTPut ON")

keithley2000_6.write("*RST;*CLS")
keithley2000_18.write("*RST;*CLS")
keithley2000_6.write("CONF:CURR; DC:RANG AUTO")
keithley2000_18.write("CONF:VOLT:DC:RANG 10")
sleep(1)

for outVolt in range(1,16):
    agilentE3631A.write("VOLT:TRIG " + str(float(outVolt)+0.06))
    agilentE3631A.write("INIT")
    print(outVolt)
    sleep(0.1)
    dI = keithley2000_6.query(":READ?")
    dataI.append(dI)
    
    dE = keithley2000_18.query(":READ?")
    dataE.append(dE)
    
    print("  E: ", float(dE), "I: ", float(dI) , "R=", float(dE)/float(dI))

dataCurrent = [float(f)*1000 for f in dataI]
dataVoltage = [float(f) for f in dataE]
print(dataCurrent, dataVoltage)
plt.plot(dataVoltage, dataCurrent, label="R 2k")
plt.xlabel("Volt [V]")
plt.ylabel("Current [mA]")
plt.show()

 コマンドプロンプト内で実行した様子です。

 描いたグラフです。流れる電流によって抵抗値が変化します。375mAを超えるあたりで抵抗値が急に増えたので、電流が流れなくなった様子がわかります。

ポリスイッチ②

 0.5Aのポリスイッチを測ります。25V/1Aの電源です。

 プログラムです。電圧のステップを細かくしました。rang()は整数しか使えないので、電源への指示は1/10にした数値を使います。

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"

r = visa.ResourceManager()
agilentE3631A   = r.open_resource(AgilentE3631A_Addr)
keithley2000_6  = r.open_resource(Keithley2000_6_Addr)
keithley2000_18 = r.open_resource(Keithley2000_18_Addr)

dataI = []
dataE = []
agilentE3631A.write("*RST;*CLS")
agilentE3631A.write("INST:SEL P25V")
agilentE3631A.write("TRIG:SOUR IMM")
agilentE3631A.write("OUTPut ON")

keithley2000_6.write("*RST;*CLS")
keithley2000_18.write("*RST;*CLS")
keithley2000_6.write("CONF:CURR; DC:RANG AUTO")
keithley2000_18.write("CONF:VOLT:DC:RANG 10")
sleep(1)


for outVolt in range(1,140):
    agilentE3631A.write("VOLT:TRIG " + str(float(outVolt)/10.0+0.06))
    agilentE3631A.write("INIT")
    print(outVolt)
    sleep(0.1)
    dI = keithley2000_6.query(":READ?")
    dataI.append(dI)
    
    dE = keithley2000_18.query(":READ?")
    dataE.append(dE)
    
    print("  E: ", float(dE), "I: ", float(dI) , "R=", float(dE)/float(dI))

agilentE3631A.write("VOLT:TRIG 0")
agilentE3631A.write("INIT")
sleep(2)
print('--done--')
keithley2000_6.query(":READ?")
keithley2000_18.query(":READ?")
dataCurrent = [float(f)*1000 for f in dataI]
dataVoltage = [float(f) for f in dataE]
#print(dataCurrent, dataVoltage)
plt.plot(dataVoltage, dataCurrent, label="R 2k")
plt.xlabel("Volt [V]")
plt.ylabel("Current [mA]")
plt.show()

 グラフです。

 1A以上流れるようなので、実験用電源の6V/3Aの端子につなぎ変えました。また、電流の流れ方を明確にしたいので、横軸に電流、縦軸を抵抗値にしました。

 プログラムです。電圧は6Vに設定したうえで、電流を変化させます。一通りの実験が終わったら、電圧と電流をゼロに設定しました。

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"

r = visa.ResourceManager()
agilentE3631A   = r.open_resource(AgilentE3631A_Addr)
keithley2000_6  = r.open_resource(Keithley2000_6_Addr)
keithley2000_18 = r.open_resource(Keithley2000_18_Addr)

dataI = []
dataE = []
dataR = []
agilentE3631A.write("*RST;*CLS")
agilentE3631A.write(":INST:SEL P6V")
agilentE3631A.write(":TRIG:SOUR IMM")
agilentE3631A.write(":OUTPut ON")

keithley2000_6.write("*RST;*CLS")
keithley2000_18.write("*RST;*CLS")
keithley2000_6.write(":CONF:CURR; DC:RANG AUTO")
keithley2000_18.write(":CONF:VOLT:DC:RANG 10")
sleep(1)

for outCurrent in range(1,25):
    agilentE3631A.write(":VOLTage:TRIG 6")
    agilentE3631A.write(":CURRent:TRIG " + str(float(outCurrent)/10.0))
    agilentE3631A.write("INIT")
    print(outCurrent)
    sleep(0.5)
    dI = keithley2000_6.query(":READ?")
    dataI.append(dI)
    
    dE = keithley2000_18.query(":READ?")
    dataE.append(dE)
    dataR.append(float(dE)/float(dI))
    
    print("  E: ", float(dE), "V  I: ", float(dI)*1000.0 , "mA  R=", float(dE)/float(dI))

agilentE3631A.write("CURRent:TRIG 0")
agilentE3631A.write("VOLTage:TRIG 0")
agilentE3631A.write("INIT")
sleep(2)
print('--done--')
keithley2000_6.query(":READ?")
keithley2000_18.query(":READ?")
dataCurrent = [float(f)*1000 for f in dataI]
dataVoltage = [float(f) for f in dataE]
#print(dataCurrent, dataVoltage)
plt.plot(dataCurrent, dataR)
plt.ylabel("R [ohrm]")
plt.xlabel("Current [A]")
plt.show()

 グラフです。1690mAをピークに抵抗値が急激に増加し、その結果電流も減少しました。

 別の0.5Aのポリスイッチです。ピークの電流と、抵抗値の増加が少し異なります。

電子負荷につなぐ

 ポリスイッチは通常、電源ラインの途中に挿入する形で使用します。前出の0.5Aのポリスイッチをつないでいます。電子負荷に流す電流を変化させます。

 プログラムです。電源は5Vを出力します。電圧と電流を測定している間、手動で電子負荷の電流値を増減しました。

 range()で変化させているoutCurrent は、電流ではなくてx軸の時間です。50回測定をするために使っています。

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"

r = visa.ResourceManager()
agilentE3631A   = r.open_resource(AgilentE3631A_Addr)
keithley2000_6  = r.open_resource(Keithley2000_6_Addr)
keithley2000_18 = r.open_resource(Keithley2000_18_Addr)

dataI = []
dataE = []
dataR = []
dataT = []
agilentE3631A.write("*RST;*CLS")
agilentE3631A.write(":INST:SEL P6V")
agilentE3631A.write(":TRIG:SOUR IMM")
agilentE3631A.write(":OUTPut ON")

keithley2000_6.write("*RST;*CLS")
keithley2000_18.write("*RST;*CLS")
keithley2000_6.write(":CONF:CURR; DC:RANG AUTO")
keithley2000_18.write(":CONF:VOLT:DC:RANG 10")
sleep(1)
agilentE3631A.write(":VOLTage:TRIG 5.0")
agilentE3631A.write("INIT")

for outCurrent in range(1,50):
    sleep(0.1)
    dataT.append(outCurrent)
    
    dI = keithley2000_6.query(":READ?")
    dataI.append(dI)
    
    dE = keithley2000_18.query(":READ?")
    dataE.append(dE)
    dataR.append(float(dE)/float(dI))
    
    print("  E: ", float(dE), "V  I: ", float(dI)*1000.0 , "mA  R=", float(dE)/float(dI))

agilentE3631A.write("CURRent:TRIG 0")
agilentE3631A.write("VOLTage:TRIG 0")
agilentE3631A.write("INIT")
sleep(2)
print('--done--')
agilentE3631A.write(":OUTPut OFF")
keithley2000_6.query(":READ?")
keithley2000_18.query(":READ?")
dataCurrent = [float(f)*100 for f in dataI]
dataVoltage = [float(f)*10 for f in dataE]

#print(dataCurrent, dataVoltage)
plt.plot(dataT, dataR, marker="o", label="R")
plt.plot(dataT, dataCurrent, marker="v", label="Current")
plt.plot(dataT, dataVoltage, marker="x", label="Voltage")
plt.ylabel("Current[A], Voltage [V], R [ohrm]")
plt.xlabel("time")
plt.legend()
plt.show()

 グラフです。グラフを見やすくするため、電流は100倍A、電圧は10倍Vにスケールを変えています。

 グラフの最初に電流は0からではなく約45mA流しています。電流が100mA(スケールでは10)を超え始めると、電子負荷の抵抗値は急速に低下します。逆ですね。電子負荷装置の抵抗値を下げることで、電流を増加させています。
 より負荷抵抗値を低下させて電流が700mAに達したあたりでポリスイッチの抵抗値が上がり、電流が抑制されているのがわかります。