diff options
Diffstat (limited to 'qolab/hardware')
-rw-r--r-- | qolab/hardware/power_supply/keysight_e3612a.py | 116 |
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 -------------") |