-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathk24xx.py
133 lines (117 loc) · 3.33 KB
/
k24xx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# written by grey@christoforo.net
# on 8 Nov 2017
import serial
import time
import sys
class K24xx:
"""keithley 24xx library
"""
port = None
expectedDeviceString = 'KEITHLEY INSTRUMENTS INC.,MODEL 2410,4090615,C33 Mar 31 2015 09:32:39/A02 /J/K\r\n'
outOnSettleTime = 0.5 # seconds to settle after output turned on
def __init__(self, port='/dev/ttyUSB0', baud=57600, timeout=30):
"""keithley 24xx library constructor
"""
# flush the read buffer here
self.port = serial.Serial(port,baud,timeout=1)
self._write('*RST')
self.port.flush()
if sys.version_info[0] > 3:
self.port.reset_output_buffer()
self.port.reset_input_buffer()
c = b'c'
while c is not b'':
c = self.port.read()
#print('Flush Read:', c)
self.port.close()
self.port = serial.Serial(port,baud,timeout=timeout)
identStr = self._qu('*IDN?')
if identStr == self.expectedDeviceString:
pass
#print('Conected to', deviceString.decode("utf-8"))
else:
print('ERROR: Got unexpected device string:', identStr)
self.port.close()
def __del__(self):
"""keithley 24xx library deconstructor
"""
#print('Cleaning up sourcemeter comms')
try:
self._write(':OUTP OFF')
self.port.flush()
time.sleep(0.1)
except:
pass
try:
self.port.reset_output_buffer()
except:
pass
try:
self.port.reset_input_buffer()
except:
pass
try:
self.port.close()
except:
pass
def _write(self,cmd):
"""Send command to sourcemeter
"""
toSend = cmd.encode('utf-8') + b'\n'
self.port.write(toSend)
def _qu(self,cmd):
"""Query sourcemeter with command
"""
self._write(cmd)
result = self.port.readline()
decoded = result.decode('utf-8')
return(decoded)
def currentSetup(self,nplc=10.0,nMean=1,t=False):
"""Setup sourcemeter for current measurements
"""
cmds = []
cmds.append('*RST')
cmds.append(':SOUR:FUNC VOLT')
cmds.append(':SOUR:VOLT:MODE FIXED')
cmds.append(':SENS:FUNC "CURR"')
cmds.append(':SENS:CURR:NPLC {:}'.format(nplc))
cmds.append(':SOUR:VOLT:RANG MIN')
cmds.append(':SOUR:VOLT:LEV 0')
if t == False:
cmds.append(':FORM:ELEM CURR')
elif t == True:
cmds.append(':FORM:ELEM CURR, TIME')
else:
print('ERROR: t parameter data type')
cmds.append(':FORM:ELEM CURR')
nMean = int(nMean)
if nMean == 1:
cmds.append(':SENS:AVER:STAT 0')
elif (nMean > 1) and (nMean <= 100):
cmds.append(':SENS:AVER:STAT 1')
cmds.append(':SENS:AVER:STAT {:}'.format(nMean))
else:
print('ERROR: Got invalid nMean value')
for cmd in cmds:
#print('Sending', cmd)
self._write(cmd)
#self.port.write(b':SYST:ERR?\n')
#err = self.port.readline()
#print(err)
def setOutput(self,value):
if value == True:
self._write(':OUTP ON')
time.sleep(self.outOnSettleTime) # let the output settle
elif value == False:
self._write(':OUTP OFF')
else:
print('Invalid data type')
def getCurrent(self):
"""Reads current from sourcemeter
"""
vals = self._qu('READ?').split(',')
if len(vals) == 1:
ret = float(vals[0])
else:
ret = [float(val) for val in vals ]
return(ret)