kopia lustrzana https://gitlab.com/markol/Teathimble_Firmware
Improved dc motor slow down and stop.
rodzic
583f930511
commit
0f6a458717
21
motor.c
21
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)
|
||||
{
|
||||
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
|
||||
|
|
6
queue.c
6
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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
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,12 +173,29 @@ ISR(INT1_vect)
|
|||
if(last_direction)
|
||||
return;
|
||||
last_direction = 1;
|
||||
if(stop_motor_flag)
|
||||
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;
|
||||
last_direction = 0;
|
||||
//TODO: stop any movement currently in progress
|
||||
if(stop_motor_flag == 1)
|
||||
{
|
||||
desired_speed = 0;
|
||||
stop_motor_flag = 0;
|
||||
}
|
||||
//serial_writestr_P(PSTR("int1 up\n"));
|
||||
if(mb_tail_dda && !mb_tail_dda->live)
|
||||
{
|
||||
mb_tail_dda->waitfor = 0;
|
||||
|
@ -177,13 +203,7 @@ ISR(INT1_vect)
|
|||
sei();
|
||||
}
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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" {
|
||||
|
|
Ładowanie…
Reference in New Issue