aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-10-25 21:06:20 -0400
committerKevin O'Connor <kevin@koconnor.net>2016-10-31 11:14:28 -0400
commit8f331f08d262cdc9e641d333e17098a94cf13fd5 (patch)
tree3243b7a0e3818369e1f0cd99137822a0ea6327a8
parentf0cefebff7c9077dd5f39a9d265cada04b76e6b6 (diff)
downloadkutter-8f331f08d262cdc9e641d333e17098a94cf13fd5.tar.gz
kutter-8f331f08d262cdc9e641d333e17098a94cf13fd5.tar.xz
kutter-8f331f08d262cdc9e641d333e17098a94cf13fd5.zip
extruder: Determine start step offset using last commanded position
The existing code calculates the number of steps in a move and then spreads them out evenly throughout that move. Change the code so that step timing is based on where the head is commanded to be relative to the stepper step locations. This makes the timing more accurate - in particular the stepper velocities will be more accurate during cornering introduced by the lookahead code. It also results in slightly smoother stepper motion which results in better step compression. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/extruder.py26
1 files changed, 16 insertions, 10 deletions
diff --git a/klippy/extruder.py b/klippy/extruder.py
index 181fd57c..198a89ed 100644
--- a/klippy/extruder.py
+++ b/klippy/extruder.py
@@ -73,20 +73,23 @@ class PrinterExtruder:
# Determine regular steps
extrude_r = move.axes_d[3] / move_d
forward_d = accel_d + cruise_d + decel_d
- self.extrude_pos += forward_d * extrude_r
- new_step_pos = int(self.extrude_pos*self.stepper.inv_step_dist + 0.5)
- steps = new_step_pos - self.stepper_pos
- if steps:
+ start_pos = self.extrude_pos
+ end_pos = start_pos + forward_d * extrude_r
+ inv_step_dist = self.stepper.inv_step_dist
+ new_step_pos = int(end_pos*inv_step_dist + 0.5)
+ if new_step_pos != self.stepper_pos:
+ steps = forward_d * extrude_r * inv_step_dist
+ step_offset = self.stepper_pos - start_pos * inv_step_dist + 0.5
self.stepper_pos = new_step_pos
sdir = 0
if steps < 0:
sdir = 1
steps = -steps
+ step_offset = 1. - step_offset
mcu_time, so = self.stepper.prep_move(move_time, sdir)
move_step_d = forward_d / steps
inv_move_step_d = 1. / move_step_d
- step_offset = 0.5
# Acceleration steps
#t = sqrt(2*pos/accel + (start_v/accel)**2) - start_v/accel
@@ -115,10 +118,12 @@ class PrinterExtruder:
, decel_sqrt_offset, -accel_multiplier)
# Determine retract steps
- self.extrude_pos -= retract_d * extrude_r
- new_step_pos = int(self.extrude_pos*self.stepper.inv_step_dist + 0.5)
- steps = self.stepper_pos - new_step_pos
- if steps:
+ start_pos = end_pos
+ end_pos -= retract_d * extrude_r
+ new_step_pos = int(end_pos*inv_step_dist + 0.5)
+ if new_step_pos != self.stepper_pos:
+ steps = retract_d * extrude_r * inv_step_dist
+ step_offset = start_pos * inv_step_dist - self.stepper_pos + 0.5
self.stepper_pos = new_step_pos
mcu_time, so = self.stepper.prep_move(
move_time+accel_t+cruise_t+decel_t, 1)
@@ -130,5 +135,6 @@ class PrinterExtruder:
accel_time_offset = retract_v * inv_accel
accel_sqrt_offset = accel_time_offset**2
accel_multiplier = 2.0 * move_step_d * inv_accel
- so.step_sqrt(mcu_time - accel_time_offset, steps, 0.5
+ so.step_sqrt(mcu_time - accel_time_offset, steps, step_offset
, accel_sqrt_offset, accel_multiplier)
+ self.extrude_pos = end_pos