aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extruder.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-11-04 21:11:14 -0400
committerKevin O'Connor <kevin@koconnor.net>2016-11-05 11:06:58 -0400
commit93dd310add46272f02b18ddd7f9b2f553d6e7ee0 (patch)
tree695aed3c7321680b6c47d399fd924114c8f4f9ac /klippy/extruder.py
parenta201385008de76c5e52ec40fc63e6b292863e71c (diff)
downloadkutter-93dd310add46272f02b18ddd7f9b2f553d6e7ee0.tar.gz
kutter-93dd310add46272f02b18ddd7f9b2f553d6e7ee0.tar.xz
kutter-93dd310add46272f02b18ddd7f9b2f553d6e7ee0.zip
extruder: Don't assume start_v matches last end_v in pressure advance
Due to minor differences in the extrude ratio, the last end velocity of the filament may not exactly match the next move's start velocity of the filament. Implement more precise calculations for pressure advance to take this into account. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/extruder.py')
-rw-r--r--klippy/extruder.py53
1 files changed, 30 insertions, 23 deletions
diff --git a/klippy/extruder.py b/klippy/extruder.py
index ad439421..4abbb7dd 100644
--- a/klippy/extruder.py
+++ b/klippy/extruder.py
@@ -44,38 +44,45 @@ class PrinterExtruder:
decel_v = cruise_v
# Update for pressure advance
+ start_pos = self.extrude_pos
if (axis_d >= 0. and (move.axes_d[0] or move.axes_d[1])
and self.pressure_advance):
# Increase accel_d and start_v when accelerating
- extra_accel_d = (cruise_v - start_v) * self.pressure_advance
- accel_d += extra_accel_d
+ move_extrude_r = move.extrude_r
+ prev_pressure_d = start_pos - move.start_pos[3]
if accel_t:
- start_v += extra_accel_d / accel_t
+ npd = move.cruise_v * move_extrude_r * self.pressure_advance
+ extra_accel_d = npd - prev_pressure_d
+ if extra_accel_d > 0.:
+ accel_d += extra_accel_d
+ start_v += extra_accel_d / accel_t
+ prev_pressure_d += extra_accel_d
# Update decel and retract parameters when decelerating
if decel_t:
- extra_decel_d = (cruise_v - end_v) * self.pressure_advance
- extra_decel_v = extra_decel_d / decel_t
- decel_v -= extra_decel_v
- end_v -= extra_decel_v
- if decel_v <= 0.:
- # The entire decel phase is replaced with retraction
- retract_t = decel_t
- retract_d = -(end_v + decel_v) * 0.5 * decel_t
- retract_v = -decel_v
- decel_t = decel_d = 0.
- elif end_v < 0.:
- # Split decel phase into decel and retraction
- retract_t = -end_v * inv_accel
- retract_d = -end_v * 0.5 * retract_t
- decel_t -= retract_t
- decel_d = decel_v * 0.5 * decel_t
- else:
- # There is still only a decel phase (no retraction)
- decel_d -= extra_decel_d
+ npd = move.end_v * move_extrude_r * self.pressure_advance
+ extra_decel_d = prev_pressure_d - npd
+ if extra_decel_d > 0.:
+ extra_decel_v = extra_decel_d / decel_t
+ decel_v -= extra_decel_v
+ end_v -= extra_decel_v
+ if decel_v <= 0.:
+ # The entire decel phase is replaced with retraction
+ retract_t = decel_t
+ retract_d = -(end_v + decel_v) * 0.5 * decel_t
+ retract_v = -decel_v
+ decel_t = decel_d = 0.
+ elif end_v < 0.:
+ # Split decel phase into decel and retraction
+ retract_t = -end_v * inv_accel
+ retract_d = -end_v * 0.5 * retract_t
+ decel_t -= retract_t
+ decel_d = decel_v * 0.5 * decel_t
+ else:
+ # There is still only a decel phase (no retraction)
+ decel_d -= extra_decel_d
# Determine regular steps
forward_d = accel_d + cruise_d + decel_d
- start_pos = self.extrude_pos
end_pos = start_pos + forward_d
inv_step_dist = self.stepper.inv_step_dist
new_step_pos = int(end_pos*inv_step_dist + 0.5)