improved deceleration ramp behaviour - cleaned up code a bit

Thanks to @Engigneer, @fpq473 for helping figuring this out!
This commit is contained in:
Dietz0r
2025-01-08 09:06:00 +01:00
committed by GitHub
parent 5312946d7c
commit ae70c6cbe3
+7 -7
View File
@@ -877,7 +877,7 @@ void st_prep_buffer (void)
float minimum_mm = mm_remaining - prep.req_mm_increment; // Guarantee at least one step.
#if ENABLE_ACCELERATION_PROFILES
float time_to_jerk; // time needed for jerk ramp
float mm_to_rampend; // mm needed to complete one jerk ramp mm == V(0)*T + 1/2 A0*T^2 + 1/6 J*T^3
float jerk_rampdown; // calculated startpoint of jerk rampdown
#endif
if (minimum_mm < 0.0f)
@@ -905,10 +905,10 @@ void st_prep_buffer (void)
// NOTE: Acceleration ramp only computes during first do-while loop.
#if ENABLE_JERK_ACCELERATION
time_to_jerk = last_segment_accel / pl_block->jerk;
mm_to_rampend = (prep.current_speed * time_to_jerk) + (0.5f * last_segment_accel * time_to_jerk * time_to_jerk) + (pl_block->jerk * time_to_jerk * time_to_jerk * time_to_jerk) / 6.0f; //Distance to 0 acceleration at speed
if ((mm_remaining - prep.accelerate_until) > mm_to_rampend) {
jerk_rampdown =time_to_jerk * (prep.current_speed + (0.5f * last_segment_accel * time_to_jerk) + (pl_block->jerk * time_to_jerk * time_to_jerk) / 6.0f); //Distance to 0 acceleration at speed (mm == V(0)*T + 1/2 A0*T^2 + 1/6 J*T^3)
if ((mm_remaining - prep.accelerate_until) > jerk_rampdown) {
//+1.0f to avoid divide by 0 speed, minor effect on jerk ramp
// Check if we are on ramp up or ramp down. Ramp down if time to end of acceleration is less than time needed to reach 0 acceleration.
// Check if we are on ramp up or ramp down. Ramp down if distance to end of acceleration is less than distance needed to reach 0 acceleration.
// Then limit acceleration change by jerk up to max acceleration and update for next segment.
// Minimum acceleration jerk per time_var to ensure acceleration completes. Acceleration change at end of ramp is in acceptable jerk range.
last_segment_accel = min(last_segment_accel + pl_block->jerk * time_var, pl_block->max_acceleration);
@@ -951,9 +951,9 @@ void st_prep_buffer (void)
// NOTE: mm_var used as a misc worker variable to prevent errors when near zero speed.
#if ENABLE_JERK_ACCELERATION
time_to_jerk = last_segment_accel / pl_block->jerk;
mm_to_rampend = (0.5f * last_segment_accel * time_to_jerk * time_to_jerk) + (pl_block->jerk * time_to_jerk * time_to_jerk * time_to_jerk) / 6.0f; // Distance to 0 acceleration
if (mm_remaining > mm_to_rampend) {
// Check if we are on ramp up or ramp down. Ramp down if travel distance to end of deceleration is less than distance needed to reach 0 acceleration.
jerk_rampdown = prep.exit_speed + time_to_jerk * (last_segment_accel - (0.5f * pl_block->jerk * time_to_jerk)); // Speedpoint to start ramping down deceleration. (V = a * t - 1/2 j * t^2)
if (prep.current_speed > jerk_rampdown) {
// Check if we are on ramp up or ramp down. Ramp down if speed is less than speed needed for reaching 0 acceleration.
// Then limit acceleration change by jerk up to max acceleration and update for next segment.
// Minimum acceleration of jerk per time_var to ensure deceleration completes. Acceleration change at end of ramp is in acceptable jerk range.
last_segment_accel = min(last_segment_accel + pl_block->jerk * time_var, pl_block->max_acceleration);