Fix mixing extruder feedrate (#15905)

2.0.x
Scott Lahteine 5 years ago committed by GitHub
parent 12417d087b
commit 077eeaa0f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1999,7 +1999,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT();
#endif #endif
block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0 block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0
block->nominal_rate = CEIL(block->step_event_count * inverse_secs); // (step/sec) Always > 0 block->nominal_rate = CEIL(block->step_event_count * inverse_secs); // (step/sec) Always > 0
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
@ -2007,28 +2007,38 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
filwidth.advance_e(delta_mm.e); filwidth.advance_e(delta_mm.e);
#endif #endif
// Calculate and limit speed in mm/sec for each axis // Calculate and limit speed in mm/sec
xyze_float_t current_speed; xyze_float_t current_speed;
float speed_factor = 1.0f; // factor <1 decreases speed float speed_factor = 1.0f; // factor <1 decreases speed
LOOP_XYZE(i) {
#if BOTH(MIXING_EXTRUDER, RETRACT_SYNC_MIXING) // Linear axes first with less logic
// In worst case, only one extruder running, no change is needed. LOOP_XYZ(i) {
// In best case, all extruders run the same amount, we can divide by MIXING_STEPPERS current_speed[i] = delta_mm[i] * inverse_secs;
float delta_mm_i = 0; const feedRate_t cs = ABS(current_speed[i]),
if (i == E_AXIS && mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL) max_fr = settings.max_feedrate_mm_s[i];
delta_mm_i = delta_mm.e / MIXING_STEPPERS; if (cs > max_fr) NOMORE(speed_factor, max_fr / cs);
else
delta_mm_i = delta_mm.e;
#else
const float delta_mm_i = delta_mm[i];
#endif
const feedRate_t cs = ABS(current_speed[i] = delta_mm_i * inverse_secs);
#if ENABLED(DISTINCT_E_FACTORS)
if (i == E_AXIS) i += extruder;
#endif
if (cs > settings.max_feedrate_mm_s[i]) NOMORE(speed_factor, settings.max_feedrate_mm_s[i] / cs);
} }
// Limit speed on extruders, if any
#if EXTRUDERS
{
current_speed.e = delta_mm.e * inverse_secs;
#if BOTH(MIXING_EXTRUDER, RETRACT_SYNC_MIXING)
// Move all mixing extruders at the specified rate
if (mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL)
current_speed.e *= MIXING_STEPPERS;
#endif
const feedRate_t cs = ABS(current_speed.e),
max_fr = (settings.max_feedrate_mm_s[E_AXIS_N(extruder)]
#if BOTH(MIXING_EXTRUDER, RETRACT_SYNC_MIXING)
* MIXING_STEPPERS
#endif
);
if (cs > max_fr) NOMORE(speed_factor, max_fr / cs);
}
#endif
// Max segment time in µs. // Max segment time in µs.
#ifdef XY_FREQUENCY_LIMIT #ifdef XY_FREQUENCY_LIMIT

Loading…
Cancel
Save