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();
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

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_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);

Wyświetl plik

@ -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"));
}
}

Wyświetl plik

@ -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" {