Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

temperature_driver: adds driver temperature sensor #6210

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions docs/Config_Reference.md
Expand Up @@ -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.
Expand Down
58 changes: 58 additions & 0 deletions klippy/extras/temperature_driver.py
@@ -0,0 +1,58 @@
# Support for micro-controller chip based temperature sensors
#
# Copyright (C) 2020 Kevin O'Connor <kevin@koconnor.net>
#
# 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)
3 changes: 3 additions & 0 deletions klippy/extras/temperature_sensors.cfg
Expand Up @@ -33,6 +33,9 @@
# Load "temperature_mcu" sensor
[temperature_mcu]

# Load "temperature_driver" sensor
[temperature_driver]


########################################
# Default thermistors
Expand Down
12 changes: 9 additions & 3 deletions klippy/extras/tmc.py
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions klippy/extras/tmc2130.py
Expand Up @@ -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):
Expand Down Expand Up @@ -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()


######################################################################
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions klippy/extras/tmc2208.py
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions klippy/extras/tmc2209.py
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions klippy/extras/tmc2240.py
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions klippy/extras/tmc2660.py
Expand Up @@ -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()


######################################################################
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions klippy/extras/tmc5160.py
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions klippy/extras/tmc_uart.py
Expand Up @@ -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):
Expand Down Expand Up @@ -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()