Avoid cumulative error in segments without cruising
When calculating the compression steps, compute the actual target speed of the trapezoid, since up to e_steps (+/- 1 normally) can be accumulated in excess for each acceleration phase. This is not for production: a lot of calculations are redundand and could work directly in steps/s^2.
This commit is contained in:
parent
750af103ff
commit
d082f5d9a7
|
|
@ -226,11 +226,14 @@ void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit
|
||||||
// Size of Plateau of Nominal Rate.
|
// Size of Plateau of Nominal Rate.
|
||||||
uint32_t plateau_steps = 0;
|
uint32_t plateau_steps = 0;
|
||||||
|
|
||||||
|
float max_speed;
|
||||||
|
|
||||||
// Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will
|
// Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will
|
||||||
// have to use intersection_distance() to calculate when to abort acceleration and start braking
|
// have to use intersection_distance() to calculate when to abort acceleration and start braking
|
||||||
// in order to reach the final_rate exactly at the end of this block.
|
// in order to reach the final_rate exactly at the end of this block.
|
||||||
if (accel_decel_steps < block->step_event_count.wide) {
|
if (accel_decel_steps < block->step_event_count.wide) {
|
||||||
plateau_steps = block->step_event_count.wide - accel_decel_steps;
|
plateau_steps = block->step_event_count.wide - accel_decel_steps;
|
||||||
|
max_speed = block->nominal_speed;
|
||||||
} else {
|
} else {
|
||||||
uint32_t acceleration_x4 = acceleration << 2;
|
uint32_t acceleration_x4 = acceleration << 2;
|
||||||
// Avoid negative numbers
|
// Avoid negative numbers
|
||||||
|
|
@ -263,12 +266,18 @@ void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit
|
||||||
decelerate_steps = block->step_event_count.wide;
|
decelerate_steps = block->step_event_count.wide;
|
||||||
accelerate_steps = block->step_event_count.wide - decelerate_steps;
|
accelerate_steps = block->step_event_count.wide - decelerate_steps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: not for production
|
||||||
|
float dist = intersection_distance(entry_speed, exit_speed, block->acceleration, block->millimeters);
|
||||||
|
max_speed = sqrt(2 * block->acceleration * dist + entry_speed*entry_speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LIN_ADVANCE
|
#ifdef LIN_ADVANCE
|
||||||
uint16_t final_adv_steps = 0;
|
uint16_t final_adv_steps = 0;
|
||||||
|
uint16_t max_adv_steps = 0;
|
||||||
if (block->use_advance_lead) {
|
if (block->use_advance_lead) {
|
||||||
final_adv_steps = exit_speed * block->adv_comp;
|
final_adv_steps = exit_speed * block->adv_comp;
|
||||||
|
max_adv_steps = max_speed * block->adv_comp;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -284,6 +293,7 @@ void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit
|
||||||
block->final_rate = final_rate;
|
block->final_rate = final_rate;
|
||||||
#ifdef LIN_ADVANCE
|
#ifdef LIN_ADVANCE
|
||||||
block->final_adv_steps = final_adv_steps;
|
block->final_adv_steps = final_adv_steps;
|
||||||
|
block->max_adv_steps = max_adv_steps;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
CRITICAL_SECTION_END;
|
CRITICAL_SECTION_END;
|
||||||
|
|
@ -1169,13 +1179,13 @@ Having the real displacement of the head, we can calculate the total movement le
|
||||||
block->advance_step_loops = 1;
|
block->advance_step_loops = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LA_DEBUG
|
#if 1
|
||||||
if (block->advance_step_loops > 2)
|
if (block->advance_step_loops != 1)
|
||||||
// @wavexx: we should really check for the difference between step_loops and
|
// @wavexx: we should really check for the difference between step_loops and
|
||||||
// advance_step_loops instead. A difference of more than 1 will lead
|
// advance_step_loops instead. A difference of more than 1 will lead
|
||||||
// to uneven speed and *should* be adjusted here by furthermore
|
// to uneven speed and *should* be adjusted here by furthermore
|
||||||
// reducing the speed.
|
// reducing the speed.
|
||||||
SERIAL_ECHOLNPGM("LA: More than 2 steps per eISR loop executed.");
|
SERIAL_ECHOLNPGM("LA: More than 1 steps per eISR loop executed.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue