Merge branch 'master' of github.com:triffid/FiveD_on_Arduino
This commit is contained in:
commit
bbf74cc660
33
dda.c
33
dda.c
|
|
@ -106,7 +106,7 @@ const uint8_t msbloc (uint32_t v) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void dda_create(DDA *dda, TARGET *target) {
|
void dda_create(DDA *dda, TARGET *target) {
|
||||||
uint32_t distance;
|
uint32_t distance, c_limit, c_limit_calc;
|
||||||
|
|
||||||
// initialise DDA to a known state
|
// initialise DDA to a known state
|
||||||
dda->allflags = 0;
|
dda->allflags = 0;
|
||||||
|
|
@ -199,16 +199,37 @@ void dda_create(DDA *dda, TARGET *target) {
|
||||||
// distance * 2400 .. * F_CPU / 40000 so we can move a distance of up to 1800mm without overflowing
|
// distance * 2400 .. * F_CPU / 40000 so we can move a distance of up to 1800mm without overflowing
|
||||||
uint32_t move_duration = ((distance * 2400) / dda->total_steps) * (F_CPU / 40000);
|
uint32_t move_duration = ((distance * 2400) / dda->total_steps) * (F_CPU / 40000);
|
||||||
|
|
||||||
|
// similarly, find out how fast we can run our axes.
|
||||||
|
// do this for each axis individually, as the combined speed of two or more axes can be higher than the capabilities of a single one.
|
||||||
|
c_limit = 0;
|
||||||
|
c_limit_calc = ((dda->x_delta * UM_PER_STEP_X * 2400) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_X) << 8;
|
||||||
|
if (c_limit_calc > c_limit)
|
||||||
|
c_limit = c_limit_calc;
|
||||||
|
c_limit_calc = ((dda->y_delta * UM_PER_STEP_Y * 2400) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_Y) << 8;
|
||||||
|
if (c_limit_calc > c_limit)
|
||||||
|
c_limit = c_limit_calc;
|
||||||
|
c_limit_calc = ((dda->z_delta * UM_PER_STEP_Z * 2400) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_Z) << 8;
|
||||||
|
if (c_limit_calc > c_limit)
|
||||||
|
c_limit = c_limit_calc;
|
||||||
|
c_limit_calc = ((dda->e_delta * UM_PER_STEP_E * 2400) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_E) << 8;
|
||||||
|
if (c_limit_calc > c_limit)
|
||||||
|
c_limit = c_limit_calc;
|
||||||
|
|
||||||
#ifdef ACCELERATION_REPRAP
|
#ifdef ACCELERATION_REPRAP
|
||||||
// c is initial step time in IOclk ticks
|
// c is initial step time in IOclk ticks
|
||||||
dda->c = (move_duration / startpoint.F) << 8;
|
dda->c = (move_duration / startpoint.F) << 8;
|
||||||
|
if (dda->c < c_limit)
|
||||||
|
dda->c = c_limit;
|
||||||
|
dda->end_c = (move_duration / target->F) << 8;
|
||||||
|
if (dda->end_c < c_limit)
|
||||||
|
dda->end_c = c_limit;
|
||||||
|
|
||||||
if (debug_flags & DEBUG_DDA) {
|
if (debug_flags & DEBUG_DDA) {
|
||||||
serial_writestr_P(PSTR(",md:")); serwrite_uint32(move_duration);
|
serial_writestr_P(PSTR(",md:")); serwrite_uint32(move_duration);
|
||||||
serial_writestr_P(PSTR(",c:")); serwrite_uint32(dda->c >> 8);
|
serial_writestr_P(PSTR(",c:")); serwrite_uint32(dda->c >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startpoint.F != target->F) {
|
if (dda->c != dda->end_c) {
|
||||||
uint32_t stF = startpoint.F / 4;
|
uint32_t stF = startpoint.F / 4;
|
||||||
uint32_t enF = target->F / 4;
|
uint32_t enF = target->F / 4;
|
||||||
// now some constant acceleration stuff, courtesy of http://www.embedded.com/columns/technicalinsights/56800129?printable=true
|
// now some constant acceleration stuff, courtesy of http://www.embedded.com/columns/technicalinsights/56800129?printable=true
|
||||||
|
|
@ -219,7 +240,6 @@ void dda_create(DDA *dda, TARGET *target) {
|
||||||
uint8_t msb_ssq = msbloc(ssq);
|
uint8_t msb_ssq = msbloc(ssq);
|
||||||
uint8_t msb_tot = msbloc(dda->total_steps);
|
uint8_t msb_tot = msbloc(dda->total_steps);
|
||||||
|
|
||||||
dda->end_c = (move_duration / target->F) << 8;
|
|
||||||
// the raw equation WILL overflow at high step rates, but 64 bit math routines take waay too much space
|
// the raw equation WILL overflow at high step rates, but 64 bit math routines take waay too much space
|
||||||
// at 65536 mm/min (1092mm/s), ssq/esq overflows, and dsq is also close to overflowing if esq/ssq is small
|
// at 65536 mm/min (1092mm/s), ssq/esq overflows, and dsq is also close to overflowing if esq/ssq is small
|
||||||
// but if ssq-esq is small, ssq/dsq is only a few bits
|
// but if ssq-esq is small, ssq/dsq is only a few bits
|
||||||
|
|
@ -252,15 +272,20 @@ void dda_create(DDA *dda, TARGET *target) {
|
||||||
else
|
else
|
||||||
dda->accel = 0;
|
dda->accel = 0;
|
||||||
#elif defined ACCELERATION_RAMPING
|
#elif defined ACCELERATION_RAMPING
|
||||||
dda->ramp_steps = dda->total_steps / 2;
|
// add the last bit of dda->total_steps to always round up
|
||||||
|
dda->ramp_steps = dda->total_steps / 2 + (dda->total_steps & 1);
|
||||||
dda->step_no = 0;
|
dda->step_no = 0;
|
||||||
// c is initial step time in IOclk ticks
|
// c is initial step time in IOclk ticks
|
||||||
dda->c = ACCELERATION_STEEPNESS << 8;
|
dda->c = ACCELERATION_STEEPNESS << 8;
|
||||||
dda->c_min = (move_duration / target->F) << 8;
|
dda->c_min = (move_duration / target->F) << 8;
|
||||||
|
if (dda->c_min < c_limit)
|
||||||
|
dda->c_min = c_limit;
|
||||||
dda->n = 1;
|
dda->n = 1;
|
||||||
dda->ramp_state = RAMP_UP;
|
dda->ramp_state = RAMP_UP;
|
||||||
#else
|
#else
|
||||||
dda->c = (move_duration / target->F) << 8;
|
dda->c = (move_duration / target->F) << 8;
|
||||||
|
if (dda->c < c_limit)
|
||||||
|
dda->c = c_limit;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
49
gcode.c
49
gcode.c
|
|
@ -271,6 +271,14 @@ void scan_char(uint8_t c) {
|
||||||
if (read_digit.exponent == 0)
|
if (read_digit.exponent == 0)
|
||||||
read_digit.exponent = 1;
|
read_digit.exponent = 1;
|
||||||
break;
|
break;
|
||||||
|
#ifdef DEBUG
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
case 10:
|
||||||
|
case 13:
|
||||||
|
// ignore
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// can't do ranges in switch..case, so process actual digits here
|
// can't do ranges in switch..case, so process actual digits here
|
||||||
|
|
@ -280,7 +288,14 @@ void scan_char(uint8_t c) {
|
||||||
if (read_digit.exponent)
|
if (read_digit.exponent)
|
||||||
read_digit.exponent++;
|
read_digit.exponent++;
|
||||||
}
|
}
|
||||||
// everything else is ignored
|
#ifdef DEBUG
|
||||||
|
else {
|
||||||
|
// invalid
|
||||||
|
serial_writechar('?');
|
||||||
|
serial_writechar(c);
|
||||||
|
serial_writechar('?');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} else if ( next_target.seen_parens_comment == 1 && c == ')')
|
} else if ( next_target.seen_parens_comment == 1 && c == ')')
|
||||||
next_target.seen_parens_comment = 0; // recognize stuff after a (comment)
|
next_target.seen_parens_comment = 0; // recognize stuff after a (comment)
|
||||||
|
|
@ -311,15 +326,8 @@ void scan_char(uint8_t c) {
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
// process
|
// process
|
||||||
if (next_target.seen_G || next_target.seen_M) {
|
process_gcode_command(&next_target);
|
||||||
process_gcode_command(&next_target);
|
serial_writestr_P(PSTR("ok\n"));
|
||||||
|
|
||||||
serial_writestr_P(PSTR("ok\n"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// write "OK" for invalid/unknown commands as well
|
|
||||||
serial_writestr_P(PSTR("ok huh?\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// expect next line number
|
// expect next line number
|
||||||
if (next_target.seen_N == 1)
|
if (next_target.seen_N == 1)
|
||||||
|
|
@ -341,13 +349,16 @@ void scan_char(uint8_t c) {
|
||||||
|
|
||||||
// reset variables
|
// reset variables
|
||||||
next_target.seen_X = next_target.seen_Y = next_target.seen_Z = \
|
next_target.seen_X = next_target.seen_Y = next_target.seen_Z = \
|
||||||
next_target.seen_E = next_target.seen_F = next_target.seen_G = \
|
next_target.seen_E = next_target.seen_F = next_target.seen_S = \
|
||||||
next_target.seen_S = next_target.seen_P = next_target.seen_N = \
|
next_target.seen_P = next_target.seen_N = next_target.seen_M = \
|
||||||
next_target.seen_M = next_target.seen_checksum = \
|
next_target.seen_checksum = next_target.seen_semi_comment = \
|
||||||
next_target.seen_semi_comment = next_target.seen_parens_comment = \
|
next_target.seen_parens_comment = next_target.checksum_read = \
|
||||||
next_target.checksum_read = next_target.checksum_calculated = 0;
|
next_target.checksum_calculated = 0;
|
||||||
last_field = 0;
|
last_field = 0;
|
||||||
read_digit.sign = read_digit.mantissa = read_digit.exponent = 0;
|
read_digit.sign = read_digit.mantissa = read_digit.exponent = 0;
|
||||||
|
// assume a G1 by default
|
||||||
|
next_target.seen_G = 1;
|
||||||
|
next_target.G = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -393,14 +404,6 @@ void process_gcode_command(GCODE_COMMAND *gcmd) {
|
||||||
|
|
||||||
// G1 - synchronised motion
|
// G1 - synchronised motion
|
||||||
case 1:
|
case 1:
|
||||||
// check speeds here
|
|
||||||
if (gcmd->seen_Z) {
|
|
||||||
if (gcmd->target.F > MAXIMUM_FEEDRATE_Z)
|
|
||||||
gcmd->target.F = MAXIMUM_FEEDRATE_Z;
|
|
||||||
}
|
|
||||||
else if (gcmd->target.F > MAXIMUM_FEEDRATE_X)
|
|
||||||
gcmd->target.F = MAXIMUM_FEEDRATE_X;
|
|
||||||
|
|
||||||
enqueue(&gcmd->target);
|
enqueue(&gcmd->target);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,7 @@
|
||||||
Each movement starts at the speed of the previous command and accelerates or decelerates linearly to reach target speed at the end of the movement.
|
Each movement starts at the speed of the previous command and accelerates or decelerates linearly to reach target speed at the end of the movement.
|
||||||
Can also be set in Makefile
|
Can also be set in Makefile
|
||||||
*/
|
*/
|
||||||
#ifndef ACCELERATION_RAMPING
|
|
||||||
#define ACCELERATION_REPRAP
|
#define ACCELERATION_REPRAP
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
acceleration and deceleration ramping.
|
acceleration and deceleration ramping.
|
||||||
|
|
|
||||||
2
mendel.c
2
mendel.c
|
|
@ -108,7 +108,7 @@ void init(void) {
|
||||||
wd_reset();
|
wd_reset();
|
||||||
|
|
||||||
// say hi to host
|
// say hi to host
|
||||||
serial_writestr_P(PSTR("Start\nOK\n"));
|
serial_writestr_P(PSTR("Start\nok\n"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
timer.c
1
timer.c
|
|
@ -104,7 +104,6 @@ void setTimer(uint32_t delay)
|
||||||
// the result is the timer counts up to the appropriate time and then fires an interrupt.
|
// the result is the timer counts up to the appropriate time and then fires an interrupt.
|
||||||
|
|
||||||
setTimerResolution(0); // stop timer
|
setTimerResolution(0); // stop timer
|
||||||
TCNT1 = 0; // reset timer
|
|
||||||
GTCCR = MASK(PSRSYNC); // reset prescaler - affects timer 0 too but since it's doing PWM, it's not using the prescaler
|
GTCCR = MASK(PSRSYNC); // reset prescaler - affects timer 0 too but since it's doing PWM, it's not using the prescaler
|
||||||
|
|
||||||
setTimerCeiling(getTimerCeiling(delay)); // set timeout
|
setTimerCeiling(getTimerCeiling(delay)); // set timeout
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue