look-ahead: take F_start into account on acceleration calculations.

This commit is contained in:
Markus Hitter 2013-10-27 10:19:49 +01:00
parent c1a6c244b3
commit 83433cb071
3 changed files with 16 additions and 8 deletions

19
dda.c
View File

@ -96,12 +96,13 @@ void dda_create(DDA *dda, TARGET *target, DDA *prev_dda) {
memcpy(&(dda->endpoint), target, sizeof(TARGET));
#ifdef LOOKAHEAD
// Set the start and stop speeds to zero for now = full stops between
// moves. Also fallback if lookahead calculations fail to finish in time.
dda->F_start = 0;
dda->F_end = 0;
// Give this move an identifier.
dda->id = idcnt++;
// Set the start and stop speeds to zero for now = full stops between
// moves. Also fallback if lookahead calculations fail to finish in time.
dda->F_start = 0;
dda->start_steps = 0;
dda->F_end = 0;
// Give this move an identifier.
dda->id = idcnt++;
#endif
// TODO TODO: We should really make up a loop for all axes.
@ -787,7 +788,11 @@ void dda_clock() {
recalc_speed = 0;
if (move_step_no < dda->rampup_steps) {
dda->n = move_step_no;
#ifdef LOOKAHEAD
dda->n = dda->start_steps + move_step_no;
#else
dda->n = move_step_no;
#endif
recalc_speed = 1;
}
else if (move_step_no >= dda->rampdown_steps) {

1
dda.h
View File

@ -147,6 +147,7 @@ typedef struct {
// movement between G1 moves. These variables keep track of the entry and
// exit speeds between moves.
uint32_t F_start;
uint32_t start_steps; ///< steps to reach F_start
uint32_t F_end;
// Displacement vector, in um, based between the difference of the starting
// point and the target. Required to obtain the jerk between 2 moves.

View File

@ -177,7 +177,7 @@ void dda_join_moves(DDA *prev, DDA *current) {
// until then, we do not want to touch the current move settings.
// Note: we assume 'current' will not be dispatched while this function runs, so we do not to
// back up the move settings: they will remain constant.
uint32_t this_F_start, this_rampup, this_rampdown;
uint32_t this_F_start, this_start, this_rampup, this_rampdown;
int32_t jerk, jerk_e; // Expresses the forces if we would change directions at full speed
static uint32_t la_cnt = 0; // Counter: how many moves did we join?
#ifdef LOOKAHEAD_DEBUG
@ -400,6 +400,7 @@ void dda_join_moves(DDA *prev, DDA *current) {
this_rampup = up;
this_rampdown = current->total_steps - down;
this_F_start = crossF;
this_start = ACCELERATE_RAMP_LEN(this_F_start);
serprintf(PSTR("Actual crossing speed: %lu\r\n"), crossF);
// Potential reverse processing:
@ -468,6 +469,7 @@ void dda_join_moves(DDA *prev, DDA *current) {
current->rampdown_steps = this_rampdown;
current->F_end = 0;
current->F_start = this_F_start;
current->start_steps = this_start;
la_cnt++;
} else
timeout = 1;