From 3be315e2e720e6029a4a65ca4ae6779c1b23b2bb Mon Sep 17 00:00:00 2001 From: Pedro Lamas Date: Sun, 21 May 2023 09:44:48 +0100 Subject: [PATCH] temperature_driver: adds driver temperature sensor Signed-off-by: Pedro Lamas --- docs/Config_Reference.md | 11 +++++ klippy/extras/temperature_driver.py | 58 +++++++++++++++++++++++++++ klippy/extras/temperature_sensors.cfg | 3 ++ klippy/extras/tmc.py | 12 ++++-- klippy/extras/tmc2130.py | 6 +++ klippy/extras/tmc2208.py | 2 + klippy/extras/tmc2209.py | 2 + klippy/extras/tmc2240.py | 2 + klippy/extras/tmc2660.py | 4 ++ klippy/extras/tmc5160.py | 2 + klippy/extras/tmc_uart.py | 4 ++ 11 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 klippy/extras/temperature_driver.py diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index b36c47a96a42..faaa33bb87a3 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -2506,6 +2506,17 @@ sensor_type: temperature_mcu # micro-controller specification. ``` +### Builtin stepper driver temperature sensor + +The TMC2240 stepper driver contain an internal temperature sensor. One can +use the "temperature_driver" sensor to monitor this temperatures. + +``` +sensor_type: temperature_driver +sensor_driver: +# The stepper driver to read from. +``` + ### Host temperature sensor Temperature from the machine (eg Raspberry Pi) running the host software. diff --git a/klippy/extras/temperature_driver.py b/klippy/extras/temperature_driver.py new file mode 100644 index 000000000000..13e0a645fdcb --- /dev/null +++ b/klippy/extras/temperature_driver.py @@ -0,0 +1,58 @@ +# Support for micro-controller chip based temperature sensors +# +# Copyright (C) 2020 Kevin O'Connor +# +# This file may be distributed under the terms of the GNU GPLv3 license. +DRIVER_REPORT_TIME = 1.0 + +class PrinterTemperatureDriver: + def __init__(self, config): + self.printer = config.get_printer() + + driver_name = config.get('sensor_driver') + self.driver = self.printer.lookup_object(driver_name) + + self.temp = self.min_temp = self.max_temp = 0.0 + + self.reactor = self.printer.get_reactor() + self.sample_timer = self.reactor.register_timer( + self._sample_driver_temperature) + + self.printer.register_event_handler("klippy:connect", + self.handle_connect) + + def handle_connect(self): + self.reactor.update_timer(self.sample_timer, self.reactor.NOW) + + def setup_callback(self, temperature_callback): + self.temperature_callback = temperature_callback + + def setup_minmax(self, min_temp, max_temp): + self.min_temp = min_temp + self.max_temp = max_temp + + def get_report_time_delta(self): + return DRIVER_REPORT_TIME + + def _sample_driver_temperature(self, eventtime): + self.temp = self.driver.get_temperature() + + if self.temp is not None: + if self.temp < self.min_temp or self.temp > self.max_temp: + self.printer.invoke_shutdown( + "DRIVER temperature %0.1f outside range of %0.1f:%.01f" + % (self.temp, self.min_temp, self.max_temp)) + + measured_time = self.reactor.monotonic() + + if self.temp is not None: + mcu = self.driver.get_mcu() + self.temperature_callback( + mcu.estimated_print_time(measured_time), + self.temp) + + return measured_time + DRIVER_REPORT_TIME + +def load_config(config): + pheaters = config.get_printer().load_object(config, "heaters") + pheaters.add_sensor_factory("temperature_driver", PrinterTemperatureDriver) diff --git a/klippy/extras/temperature_sensors.cfg b/klippy/extras/temperature_sensors.cfg index 7e0d918f5b8a..470c43195362 100644 --- a/klippy/extras/temperature_sensors.cfg +++ b/klippy/extras/temperature_sensors.cfg @@ -33,6 +33,9 @@ # Load "temperature_mcu" sensor [temperature_mcu] +# Load "temperature_driver" sensor +[temperature_driver] + ######################################## # Default thermistors diff --git a/klippy/extras/tmc.py b/klippy/extras/tmc.py index 28f7be6fc01f..740f0bcba34c 100644 --- a/klippy/extras/tmc.py +++ b/klippy/extras/tmc.py @@ -204,12 +204,14 @@ def start_checks(self): if cleared_flags & reset_mask: return True return False + def get_temperature(self): + if self.check_timer is None or self.adc_temp is None: + return None + return round((self.adc_temp - 2038) / 7.7, 2) def get_status(self, eventtime=None): if self.check_timer is None: return {'drv_status': None, 'temperature': None} - temp = None - if self.adc_temp is not None: - temp = round((self.adc_temp - 2038) / 7.7, 2) + temp = self.get_temperature() last_value, reg_name = self.drv_status_reg_info[:2] if last_value != self.last_drv_status: self.last_drv_status = last_value @@ -404,6 +406,10 @@ def _handle_connect(self): self._init_registers() except self.printer.command_error as e: logging.info("TMC %s failed to init: %s", self.name, str(e)) + def get_temperature(self): + return self.echeck_helper.get_temperature() + def get_mcu(self): + return self.mcu_tmc.get_mcu() # get_status information export def get_status(self, eventtime=None): cpos = None diff --git a/klippy/extras/tmc2130.py b/klippy/extras/tmc2130.py index 62a9abbfe56b..c3cdc2171b9e 100644 --- a/klippy/extras/tmc2130.py +++ b/klippy/extras/tmc2130.py @@ -223,6 +223,8 @@ def reg_write(self, reg, val, chain_pos, print_time=None): pr = pr[(self.chain_len - chain_pos) * 5 : (self.chain_len - chain_pos + 1) * 5] return (pr[1] << 24) | (pr[2] << 16) | (pr[3] << 8) | pr[4] + def get_mcu(self): + return self.spi.get_mcu() # Helper to setup an spi daisy chain bus from settings in a config section def lookup_tmc_spi_chain(config): @@ -274,6 +276,8 @@ def set_register(self, reg_name, val, print_time=None): "Unable to write tmc spi '%s' register %s" % (self.name, reg_name)) def get_tmc_frequency(self): return self.tmc_frequency + def get_mcu(self): + return self.tmc_spi.get_mcu() ###################################################################### @@ -293,6 +297,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # Setup basic register values tmc.TMCWaveTableHelper(config, self.mcu_tmc) diff --git a/klippy/extras/tmc2208.py b/klippy/extras/tmc2208.py index 421c53781613..073a14b05252 100644 --- a/klippy/extras/tmc2208.py +++ b/klippy/extras/tmc2208.py @@ -194,6 +194,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters, self.read_translate) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # Setup basic register values self.fields.set_field("mstep_reg_select", True) diff --git a/klippy/extras/tmc2209.py b/klippy/extras/tmc2209.py index c248c2d68c6f..aef884bfb780 100644 --- a/klippy/extras/tmc2209.py +++ b/klippy/extras/tmc2209.py @@ -70,6 +70,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # Setup basic register values self.fields.set_field("mstep_reg_select", True) diff --git a/klippy/extras/tmc2240.py b/klippy/extras/tmc2240.py index 19e62ab76a71..96ec86cd1e0b 100644 --- a/klippy/extras/tmc2240.py +++ b/klippy/extras/tmc2240.py @@ -352,6 +352,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # Setup basic register values tmc.TMCWaveTableHelper(config, self.mcu_tmc) diff --git a/klippy/extras/tmc2660.py b/klippy/extras/tmc2660.py index dcffac759fbd..b23866c0f2bb 100644 --- a/klippy/extras/tmc2660.py +++ b/klippy/extras/tmc2660.py @@ -223,6 +223,8 @@ def set_register(self, reg_name, val, print_time=None): self.spi.spi_send(msg, minclock) def get_tmc_frequency(self): return None + def get_mcu(self): + return self.spi.get_mcu() ###################################################################### @@ -240,6 +242,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # CHOPCONF diff --git a/klippy/extras/tmc5160.py b/klippy/extras/tmc5160.py index b82b5fecd2ff..8d4ad6d05656 100644 --- a/klippy/extras/tmc5160.py +++ b/klippy/extras/tmc5160.py @@ -332,6 +332,8 @@ def __init__(self, config): cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc, current_helper) cmdhelper.setup_register_dump(ReadRegisters) self.get_phase_offset = cmdhelper.get_phase_offset + self.get_temperature = cmdhelper.get_temperature + self.get_mcu = cmdhelper.get_mcu self.get_status = cmdhelper.get_status # Setup basic register values tmc.TMCWaveTableHelper(config, self.mcu_tmc) diff --git a/klippy/extras/tmc_uart.py b/klippy/extras/tmc_uart.py index 4d5ec1d5a257..851b9301c990 100644 --- a/klippy/extras/tmc_uart.py +++ b/klippy/extras/tmc_uart.py @@ -184,6 +184,8 @@ def reg_write(self, instance_id, addr, reg, val, print_time=None): self.analog_mux.activate(instance_id) msg = self._encode_write(0xf5, addr, reg | 0x80, val) self.tmcuart_send_cmd.send([self.oid, msg, 0], minclock=minclock) + def get_mcu(self): + return self.mcu # Lookup a (possibly shared) tmc uart def lookup_tmc_uart_bitbang(config, max_addr): @@ -253,3 +255,5 @@ def set_register(self, reg_name, val, print_time=None): "Unable to write tmc uart '%s' register %s" % (self.name, reg_name)) def get_tmc_frequency(self): return self.tmc_frequency + def get_mcu(self): + return self.mcu_uart.get_mcu()