mirror of
https://github.com/grblHAL/core.git
synced 2026-09-26 18:17:54 +08:00
improved deceleration ramp behaviour - cleaned up code a bit
Thanks to @Engigneer, @fpq473 for helping figuring this out!
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user