Improved fix for rare lowering feed/rapid override bug.
[fix] In the previous hot fix, there was still (rarer) potential for very small floating point errors incorrectly handle an override deceleration and crash Grbl. Re-factored the if-then statement in terms of speed changes, rather than distance, to completely eliminate the issue.
This commit is contained in:
parent
477a94cd49
commit
5967839ab3
3 changed files with 13 additions and 6 deletions
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
// Grbl versioning system
|
||||
#define GRBL_VERSION "1.1f"
|
||||
#define GRBL_VERSION_BUILD "20170731"
|
||||
#define GRBL_VERSION_BUILD "20170801"
|
||||
|
||||
// Define standard libraries used by Grbl.
|
||||
#include <avr/io.h>
|
||||
|
|
|
|||
|
|
@ -734,7 +734,7 @@ void st_prep_buffer()
|
|||
|
||||
} else {
|
||||
// Decelerate to cruise or cruise-decelerate types. Guaranteed to intersect updated plan.
|
||||
prep.decelerate_after = inv_2_accel*(nominal_speed_sqr-exit_speed_sqr);
|
||||
prep.decelerate_after = inv_2_accel*(nominal_speed_sqr-exit_speed_sqr); // Should always be >= 0.0 due to planner reinit.
|
||||
prep.maximum_speed = nominal_speed;
|
||||
prep.ramp_type = RAMP_DECEL_OVERRIDE;
|
||||
}
|
||||
|
|
@ -806,15 +806,14 @@ void st_prep_buffer()
|
|||
switch (prep.ramp_type) {
|
||||
case RAMP_DECEL_OVERRIDE:
|
||||
speed_var = pl_block->acceleration*time_var;
|
||||
mm_var = time_var*(prep.current_speed - 0.5*speed_var);
|
||||
mm_remaining -= mm_var;
|
||||
if ((mm_remaining <= prep.accelerate_until) || (mm_var <= 0.0)) {
|
||||
if (prep.current_speed-prep.maximum_speed <= speed_var) {
|
||||
// Cruise or cruise-deceleration types only for deceleration override.
|
||||
mm_remaining = prep.accelerate_until; // NOTE: 0.0 at EOB
|
||||
mm_remaining = prep.accelerate_until;
|
||||
time_var = 2.0*(pl_block->millimeters-mm_remaining)/(prep.current_speed+prep.maximum_speed);
|
||||
prep.ramp_type = RAMP_CRUISE;
|
||||
prep.current_speed = prep.maximum_speed;
|
||||
} else { // Mid-deceleration override ramp.
|
||||
mm_remaining -= time_var*(prep.current_speed - 0.5*speed_var);
|
||||
prep.current_speed -= speed_var;
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue