aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/endstop_phase.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2018-10-10 19:48:35 -0400
committerKevin O'Connor <kevin@koconnor.net>2018-10-16 13:09:23 -0400
commitdef524bdf488e0de97f287e5711bd84226e8098f (patch)
tree0946f12fc8a233ca8e4f9fd26985282dcbdc059d /klippy/extras/endstop_phase.py
parenta2df01b88ec1a7d72f77222fd94219b9037e3ad9 (diff)
downloadkutter-def524bdf488e0de97f287e5711bd84226e8098f.tar.gz
kutter-def524bdf488e0de97f287e5711bd84226e8098f.tar.xz
kutter-def524bdf488e0de97f287e5711bd84226e8098f.zip
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 <kevin@koconnor.net>
Diffstat (limited to 'klippy/extras/endstop_phase.py')
-rw-r--r--klippy/extras/endstop_phase.py30
1 files changed, 25 insertions, 5 deletions
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