aboutsummaryrefslogtreecommitdiff
path: root/qolab
diff options
context:
space:
mode:
Diffstat (limited to 'qolab')
-rw-r--r--qolab/hardware/power_supply/keysight_e3612a.py116
1 files changed, 64 insertions, 52 deletions
diff --git a/qolab/hardware/power_supply/keysight_e3612a.py b/qolab/hardware/power_supply/keysight_e3612a.py
index b241b30..ecba1b3 100644
--- a/qolab/hardware/power_supply/keysight_e3612a.py
+++ b/qolab/hardware/power_supply/keysight_e3612a.py
@@ -2,16 +2,28 @@ from qolab.hardware.basic import BasicInstrument
from qolab.hardware.power_supply import PowerSupplySCPI
import time
+
class KeysightE3612A(PowerSupplySCPI):
- """ Keysight E3612A power supply """
+ """Keysight E3612A power supply"""
+
def __init__(self, resource, *args, **kwds):
super().__init__(resource, *args, **kwds)
- self.resource.read_termination='\n'
- self.config['Device model'] = 'Keysight E3612A'
+ self.resource.read_termination = "\n"
+ self.config["Device model"] = "Keysight E3612A"
self.numberOfChannels = 3
- self.deviceProperties.update({'OpMode'})
- self.channelProperties = {'IsOn', 'Regulation', 'Vout', 'Vlimit', 'Iout', 'Ilimit', 'dV', 'dI', }
- self.deffaultChannelR = 47; # used if no empirical way to calculate it via Vout/Iout
+ self.deviceProperties.update({"OpMode"})
+ self.channelProperties = {
+ "IsOn",
+ "Regulation",
+ "Vout",
+ "Vlimit",
+ "Iout",
+ "Ilimit",
+ "dV",
+ "dI",
+ }
+ self.deffaultChannelR = 47
+ # used if no empirical way to calculate it via Vout/Iout
def getChandV(self, chNum):
"""
@@ -31,41 +43,39 @@ class KeysightE3612A(PowerSupplySCPI):
"""
if chNum == 1:
return 0.2e-3
- return 0.160e-3 # see specification for high current > 20mA
-
-
+ return 0.160e-3 # see specification for high current > 20mA
def getOpMode(self):
"""
Queries power supply operation mode, returns OFF|PAR|SER|TRAC
OFF stands for independent channels
"""
- qstr = f'OUTP:PAIR?'
+ qstr = f"OUTP:PAIR?"
rstr = self.query(qstr)
- return( rstr )
+ return rstr
def setOpMode(self, val):
"""
Sets power supply operation mode, returns OFF|PAR|SER|TRAC
OFF stands for independent channels
"""
- cmnd = f'OUTP:PAIR {val}'
+ cmnd = f"OUTP:PAIR {val}"
rstr = self.write(cmnd)
def setChanOn(self, chNum):
- """ Power up channel output """
- self.write(f'OUTP ON,(@{chNum})')
+ """Power up channel output"""
+ self.write(f"OUTP ON,(@{chNum})")
def setChanOff(self, chNum):
- """ Power down channel output """
- self.write(f'OUTP OFF,(@{chNum})')
+ """Power down channel output"""
+ self.write(f"OUTP OFF,(@{chNum})")
@BasicInstrument.tsdb_append
def getChanIsOn(self, chNum):
- """ Queries channel output state """
- qstr = f'OUTP? (@{chNum})'
+ """Queries channel output state"""
+ qstr = f"OUTP? (@{chNum})"
rstr = self.query(qstr)
- return( bool(float(rstr)) )
+ return bool(float(rstr))
@BasicInstrument.tsdb_append
def getChanRegulation(self, chNum):
@@ -76,45 +86,45 @@ class KeysightE3612A(PowerSupplySCPI):
2 - The output is CV (constant voltage) operating mode
3 - The output has hardware failure
"""
- qstr = f'STAT:QUES:INST:ISUM{chNum}:COND?'
+ qstr = f"STAT:QUES:INST:ISUM{chNum}:COND?"
rstr = self.query(qstr)
- return( int(rstr) )
+ return int(rstr)
@BasicInstrument.tsdb_append
def getChanVout(self, chNum):
- qstr = f'MEAS:VOLT? (@{chNum})'
+ qstr = f"MEAS:VOLT? (@{chNum})"
rstr = self.query(qstr)
- return( float(rstr) )
+ return float(rstr)
@BasicInstrument.tsdb_append
def getChanVlimit(self, chNum):
- qstr = f'SOUR:VOLT? (@{chNum})'
+ qstr = f"SOUR:VOLT? (@{chNum})"
rstr = self.query(qstr)
- return( float(rstr) )
+ return float(rstr)
@BasicInstrument.tsdb_append
def setChanVlimit(self, chNum, val):
if val < 0:
- val=0
+ val = 0
if chNum == 1 and val > 6.180:
val = 6.180
if (chNum == 2 or chNum == 3) and val > 25.750:
val = 25.750
- cmnd = f'SOURCe:VOLT {val},(@{chNum})'
+ cmnd = f"SOURCe:VOLT {val},(@{chNum})"
rstr = self.write(cmnd)
@BasicInstrument.tsdb_append
def getChanIout(self, chNum):
- qstr = f'MEAS:CURR? (@{chNum})'
+ qstr = f"MEAS:CURR? (@{chNum})"
rstr = self.query(qstr)
- return( float(rstr) )
+ return float(rstr)
def setChanIout_mA(self, chNum, val, **kwds):
"""
Set current in mA.
Calls setChanIout with val converted from mA to A
"""
- return self.setChanIout(chNum, val/1000.0, **kwds)
+ return self.setChanIout(chNum, val / 1000.0, **kwds)
@BasicInstrument.tsdb_append
def setChanIout(self, chNum, val, currentHeadRoom=1e-3, dwellTime=0.3):
@@ -135,32 +145,34 @@ class KeysightE3612A(PowerSupplySCPI):
# is slightly off.
# We will assume that Vlimit = R*Iout + Vo = Vout + Vo, i.e. linear approximation
for i in range(10):
- iOut=self.getChanIout(chNum)
- if abs(iOut-iDesired) <= self.getChandI(chNum):
+ iOut = self.getChanIout(chNum)
+ if abs(iOut - iDesired) <= self.getChandI(chNum):
break
- vOut=self.getChanVout(chNum)
- if self.getChanRegulation(chNum) == 2: # i.e. CV mode
- vLimit=self.getChanVlimit(chNum)
+ vOut = self.getChanVout(chNum)
+ if self.getChanRegulation(chNum) == 2: # i.e. CV mode
+ vLimit = self.getChanVlimit(chNum)
Vo = vLimit - vOut
else:
- Vo=0
- if (iOut == 0) or (vOut <= 0.001): # when vOut set to 0 the numbers are misreported
- R = self.deffaultChannelR # some default
+ Vo = 0
+ if (iOut == 0) or (
+ vOut <= 0.001
+ ): # when vOut set to 0 the numbers are misreported
+ R = self.deffaultChannelR # some default
else:
- R=vOut/iOut
- vDesired = R*iDesired
- self.setChanVlimit(chNum, vDesired+Vo)
+ R = vOut / iOut
+ vDesired = R * iDesired
+ self.setChanVlimit(chNum, vDesired + Vo)
time.sleep(dwellTime)
@BasicInstrument.tsdb_append
def getChanIlimit(self, chNum):
- qstr = f'SOURce:CURR? (@{chNum})'
+ qstr = f"SOURce:CURR? (@{chNum})"
rstr = self.query(qstr)
- return( float(rstr) )
+ return float(rstr)
@BasicInstrument.tsdb_append
def setChanIlimit(self, chNum, val):
- """ Set current limit, seems to be >=0.002 for Ch1 and >=0.001 for Ch2 and Ch3 """
+ """Set current limit, seems to be >=0.002 for Ch1 and >=0.001 for Ch2 and Ch3"""
if chNum == 1 and val < 0.002:
val = 0.002
if chNum == 1 and val > 5.150:
@@ -169,18 +181,18 @@ class KeysightE3612A(PowerSupplySCPI):
val = 0.001
if (chNum == 2 or chNum == 3) and val > 1.030:
val = 1.030
- cmnd = f'SOURCe:CURR {val},(@{chNum})'
+ cmnd = f"SOURCe:CURR {val},(@{chNum})"
rstr = self.write(cmnd)
-if __name__ == '__main__':
+if __name__ == "__main__":
import pyvisa
+
print("testing")
rm = pyvisa.ResourceManager()
- print(rm.list_resources())
- instr=rm.open_resource('USB0::10893::4354::MY61001869::0::INSTR')
+ print(rm.list_resources())
+ instr = rm.open_resource("USB0::10893::4354::MY61001869::0::INSTR")
ps = KeysightE3612A(instr)
- print('------ Header start -------------')
- print(str.join('\n', ps.getHeader()))
- print('------ Header ends -------------')
-
+ print("------ Header start -------------")
+ print(str.join("\n", ps.getHeader()))
+ print("------ Header ends -------------")