Skip to content

Instantly share code, notes, and snippets.

@kratsg
Created June 30, 2021 13:20
Show Gist options
  • Select an option

  • Save kratsg/08f02381f91beb9b50b69e3e476e7832 to your computer and use it in GitHub Desktop.

Select an option

Save kratsg/08f02381f91beb9b50b69e3e476e7832 to your computer and use it in GitHub Desktop.
import mecom
import time
class Peltier(mecom.MeCom):
def __init__(self, port, interesting_ids=[1000, 1001, 1010, 1020, 1021, 1200, 2010]):
super().__init__(port)
self.interested = interesting_ids
def print(self, verbose=False):
for command in sorted(self.PARAMETERS._PARAMETERS, key=lambda x: x.id):
if verbose or command.id in self.interested:
print(f'({command.id:05d}){command.name:50s}{self[command.id]}')
@property
def port(self):
return self.ser.port
@property
def status(self):
return super().status()
@property
def address(self):
return super().identify()
def __getitem__(self, parameter_id):
try:
value = super().get_parameter(parameter_id=parameter_id, address=self.address)
except (mecom.ResponseException, mecom.WrongChecksum) as ex:
self.stop()
_ids = self.interested
_parameters = self.PARAMETERS._PARAMETERS
super().__init__(self.port)
self.interested = _ids
self.PARAMETERS._PARAMETERS = _parameters
return value
def __setitem__(self, parameter_id, value):
try:
super().set_parameter(parameter_id=parameter_id, value=value, address=self.address)
except (mecom.ResponseException, mecom.WrongChecksum) as ex:
self.stop()
_ids = self.interested
_parameters = self.PARAMETERS._PARAMETERS
super().__init__(self.port)
self.interested = _ids
self.PARAMETERS._PARAMETERS = _parameters
def __repr__(self):
"""Representation of the object"""
module = type(self).__module__
qualname = type(self).__qualname__
return f"<{module}.{qualname}(port={self.port}, addr={self.address}, status={self.status}) at {hex(id(self))}>"
@property
def object_temp(self):
return self[1000]
@property
def sink_temp(self):
return self[1001]
@property
def target_temp(self):
return self[1010]
@target_temp.setter
def target_temp(self, tempTarget):
self[3000] = float(tempTarget)
@property
def current(self):
return self[1020]
@current.setter
def current(self, current):
self[2020] = float(current)
@property
def voltage(self):
return self[1021]
@voltage.setter
def voltage(self, voltage):
self[2021] = float(voltage)
@property
def stable(self):
return self[1200]
def add_parameter(self, config):
self.PARAMETERS._PARAMETERS.append(mecom.Parameter(config))
with Peltier("/dev/ttyUSB0") as mc:
mc.add_parameter({"id": 2000, "name": "Input Selection", "format": "INT32"})
mc.add_parameter({"id": 3020, "name": "Mode", "format": "INT32"})
# 3.3.4.2 CHx Temperature Controller PID Values
mc.add_parameter({"id": 3010, "name": "Kp", "format": "FLOAT32"})
mc.add_parameter({"id": 3011, "name": "Ti", "format": "FLOAT32"})
mc.add_parameter({"id": 3012, "name": "Td", "format": "FLOAT32"})
mc.add_parameter({"id": 3013, "name": "D Part Damping PT1", "format": "FLOAT32"})
# 3.3.4.4 CHx Peltier Characteristics
mc.add_parameter({"id": 3030, "name": "Maximal Current Imax", "format": "FLOAT32"})
mc.add_parameter({"id": 3033, "name": "Delta Temperature dTmax", "format": "FLOAT32"})
mc.add_parameter({"id": 3034, "name": "Positive Current is", "format": "INT32"})
mc.add_parameter({"id": 51000, "name": "Auto Tuning Start", "format": "INT32"})
mc.add_parameter({"id": 51001, "name": "Auto Tuning Cancel", "format": "INT32"})
mc.add_parameter({"id": 51002, "name": "Thermal Model Speed", "format": "INT32"})
mc.add_parameter({"id": 51014, "name": "Tuned Kp", "format": "FLOAT32"})
mc.add_parameter({"id": 51015, "name": "Tuned Ti", "format": "FLOAT32"})
mc.add_parameter({"id": 51016, "name": "Tuned Td", "format": "FLOAT32"})
mc.add_parameter({"id": 51020, "name": "Auto Tuning Status", "format": "INT32"})
mc.add_parameter({"id": 51021, "name": "Tuning Progress", "format": "FLOAT32"})
mc.interested.extend([51000, 51001, 51020, 51021])
try:
# # which device are we talking to?
address = mc.address
status = mc.status
while status != 'Ready':
print('Status is: {status}')
mc.reset_device()
status = mc.status
# set standard PID settings
mc[3010] = 10.0
mc[3011] = 300.0
mc[3012] = 0.0
# set peltier characteristics from datasheet
# https://www.cuidevices.com/product/resource/cp85-2.pdf
mc[3030] = 8.5
mc[3033] = 95.0
mc[3034] = 0
print(mc)
print("-"*50)
mc.print(True)
# set target temperature
mc[3000] = 20.0
# set fast thermal model speed
mc[51002] = 0
print("-"*50)
mc.print(True)
breakpoint()
while True:
print("-"*50)
mc.print()
time.sleep(3)
except:
mc[3000] = 25.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment