151 lines
4.9 KiB
Python
151 lines
4.9 KiB
Python
from labcontrol.ea import EA_PS8080,EA_EL9080,EA_interface
|
|
from labcontrol.meter import MeterConfig,K2100Multimeter
|
|
import time
|
|
import i2c.i2c2 as pit
|
|
import signal
|
|
|
|
# Setup
|
|
maxpower = 1000 #maximum powerdraw for complete system in W
|
|
psvolt = [48.0] #supplied voltage in V
|
|
steps = 20 # number of steps to measure between 0 and 100% power
|
|
settletime = 8. # time to wait between setting current to draw and measurements in s
|
|
measures = 8 # number of measurements per setting
|
|
measuretime = .6 # time between measures in s
|
|
|
|
# defines
|
|
# stepwidth = maxpower/psvolt/steps
|
|
starttime = time.time()
|
|
|
|
def identify(devlist, mm=False):
|
|
outdict = {}
|
|
for dev in devlist:
|
|
devid = EA_interface(dev).write(12, 0, [])
|
|
if "PS" in devid[1]:
|
|
devtype = "ps"
|
|
else:
|
|
devtype = "el"
|
|
|
|
outdict[devtype] = {"id":devid[1][:-1], "address":dev, "type":devtype}
|
|
|
|
if mm == True:
|
|
outdict['mm']['dev'] = K2100Multimeter(mm_config)
|
|
outdict['mm']['type'] = "mm"
|
|
outdict['mm']['config'] = MeterConfig()
|
|
|
|
return outdict
|
|
|
|
def init(tree):
|
|
for dev, dat in tree.iteritems():
|
|
if dat['type'] == "el":
|
|
devobj = EA_EL9080(tree[dev]['address'])
|
|
devobj.remote(True)
|
|
elif dat['type'] == "ps":
|
|
devobj = EA_PS8080(tree[dev]['address'])
|
|
devobj.remote(True)
|
|
elif dat['type'] == "mm":
|
|
devobj = K2100Multimeter(tree[dev]['config'])
|
|
|
|
devobj.interface.debug_output = False
|
|
|
|
tree[dev]['dev'] = devobj
|
|
|
|
|
|
def setRanges(tree, volts):
|
|
for dev, dat in tree.iteritems():
|
|
if dat['type'] == "el":
|
|
dat['dev'].set_current(0)
|
|
dat['dev'].enable(True)
|
|
elif dat['type'] == "ps":
|
|
dat['dev'].set_current(maxpower/volts+1)
|
|
dat['dev'].set_power(maxpower+1)
|
|
dat['dev'].set_voltage(volts)
|
|
dat['dev'].output(True)
|
|
|
|
|
|
def deinit(signum, frame):
|
|
for dev, dat in devicetree.iteritems():
|
|
if devicetree[dev]['type'] == "el":
|
|
devicetree[dev]['dev'].enable(False)
|
|
#else:
|
|
#tree[dev]['dev'].output(False)
|
|
devicetree[dev]['dev'].remote(False)
|
|
devicetree[dev]['dev'].close()
|
|
|
|
#signal.signal(signal.SIGINT, original_sigint)
|
|
|
|
def measurement(devicetree, volts):
|
|
|
|
devicetree['ps']['dev'].set_current(maxpower/volts*1.1)
|
|
for i in range(1, steps+1):
|
|
steppercent = 100 * i/float(steps)
|
|
adcdata = {'T':0, 'V48':0, 'I48':0}
|
|
try:
|
|
act_el = devicetree['el']['dev'].get_actual_values()
|
|
act_ps = devicetree['ps']['dev'].get_actual_values()
|
|
devicetree['el']['dev'].set_current(steppercent /100 *maxpower/act_el['v'])
|
|
time.sleep(settletime)
|
|
act_el['i'] = 0
|
|
act_ps['i'] = 0
|
|
for m in range(0, measures):
|
|
act_el['i'] += devicetree['el']['dev'].get_actual_values()['i']
|
|
act_ps['i'] += devicetree['ps']['dev'].get_actual_values()['i']
|
|
#act_mm += devicetree['mm']['dev'].get_voltage()
|
|
adc = pit.rxtx_em()
|
|
for k in adcdata:
|
|
adcdata[k] += adc[k]
|
|
|
|
time.sleep(measuretime)
|
|
|
|
act_ps['i'] /= measures
|
|
act_el['i'] /= measures
|
|
for k in adcdata:
|
|
adcdata[k] /= measures
|
|
|
|
|
|
#$act_mm = act_mm/measures
|
|
log_new= "{:.2f},{:d},{:.3f},{:.3f},{:.3f},{:.3f},{:.3f},{:.3f},{:.3f},{:.3f},{:.3f}\n".format(
|
|
time.time()-starttime,
|
|
int(steppercent),
|
|
act_ps['v'],
|
|
act_ps['i'],
|
|
act_ps['p'],
|
|
act_el['v'],
|
|
act_el['i'],
|
|
act_el['p'],
|
|
adcdata['T'],
|
|
adcdata['V48'],
|
|
adcdata['I48']
|
|
)
|
|
log += log_new
|
|
except Exception as e:
|
|
print type(e)
|
|
print e
|
|
|
|
print(log)
|
|
|
|
if __name__ == "__main__":
|
|
#original_sigint = signal.getsignal(signal.SIGINT)
|
|
#signal.signal(signal.SIGINT, deinit)
|
|
devicetree = identify(["/dev/ttyUSB0","/dev/ttyUSB1"])
|
|
|
|
# manually start measurement by enabling 8V OUT
|
|
init(devicetree)
|
|
setRanges(devicetree, 48.0)
|
|
print("waiting for enable")
|
|
print(devicetree)
|
|
while (devicetree['el']['dev'].get_actual_values()['v'] < 5):
|
|
time.sleep(measuretime)
|
|
|
|
# prep log
|
|
time.sleep(settletime)
|
|
print("starting Measurement (approx {}s)".format(steps*(settletime + measures*measuretime)*len(psvolt)))
|
|
log = "time,perc_power,act_volt_ps,act_curr_ps,act_pow_ps,act_volt_el,act_curr_el,act_pow_el,pit_t,pit_v48,pit_i48\n"
|
|
for volts in psvolt:
|
|
#init(devicetree, volts)
|
|
#init(devicetree, volts)
|
|
setRanges(devicetree, volts)
|
|
measurement(devicetree, volts)
|
|
with open('./log.csv', 'w') as f:
|
|
f.write(log)
|
|
deinit(devicetree)
|