From def524bdf488e0de97f287e5711bd84226e8098f Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 10 Oct 2018 19:48:35 -0400 Subject: endstop_phase: Add support for detecting phase via TMC stepper drivers The Trinamic stepper motor drivers are capable of reporting the stepper phase - add support for using that capability to the enddstop_phases module. Signed-off-by: Kevin O'Connor --- klippy/extras/endstop_phase.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'klippy/extras/endstop_phase.py') diff --git a/klippy/extras/endstop_phase.py b/klippy/extras/endstop_phase.py index d3deba7c..552bcceb 100644 --- a/klippy/extras/endstop_phase.py +++ b/klippy/extras/endstop_phase.py @@ -6,17 +6,30 @@ import math, logging import homing +TRINAMIC_DRIVERS = ["tmc2130", "tmc2208"] + class EndstopPhase: def __init__(self, config): self.printer = config.get_printer() self.name = config.get_name().split()[1] - stepper_config = config.getsection(self.name) - self.step_dist = step_dist = stepper_config.getfloat('step_distance') - self.phases = config.getint('phases', minval=1) + # Determine number of stepper phases + for driver in TRINAMIC_DRIVERS: + driver_name = "%s %s" % (driver, self.name) + if config.has_section(driver_name): + module = self.printer.try_load_module(config, driver_name) + self.get_phase = module.get_phase + self.phases = module.get_microsteps() * 4 + break + else: + self.get_phase = None + self.phases = config.getint('phases', minval=1) + # Determine endstop phase position self.endstop_phase = config.getint('endstop_phase', None, minval=0, maxval=self.phases-1) self.endstop_align_zero = config.getboolean('endstop_align_zero', False) # Determine endstop accuracy + stepper_config = config.getsection(self.name) + self.step_dist = step_dist = stepper_config.getfloat('step_distance') endstop_accuracy = config.getfloat('endstop_accuracy', None, above=0.) if endstop_accuracy is None: self.endstop_accuracy = self.phases//2 - 1 @@ -44,8 +57,15 @@ class EndstopPhase: full_step = microsteps * self.step_dist return int(pos / full_step + .5) * full_step + phase_offset def get_homed_offset(self, stepper): - pos = stepper.get_mcu_position() - phase = pos % self.phases + if self.get_phase is not None: + try: + phase = self.get_phase() + except Exception as e: + msg = "Unable to get stepper %s phase: %s" % (self.name, str(e)) + logging.exception(msg) + raise homing.EndstopError(msg) + else: + phase = stepper.get_mcu_position() % self.phases if self.endstop_phase is None: logging.info("Setting %s endstop phase to %d", self.name, phase) self.endstop_phase = phase -- cgit v1.2.3-70-g09d2