From c6494e9010857faee96f798e7d7fd197169a6563 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Fri, 26 Dec 2025 21:26:30 +0200 Subject: [PATCH] Add NLE support to FTM --- Marlin/src/inc/SanityCheck.h | 4 +--- Marlin/src/inc/Warnings.cpp | 3 --- Marlin/src/module/ft_motion.cpp | 27 ++++++++++++++++++++------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5856723c77..148f1f8292 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -4495,9 +4495,7 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #error "EMERGENCY_PARSER is required with FTM_RESONANCE_TEST (to cancel the test)." #endif #if !HAS_STANDARD_MOTION - #if ENABLED(NONLINEAR_EXTRUSION) - #error "NONLINEAR_EXTRUSION is not yet available in FT_MOTION. Disable NO_STANDARD_MOTION if you require it." - #elif ENABLED(SMOOTH_LIN_ADVANCE) + #if ENABLED(SMOOTH_LIN_ADVANCE) #error "SMOOTH_LIN_ADVANCE is not yet available in FT_MOTION. Disable NO_STANDARD_MOTION if you require it." #elif ENABLED(MIXING_EXTRUDER) #error "MIXING_EXTRUDER is not yet available in FT_MOTION. Disable NO_STANDARD_MOTION if you require it." diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 9c4eabaf6e..09266b90b7 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -941,9 +941,6 @@ #if ENABLED(I2S_STEPPER_STREAM) #warning "FT_MOTION has not been tested with I2S_STEPPER_STREAM." #endif - #if ENABLED(NONLINEAR_EXTRUSION) - #warning "NONLINEAR_EXTRUSION does not (currently) operate when FT_MOTION is the active motion system." - #endif #if ENABLED(LIN_ADVANCE) #warning "Be aware that FT_MOTION K factor is now set with M900 K (same as LIN_ADVANCE)." #if DISABLED(FTM_SMOOTHING) diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp index f6113c398e..7cf5b5ac7f 100644 --- a/Marlin/src/module/ft_motion.cpp +++ b/Marlin/src/module/ft_motion.cpp @@ -467,13 +467,26 @@ xyze_float_t FTMotion::calc_traj_point(const float dist) { #if FTM_HAS_LIN_ADVANCE const float advK = planner.get_advance_k(); - if (advK) { - const float traj_e = traj_coords.e; - if (use_advance_lead) { - // Don't apply LA to retract/unretract blocks - const float e_rate = (traj_e - prev_traj_e) * (FTM_FS); - traj_coords.e += e_rate * advK; - } + // Apply LA/NLE only to printing (not retract/unretract) blocks + if (use_advance_lead && (advK TERN(NONLINEAR_EXTRUSION, || stepper.ne.settings.enabled,))) { + TERN(NONLINEAR_EXTRUSION,, const) float traj_e = traj_coords.e; + const float traj_e_delta = traj_e - prev_traj_e; // extruder delta in mm + const float e_rate = traj_e_delta * FTM_FS; // extruder velocity in mm/s + + traj_coords.e += e_rate * advK; + + #if ENABLED(NONLINEAR_EXTRUSION) + if (stepper.ne.settings.enabled) { + const float multiplier = max(stepper.ne.settings.coeff.C, stepper.ne.settings.coeff.A * sq(e_rate) + stepper.ne.settings.coeff.B * e_rate + stepper.ne.settings.coeff.C); + const float nle_term = traj_e_delta * (multiplier - 1); + + traj_coords.e += nle_term; + traj_e += nle_term; + startPos.e += nle_term; + endPos_prevBlock.e += nle_term; + } + #endif + prev_traj_e = traj_e; } #endif