|
@@ -1061,14 +1061,12 @@ Having the real displacement of the head, we can calculate the total movement le
|
|
|
|
|
|
* Use LIN_ADVANCE within this block if all these are true:
|
|
|
*
|
|
|
- * block->steps_e : This is a print move, because we checked for X, Y, Z steps before.
|
|
|
* extruder_advance_K : There is an advance factor set.
|
|
|
- * delta_mm[E_AXIS] > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves)
|
|
|
+ * delta_mm[E_AXIS] >= 0 : Extruding or traveling, but _not_ retracting.
|
|
|
* |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
|
|
|
*/
|
|
|
- block->use_advance_lead = block->steps_e.wide
|
|
|
- && extruder_advance_K
|
|
|
- && delta_mm[E_AXIS] > 0
|
|
|
+ block->use_advance_lead = extruder_advance_K
|
|
|
+ && delta_mm[E_AXIS] >= 0
|
|
|
&& abs(delta_mm[Z_AXIS]) < 0.5;
|
|
|
if (block->use_advance_lead) {
|
|
|
e_D_ratio = (e - position_float[E_AXIS]) /
|
|
@@ -1082,7 +1080,7 @@ Having the real displacement of the head, we can calculate the total movement le
|
|
|
|
|
|
if (e_D_ratio > 3.0)
|
|
|
block->use_advance_lead = false;
|
|
|
- else {
|
|
|
+ else if (e_D_ratio > 0) {
|
|
|
const uint32_t max_accel_steps_per_s2 = cs.max_jerk[E_AXIS] / (extruder_advance_K * e_D_ratio) * steps_per_mm;
|
|
|
if (block->acceleration_st > max_accel_steps_per_s2) {
|
|
|
block->acceleration_st = max_accel_steps_per_s2;
|
|
@@ -1133,9 +1131,14 @@ Having the real displacement of the head, we can calculate the total movement le
|
|
|
block->adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_unit[E_AXIS];
|
|
|
block->max_adv_steps = block->nominal_speed * block->adv_comp;
|
|
|
|
|
|
+ float advance_speed;
|
|
|
+ if (e_D_ratio > 0)
|
|
|
+ advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_unit[E_AXIS]);
|
|
|
+ else
|
|
|
+ advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_unit[E_AXIS];
|
|
|
+
|
|
|
|
|
|
|
|
|
- float advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_unit[E_AXIS]);
|
|
|
if (advance_speed > MAX_STEP_FREQUENCY) advance_speed = MAX_STEP_FREQUENCY;
|
|
|
float advance_rate = (F_CPU / 8.0) / advance_speed;
|
|
|
if (advance_speed > 20000) {
|