Improved dc motor slow down and stop.

master
Martin 2018-10-30 18:36:17 +01:00
rodzic 583f930511
commit 0f6a458717
4 zmienionych plików z 53 dodań i 28 usunięć

27
motor.c
Wyświetl plik

@ -454,20 +454,26 @@ void dda_start(DDA *dda) {
uint8_t queue_elements = queue_current_size(); uint8_t queue_elements = queue_current_size();
if(dda->dc_motor_speed == 0 ) if(dda->dc_motor_speed == 0 )
{ {
// turn off motor now for jump move // turn off motor for jump move after current one stitch
if (dda->waitfor == 0) if (desired_speed > 0)
desired_speed = 0; {
else stop_dc_motor(1);
stop_dc_motor(); dda->waitfor = 1;
}
} }
else else
{ {
// slow down on almost empty buffer // slow down on almost empty buffer
if(queue_elements < 4) if(queue_elements < 4)
{ {
desired_speed = dda->dc_motor_speed / 2; if(queue_elements < 2)
if(desired_speed < MIN_MOTOR_SPEED) desired_speed = MIN_MOTOR_SPEED;
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 else // just use planned speed value from dda
desired_speed = dda->dc_motor_speed; desired_speed = dda->dc_motor_speed;
@ -481,10 +487,9 @@ void dda_start(DDA *dda) {
return; return;
#endif #endif
// buffer is empty, this is probably last move // buffer is empty, this is probably last move, stop now
if(queue_elements == 0) if(queue_elements == 0)
desired_speed = 0; stop_dc_motor(0);
if (DEBUG_DDA && (debug_flags & DEBUG_DDA)) if (DEBUG_DDA && (debug_flags & DEBUG_DDA))
#ifdef STEPS_PER_M_Z #ifdef STEPS_PER_M_Z

Wyświetl plik

@ -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_check = endstop_check;
new_movebuffer->endstop_stop_cond = endstop_stop_cond; new_movebuffer->endstop_stop_cond = endstop_stop_cond;
#ifdef TRIGGERED_MOVEMENT #ifdef TRIGGERED_MOVEMENT
// this dda is started by interrupt // this dda is started by external interrupt
if(endstop_stop_cond & 0xf0) if(endstop_stop_cond & 0xf0)
{
new_movebuffer->waitfor = 1; new_movebuffer->waitfor = 1;
} else
new_movebuffer->waitfor = 0;
#endif #endif
dda_create(new_movebuffer, t); dda_create(new_movebuffer, t);

Wyświetl plik

@ -100,12 +100,21 @@ void set_dc_motor_speed_margin(int16_t value)
margin_max_speed = MAX_MOTOR_SPEED; margin_max_speed = MAX_MOTOR_SPEED;
} }
/// activates stop of the the motor on needle interrupt /// activates stop of the the motor on needle downwards interrupt
void stop_dc_motor() /// 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; if (stop_motor_flag || desired_speed == 0) return;
desired_speed = MIN_MOTOR_SPEED; if (mode)
stop_motor_flag = 1; {
desired_speed = MIN_MOTOR_SPEED;
stop_motor_flag = 2;
}
else
{
desired_speed = MIN_MOTOR_SPEED/2;
stop_motor_flag = 1;
}
} }
/// PI control update procedure /// PI control update procedure
@ -164,26 +173,37 @@ ISR(INT1_vect)
if(last_direction) if(last_direction)
return; return;
last_direction = 1; last_direction = 1;
if(stop_motor_flag) if(stop_motor_flag == 2)
{ {
desired_speed = 0; --stop_motor_flag;
stop_motor_flag = 0; desired_speed = MIN_MOTOR_SPEED/2;
} }
//serial_writestr_P(PSTR("int1 up\n")); if(mb_tail_dda && !mb_tail_dda->live && !stop_motor_flag)
if(mb_tail_dda && !mb_tail_dda->live)
{ {
mb_tail_dda->waitfor = 0; mb_tail_dda->waitfor = 0;
dda_start(mb_tail_dda); dda_start(mb_tail_dda);
sei(); sei();
} }
//serial_writestr_P(PSTR("int1 up\n"));
} }
else // needle goes downwards else // needle goes downwards
{ {
if(!last_direction) if(!last_direction)
return; return;
//serial_writestr_P(PSTR("int1 down\n"));
last_direction = 0; last_direction = 0;
//TODO: stop any movement currently in progress //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"));
} }
} }

Wyświetl plik

@ -12,7 +12,7 @@
extern int16_t desired_speed; extern int16_t desired_speed;
extern int16_t margin_max_speed; extern int16_t margin_max_speed;
void stop_dc_motor(); void stop_dc_motor(uint8_t);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {