improvements for triton

- set cooldown channel befor setting action
- improve max heater setting
This commit is contained in:
l_samenv 2022-11-15 16:57:52 +01:00
parent df428f4c0c
commit 49b9bfa11d

View File

@ -20,11 +20,13 @@
# ***************************************************************************** # *****************************************************************************
"""oxford instruments triton (kelvinoxjt dil)""" """oxford instruments triton (kelvinoxjt dil)"""
from math import sqrt from math import sqrt, log10
from secop.core import Writable, Parameter, Readable, Drivable, IDLE, WARN, BUSY, ERROR, Done from secop.core import Writable, Parameter, Readable, Drivable, IDLE, WARN, BUSY, ERROR, \
from secop.datatypes import EnumType, FloatRange Done, Property
from secop.datatypes import EnumType, FloatRange, StringType
from secop.lib.enum import Enum from secop.lib.enum import Enum
from secop_psi.mercury import MercuryChannel, Mapped, off_on, HasInput, SELF from secop_psi.mercury import MercuryChannel, Mapped, off_on, HasInput, SELF
from secop.lib import clamp
import secop_psi.mercury as mercury import secop_psi.mercury as mercury
actions = Enum(none=0, condense=1, circulate=2, collect=3) actions = Enum(none=0, condense=1, circulate=2, collect=3)
@ -35,6 +37,7 @@ actions_map.mapping['NONE'] = actions.none # when writing, STOP is used instead
class Action(MercuryChannel, Writable): class Action(MercuryChannel, Writable):
channel_type = 'ACTN' channel_type = 'ACTN'
cooldown_channel = Property('cool down channel', StringType(), 'T5')
value = Parameter('running action', EnumType(actions)) value = Parameter('running action', EnumType(actions))
target = Parameter('action to do', EnumType(none=0, condense=1, collect=3), readonly=False) target = Parameter('action to do', EnumType(none=0, condense=1, collect=3), readonly=False)
_target = 0 _target = 0
@ -47,6 +50,7 @@ class Action(MercuryChannel, Writable):
def write_target(self, value): def write_target(self, value):
self._target = value self._target = value
self.change('SYS:DR:CHAN:COOL', self.cooldown_channel, str)
return self.change('SYS:DR:ACTN', value, actions_map) return self.change('SYS:DR:ACTN', value, actions_map)
# actions: # actions:
@ -245,10 +249,14 @@ class TemperatureLoop(ScannerChannel, mercury.TemperatureLoop):
ENABLE = 'TEMP:LOOP:MODE' ENABLE = 'TEMP:LOOP:MODE'
ENABLE_RAMP = 'TEMP:LOOP:RAMP:ENAB' ENABLE_RAMP = 'TEMP:LOOP:RAMP:ENAB'
RAMP_RATE = 'TEMP:LOOP:RAMP:RATE' RAMP_RATE = 'TEMP:LOOP:RAMP:RATE'
enable_pid_table = None # remove, does not work on triton enable_pid_table = None # remove, does not work on triton
ctrlpars = Parameter('pid (gain, integral (inv. time), differential time')
system_channel = Property('system channel name', StringType(), 'MC')
def write_control_active(self, value): def write_control_active(self, value):
self.change('SYS:DR:CHAN:MC', 'T5', str) if self.system_channel:
self.change('SYS:DR:CHAN:%s' % self.system_channel, self.slot.split(',')[0], str)
if value: if value:
self.change('TEMP:LOOP:FILT:ENAB', 'ON', str) self.change('TEMP:LOOP:FILT:ENAB', 'ON', str)
if self.output_module: if self.output_module:
@ -260,7 +268,7 @@ class TemperatureLoop(ScannerChannel, mercury.TemperatureLoop):
class HeaterOutput(HasInput, MercuryChannel, Writable): class HeaterOutput(HasInput, MercuryChannel, Writable):
"""heater output""" """heater output"""
channel_type = 'HTR' channel_type = 'HTR'
value = Parameter('heater output', FloatRange(unit='W')) value = Parameter('heater output', FloatRange(unit='uW'))
target = Parameter('heater output', FloatRange(0, unit='$'), readonly=False) target = Parameter('heater output', FloatRange(0, unit='$'), readonly=False)
resistivity = Parameter('heater resistivity', FloatRange(unit='Ohm')) resistivity = Parameter('heater resistivity', FloatRange(unit='Ohm'))
@ -268,7 +276,7 @@ class HeaterOutput(HasInput, MercuryChannel, Writable):
return self.query('HTR:RES') return self.query('HTR:RES')
def read_value(self): def read_value(self):
return self.query('HTR:SIG:POWR') * 1e-6 return round(self.query('HTR:SIG:POWR'), 3)
def read_target(self): def read_target(self):
if self.controlled_by != 0: if self.controlled_by != 0:
@ -277,24 +285,33 @@ class HeaterOutput(HasInput, MercuryChannel, Writable):
def write_target(self, value): def write_target(self, value):
self.write_controlled_by(SELF) self.write_controlled_by(SELF)
return self.change('HTR:SIG:POWR', value * 1e6) if self.resistivity:
# round to the next voltage step
value = round(sqrt(value * self.resistivity)) ** 2 / self.resistivity
return round(self.change('HTR:SIG:POWR', value), 3)
class HeaterOutputWithRange(HeaterOutput): class HeaterOutputWithRange(HeaterOutput):
"""heater output with heater range""" """heater output with heater range"""
channel_type = 'HTR,TEMP' channel_type = 'HTR,TEMP'
limit = Parameter('max. heater power', FloatRange(unit='W'), readonly=False) limit = Parameter('max. heater power', FloatRange(unit='uW'), readonly=False)
def read_limit(self): def read_limit(self):
maxcur = self.query('TEMP:LOOP:RANGE') * 0.001 # mA -> A maxcur = self.query('TEMP:LOOP:RANGE') # mA
return self.read_resistivity() * maxcur ** 2 return self.read_resistivity() * maxcur ** 2 # uW
def write_limit(self, value): def write_limit(self, value):
if value is None: if value is None:
maxcur = 0.1 # max. allowed current 100mA maxcur = 100 # max. allowed current 100mA
else: else:
maxcur = sqrt(value / self.read_resistivity()) maxcur = sqrt(value / self.read_resistivity())
self.change('TEMP:LOOP:RANGE', maxcur * 1000) for cur in 0.0316, 0.1, 0.316, 1, 3.16, 10, 31.6, 100:
if cur > maxcur * 0.999:
maxcur = cur
break
else:
maxcur = cur
self.change('TEMP:LOOP:RANGE', maxcur)
return self.read_limit() return self.read_limit()