From ae70c6cbe3111df9a685e052320a3eb99cf97932 Mon Sep 17 00:00:00 2001 From: Dietz0r <102995203+Dietz0r@users.noreply.github.com> Date: Wed, 8 Jan 2025 09:06:00 +0100 Subject: [PATCH] improved deceleration ramp behaviour - cleaned up code a bit Thanks to @Engigneer, @fpq473 for helping figuring this out! --- stepper.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stepper.c b/stepper.c index bddb345..ffe04f4 100644 --- a/stepper.c +++ b/stepper.c @@ -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);