diff --git a/Inc/stepper.h b/Inc/stepper.h index 39f2fdc..73cfb16 100644 --- a/Inc/stepper.h +++ b/Inc/stepper.h @@ -10,7 +10,7 @@ typedef struct { GPIO_TypeDef* home_port; uint8_t home_pin; uint8_t homed:1; - uint8_t moving:1; + uint8_t trigger_step:1; int16_t pos; int16_t speed; int16_t ramp_to_speed; diff --git a/Src/stepper.c b/Src/stepper.c index 9c6232f..24469fb 100644 --- a/Src/stepper.c +++ b/Src/stepper.c @@ -77,7 +77,10 @@ void do_steps(){ timer++; for(uint8_t i=0; i<(sizeof(steppers)/sizeof(stepper_T)); i++){ - if(steppers[i].ramp_to_speed != 0 && steppers[i].next_step == timer){ + if((steppers[i].ramp_to_speed != 0 && steppers[i].next_step == timer) || steppers[i].trigger_step){ + /* reset trigger */ + steppers[i].trigger_step = 0; + /* ramp speed */ if(steppers[i].speed < steppers[i].ramp_to_speed) steppers[i].speed++; @@ -96,26 +99,38 @@ void do_steps(){ if(steppers[i].speed<0) steppers[i].dir_port->BSRR |= 1 << (steppers[i].dir_pin + 16); - /* calculate next step time */ - steppers[i].next_step = timer + (1000/abs(steppers[i].speed)); // should be safe for 1 overflow + // avoid division by zero + if(steppers[i].speed != 0){ + /* calculate next step time + * + * should be safe for 1 overflow; speeds which + * require longer wait times than uint32_max not supported + * */ + steppers[i].next_step = timer + (1000/abs(steppers[i].speed)); + + /* step and count position */ + steppers[i].step_port->ODR ^= 1 << steppers[i].step_pin; + if(steppers[i].speed>0) + steppers[i].pos++; + if(steppers[i].speed<0) + steppers[i].pos--; + + } + else{ + // dont send step at speed == 0 + steppers[i].next_step = timer + 1; + } - /* step and count position */ - steppers[i].step_port->ODR ^= 1 << steppers[i].step_pin; - if(steppers[i].speed>0) - steppers[i].pos++; - if(steppers[i].speed<0) - steppers[i].pos--; - printf("pos %d\tspeed %d\n", steppers[i].pos, steppers[i].speed); } if(steppers[i].homed){ - int16_t old_ramp_to_speed = steppers[i].ramp_to_speed; - + static uint16_t old_ramp_to_speed; + old_ramp_to_speed = steppers[i].ramp_to_speed; steppers[i].ramp_to_speed = rxBuffer[1] - steppers[i].pos; - if(steppers[i].ramp_to_speed != 0 && old_ramp_to_speed == 0) - steppers[i].next_step = timer+1; + if(old_ramp_to_speed == 0 && steppers[i].ramp_to_speed != 0) + steppers[i].trigger_step = 1; } else{ if(~(steppers[i].home_port->IDR) & (1 << steppers[i].home_pin)){ @@ -128,7 +143,7 @@ void do_steps(){ else{ if(steppers[i].ramp_to_speed == 0){ steppers[i].ramp_to_speed=10; - steppers[i].next_step = timer+1; + steppers[i].trigger_step = 1; // trigger first step } } }