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に達したあたりでポリスイッチの抵抗値が上がり、電流が抑制されているのがわかります。