Created
June 30, 2021 13:20
-
-
Save kratsg/08f02381f91beb9b50b69e3e476e7832 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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