aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/stepper.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-07-24 13:54:46 -0400
committerKevin O'Connor <kevin@koconnor.net>2017-07-24 13:54:46 -0400
commit143b7cccf4bb170fa6a78d88da9d061487288792 (patch)
tree50a290c028f2604b66c88e343613d2afd6dcebd1 /klippy/stepper.py
parent8ce042bf04aca923460d7ed37fa938e11378f917 (diff)
downloadkutter-143b7cccf4bb170fa6a78d88da9d061487288792.tar.gz
kutter-143b7cccf4bb170fa6a78d88da9d061487288792.tar.xz
kutter-143b7cccf4bb170fa6a78d88da9d061487288792.zip
stepper: Separate out homing code to its own PrinterHomingStepper class
Keep the homing code separate from the main stepper class. This makes it easier to verify the correct config parameters are provided. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/stepper.py')
-rw-r--r--klippy/stepper.py81
1 files changed, 42 insertions, 39 deletions
diff --git a/klippy/stepper.py b/klippy/stepper.py
index eac1d263..61900a20 100644
--- a/klippy/stepper.py
+++ b/klippy/stepper.py
@@ -13,6 +13,48 @@ class PrinterStepper:
self.step_dist = config.getfloat('step_distance', above=0.)
self.inv_step_dist = 1. / self.step_dist
self.min_stop_interval = 0.
+ step_pin = config.get('step_pin')
+ dir_pin = config.get('dir_pin')
+ self.mcu_stepper = printer.mcu.create_stepper(step_pin, dir_pin)
+ self.mcu_stepper.set_step_distance(self.step_dist)
+
+ enable_pin = config.get('enable_pin', None)
+ if enable_pin is not None:
+ self.mcu_enable = printer.mcu.create_digital_out(enable_pin, 0)
+ self.need_motor_enable = True
+ def _dist_to_time(self, dist, start_velocity, accel):
+ # Calculate the time it takes to travel a distance with constant accel
+ time_offset = start_velocity / accel
+ return math.sqrt(2. * dist / accel + time_offset**2) - time_offset
+ def set_max_jerk(self, max_halt_velocity, max_accel):
+ # Calculate the firmware's maximum halt interval time
+ last_step_time = self._dist_to_time(
+ self.step_dist, max_halt_velocity, max_accel)
+ second_last_step_time = self._dist_to_time(
+ 2. * self.step_dist, max_halt_velocity, max_accel)
+ min_stop_interval = second_last_step_time - last_step_time
+ self.mcu_stepper.set_min_stop_interval(min_stop_interval)
+ def motor_enable(self, move_time, enable=0):
+ if enable and self.need_motor_enable:
+ mcu_time = self.mcu_stepper.print_to_mcu_time(move_time)
+ self.mcu_stepper.reset_step_clock(mcu_time)
+ if (self.mcu_enable is not None
+ and self.mcu_enable.get_last_setting() != enable):
+ mcu_time = self.mcu_enable.print_to_mcu_time(move_time)
+ self.mcu_enable.set_digital(mcu_time, enable)
+ self.need_motor_enable = not enable
+
+class PrinterHomingStepper(PrinterStepper):
+ def __init__(self, printer, config, name):
+ PrinterStepper.__init__(self, printer, config, name)
+
+ endstop_pin = config.get('endstop_pin', None)
+ self.mcu_endstop = printer.mcu.create_endstop(endstop_pin)
+ self.mcu_endstop.add_stepper(self.mcu_stepper)
+ self.position_min = config.getfloat('position_min', 0.)
+ self.position_max = config.getfloat(
+ 'position_max', 0., above=self.position_min)
+ self.position_endstop = config.getfloat('position_endstop')
self.homing_speed = config.getfloat('homing_speed', 5.0, above=0.)
self.homing_positive_dir = config.getboolean(
@@ -42,45 +84,6 @@ class PrinterStepper:
self.homing_stepper_phases = None
if printer.mcu.is_fileoutput():
self.homing_endstop_accuracy = self.homing_stepper_phases
- self.position_min = self.position_endstop = self.position_max = None
- endstop_pin = config.get('endstop_pin', None)
- step_pin = config.get('step_pin')
- dir_pin = config.get('dir_pin')
- mcu = printer.mcu
- self.mcu_stepper = mcu.create_stepper(step_pin, dir_pin)
- self.mcu_stepper.set_step_distance(self.step_dist)
- enable_pin = config.get('enable_pin', None)
- if enable_pin is not None:
- self.mcu_enable = mcu.create_digital_out(enable_pin, 0)
- if endstop_pin is not None:
- self.mcu_endstop = mcu.create_endstop(endstop_pin)
- self.mcu_endstop.add_stepper(self.mcu_stepper)
- self.position_min = config.getfloat('position_min', 0.)
- self.position_max = config.getfloat(
- 'position_max', 0., above=self.position_min)
- self.position_endstop = config.getfloat('position_endstop')
- self.need_motor_enable = True
- def _dist_to_time(self, dist, start_velocity, accel):
- # Calculate the time it takes to travel a distance with constant accel
- time_offset = start_velocity / accel
- return math.sqrt(2. * dist / accel + time_offset**2) - time_offset
- def set_max_jerk(self, max_halt_velocity, max_accel):
- # Calculate the firmware's maximum halt interval time
- last_step_time = self._dist_to_time(
- self.step_dist, max_halt_velocity, max_accel)
- second_last_step_time = self._dist_to_time(
- 2. * self.step_dist, max_halt_velocity, max_accel)
- min_stop_interval = second_last_step_time - last_step_time
- self.mcu_stepper.set_min_stop_interval(min_stop_interval)
- def motor_enable(self, move_time, enable=0):
- if enable and self.need_motor_enable:
- mcu_time = self.mcu_stepper.print_to_mcu_time(move_time)
- self.mcu_stepper.reset_step_clock(mcu_time)
- if (self.mcu_enable is not None
- and self.mcu_enable.get_last_setting() != enable):
- mcu_time = self.mcu_enable.print_to_mcu_time(move_time)
- self.mcu_enable.set_digital(mcu_time, enable)
- self.need_motor_enable = not enable
def enable_endstop_checking(self, move_time, step_time):
mcu_time = self.mcu_endstop.print_to_mcu_time(move_time)
self.mcu_endstop.home_start(mcu_time, step_time)