Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Marlin/Configuration_adv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1230,6 +1230,10 @@
#define FTM_POLY6_ACCELERATION_OVERSHOOT 1.875f // Max acceleration overshoot factor for POLY6 (1.25 to 1.875)
#endif

#define FTM_MINIMUM_CRUISE_RATIO 0.5f // Minimum fraction of distance to spend at cruising speed (0.0f disables)
// Reduces vibrations and extrusion artefacts in short blocks like small surface
// features and thin solid infills

/**
* Advanced configuration
*/
Expand Down
16 changes: 15 additions & 1 deletion Marlin/src/module/ft_motion/trajectory_trapezoidal.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#include "trajectory_generator.h"
#include <math.h>

#ifndef FTM_MINIMUM_CRUISE_RATIO
#define FTM_MINIMUM_CRUISE_RATIO 0
#endif

/**
* Trapezoidal trajectory generator.
* Provides continuous velocity, but acceleration is discontinuous.
Expand All @@ -41,10 +45,20 @@ class TrapezoidalTrajectoryGenerator : public TrajectoryGenerator {
const float distance = distance_in;
const float final_speed = final_speed_in; // just for consistency


const float one_over_accel = 1.0f / acceleration;
const float ldiff = distance + 0.5f * one_over_accel * (sq(initial_speed) + sq(final_speed));

if (FTM_MINIMUM_CRUISE_RATIO > 0) {
const float min_cruise_dist = distance * FTM_MINIMUM_CRUISE_RATIO;
const float max_nominal_from_ratio = (distance - min_cruise_dist) * acceleration
+ 0.5f * (sq(initial_speed) + sq(final_speed));
float ratio_limited_speed = SQRT(max_nominal_from_ratio);
// Don’t allow it to go below endpoints (otherwise T1/T3 go negative)
const float v_floor = _MAX(initial_speed, final_speed);
NOLESS(ratio_limited_speed, v_floor);
NOMORE(nominal_speed, ratio_limited_speed);
}

T2 = ldiff / nominal_speed - one_over_accel * nominal_speed;
if (T2 < 0.0f) {
T2 = 0.0f;
Expand Down