diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 7bb078be16..acd576c9b3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2542,6 +2542,8 @@ bool Planner::_populate_block( xyze_float_t junction_unit_vec = unit_vec - prev_unit_vec; normalize_junction_vector(junction_unit_vec); + // TODO: Don't limit acceleration on axes with very small distance relative to others + // See https://github.com/MarlinFirmware/Marlin/issues/27918#issuecomment-3145339116 const float junction_acceleration = limit_value_by_axis_maximum(block->acceleration, junction_unit_vec); if (TERN0(HINTS_CURVE_RADIUS, hints.curve_radius)) { diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index d8d0e053e7..891357dbe3 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -1157,12 +1157,14 @@ class Planner { vector *= RSQRT(magnitude_sq); } + // max_value is block->acceleration FORCE_INLINE static float limit_value_by_axis_maximum(const float max_value, xyze_float_t &unit_vec) { float limit_value = max_value; LOOP_LOGICAL_AXES(idx) { if (unit_vec[idx]) { - if (limit_value * ABS(unit_vec[idx]) > settings.max_acceleration_mm_per_s2[idx]) - limit_value = ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx]); + const uint32_t abs_vec = ABS(unit_vec[idx]); + if (limit_value * abs_vec > settings.max_acceleration_mm_per_s2[idx]) + limit_value = settings.max_acceleration_mm_per_s2[idx] / abs_vec; } } return limit_value; diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index ca6f027ade..8b3a60e048 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -253,7 +253,7 @@ uint32_t Stepper::advance_divisor = 0, #endif /** - * Standard Motion Non-linear Exttrusion state + * Standard Motion Non-linear Extrusion state */ #if ENABLED(NONLINEAR_EXTRUSION) nonlinear_t Stepper::ne; // Initialized by settings.load