Updated some comments and fixed a bug in the new stepper logic.

- The stepper logic was not initiating the decelerations for certain
cases. Just re-arranged the logic to fix it.
This commit is contained in:
Sonny Jeon 2011-09-25 19:24:29 -06:00
parent 2be0d66872
commit 05ed6c122d

View File

@ -71,8 +71,8 @@ static uint32_t trapezoid_adjusted_rate; // The current rate of step_events
// The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates by block->rate_delta
// during the first block->accelerate_until step_events_completed, then keeps going at constant speed until
// step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset.
// The slope of acceleration is always +/- block->rate_delta and is applied at a constant rate by trapezoid_generator_tick()
// that is called ACCELERATION_TICKS_PER_SECOND times per second.
// The slope of acceleration is always +/- block->rate_delta and is applied at a constant rate following the midpoint rule
// by the trapezoid generator, which is called ACCELERATION_TICKS_PER_SECOND times per second.
static void set_step_events_per_minute(uint32_t steps_per_minute);
@ -172,11 +172,9 @@ SIGNAL(TIMER1_COMPA_vect)
// While in block steps, check for de/ac-celeration events and execute them accordingly.
if (step_events_completed < current_block->step_event_count) {
// Always check step event location to ensure de/ac-celerations are executed and terminated at
// exactly the right time. This helps prevent over/under-shooting the target position and speed.
// Trapezoid de/ac-celeration is approximated by discrete increases or decreases in velocity,
// defined by ACCELERATION_TICKS_PER_SECOND and block->rate_delta. The accelerations employ the
// midpoint rule to obtain an accurate representation of the exact acceleration curve.
// The trapezoid generator always checks step event location to ensure de/ac-celerations are
// executed and terminated at exactly the right time. This helps prevent over/under-shooting
// the target position and speed.
// NOTE: By increasing the ACCELERATION_TICKS_PER_SECOND in config.h, the resolution of the
// discrete velocity changes increase and accuracy can increase as well to a point. Numerical
@ -193,32 +191,33 @@ SIGNAL(TIMER1_COMPA_vect)
}
set_step_events_per_minute(trapezoid_adjusted_rate);
}
} else if (step_events_completed > current_block->decelerate_after) {
// Iterate cycle counter and check if speeds need to be reduced.
if ( iterate_trapezoid_cycle_counter() ) {
// NOTE: We will only reduce speed if the result will be > 0. This catches small
// rounding errors that might leave steps hanging after the last trapezoid tick.
if (trapezoid_adjusted_rate > current_block->rate_delta) {
trapezoid_adjusted_rate -= current_block->rate_delta;
} else if (step_events_completed >= current_block->decelerate_after) {
// Reset trapezoid tick cycle counter to make sure that the deceleration is performed the
// same every time. Reset to CYCLES_PER_ACCELERATION_TICK/2 to follow the midpoint rule for
// an accurate approximation of the deceleration curve.
if (step_events_completed == current_block-> decelerate_after) {
trapezoid_tick_cycle_counter = CYCLES_PER_ACCELERATION_TICK/2;
} else {
// Iterate cycle counter and check if speeds need to be reduced.
if ( iterate_trapezoid_cycle_counter() ) {
// NOTE: We will only reduce speed if the result will be > 0. This catches small
// rounding errors that might leave steps hanging after the last trapezoid tick.
if (trapezoid_adjusted_rate > current_block->rate_delta) {
trapezoid_adjusted_rate -= current_block->rate_delta;
}
if (trapezoid_adjusted_rate < current_block->final_rate) {
// Reached final rate a little early. Cruise to end of block at final rate.
trapezoid_adjusted_rate = current_block->final_rate;
}
set_step_events_per_minute(trapezoid_adjusted_rate);
}
if (trapezoid_adjusted_rate < current_block->final_rate) {
// Reached final rate a little early. Cruise to end of block at final rate.
trapezoid_adjusted_rate = current_block->final_rate;
}
set_step_events_per_minute(trapezoid_adjusted_rate);
}
} else {
// No accelerations. Make sure we cruise exactly at nominal rate.
// No accelerations. Make sure we cruise exactly at the nominal rate.
if (trapezoid_adjusted_rate != current_block->nominal_rate) {
trapezoid_adjusted_rate = current_block->nominal_rate;
set_step_events_per_minute(trapezoid_adjusted_rate);
}
// Check to reset trapezoid tick cycle counter to make sure that the deceleration is
// performed the same every time. Reset to CYCLES_PER_ACCELERATION_TICK/2 to follow the
// midpoint rule for an accurate approximation of the deceleration curve.
if (step_events_completed >= current_block-> decelerate_after) {
trapezoid_tick_cycle_counter = CYCLES_PER_ACCELERATION_TICK/2;
}
}
} else {