diff --git a/motor.c b/motor.c index 0edc403..39b5dee 100644 --- a/motor.c +++ b/motor.c @@ -454,20 +454,26 @@ void dda_start(DDA *dda) { uint8_t queue_elements = queue_current_size(); if(dda->dc_motor_speed == 0 ) { - // turn off motor now for jump move - if (dda->waitfor == 0) - desired_speed = 0; - else - stop_dc_motor(); + // turn off motor for jump move after current one stitch + if (desired_speed > 0) + { + stop_dc_motor(1); + dda->waitfor = 1; + } } else { // slow down on almost empty buffer if(queue_elements < 4) { - desired_speed = dda->dc_motor_speed / 2; - if(desired_speed < MIN_MOTOR_SPEED) - desired_speed = MIN_MOTOR_SPEED; + if(queue_elements < 2) + desired_speed = MIN_MOTOR_SPEED; + else + { + desired_speed = dda->dc_motor_speed / 2; + if(desired_speed < MIN_MOTOR_SPEED) + desired_speed = MIN_MOTOR_SPEED; + } } else // just use planned speed value from dda desired_speed = dda->dc_motor_speed; @@ -481,10 +487,9 @@ void dda_start(DDA *dda) { return; #endif - // buffer is empty, this is probably last move + // buffer is empty, this is probably last move, stop now if(queue_elements == 0) - desired_speed = 0; - + stop_dc_motor(0); if (DEBUG_DDA && (debug_flags & DEBUG_DDA)) #ifdef STEPS_PER_M_Z diff --git a/queue.c b/queue.c index 48f0d0d..bc14cb0 100644 --- a/queue.c +++ b/queue.c @@ -111,11 +111,11 @@ void enqueue_home(TARGET const *t, uint8_t endstop_check, uint8_t endstop_stop_c new_movebuffer->endstop_check = endstop_check; new_movebuffer->endstop_stop_cond = endstop_stop_cond; #ifdef TRIGGERED_MOVEMENT - // this dda is started by interrupt + // this dda is started by external interrupt if(endstop_stop_cond & 0xf0) - { new_movebuffer->waitfor = 1; - } + else + new_movebuffer->waitfor = 0; #endif dda_create(new_movebuffer, t); diff --git a/sensors_control.c b/sensors_control.c index 7dbb1b4..3338805 100644 --- a/sensors_control.c +++ b/sensors_control.c @@ -100,12 +100,21 @@ void set_dc_motor_speed_margin(int16_t value) margin_max_speed = MAX_MOTOR_SPEED; } -/// activates stop of the the motor on needle interrupt -void stop_dc_motor() +/// activates stop of the the motor on needle downwards interrupt +/// mode 0 - stop on first interrupt, any other value - stop on next one interrupt +void stop_dc_motor(uint8_t mode) { - if(desired_speed == 0) return; - desired_speed = MIN_MOTOR_SPEED; - stop_motor_flag = 1; + if (stop_motor_flag || desired_speed == 0) return; + if (mode) + { + desired_speed = MIN_MOTOR_SPEED; + stop_motor_flag = 2; + } + else + { + desired_speed = MIN_MOTOR_SPEED/2; + stop_motor_flag = 1; + } } /// PI control update procedure @@ -164,26 +173,37 @@ ISR(INT1_vect) if(last_direction) return; last_direction = 1; - if(stop_motor_flag) - { - desired_speed = 0; - stop_motor_flag = 0; - } - //serial_writestr_P(PSTR("int1 up\n")); - if(mb_tail_dda && !mb_tail_dda->live) + if(stop_motor_flag == 2) + { + --stop_motor_flag; + desired_speed = MIN_MOTOR_SPEED/2; + } + if(mb_tail_dda && !mb_tail_dda->live && !stop_motor_flag) { mb_tail_dda->waitfor = 0; dda_start(mb_tail_dda); sei(); } + //serial_writestr_P(PSTR("int1 up\n")); } else // needle goes downwards { if(!last_direction) return; - //serial_writestr_P(PSTR("int1 down\n")); last_direction = 0; //TODO: stop any movement currently in progress + if(stop_motor_flag == 1) + { + desired_speed = 0; + stop_motor_flag = 0; + if(mb_tail_dda && !mb_tail_dda->live) + { + mb_tail_dda->waitfor = 0; + dda_start(mb_tail_dda); + sei(); + } + } + //serial_writestr_P(PSTR("int1 down\n")); } } diff --git a/sensors_control.h b/sensors_control.h index ae6823f..8009908 100644 --- a/sensors_control.h +++ b/sensors_control.h @@ -12,7 +12,7 @@ extern int16_t desired_speed; extern int16_t margin_max_speed; -void stop_dc_motor(); +void stop_dc_motor(uint8_t); #ifdef __cplusplus extern "C" {