fix div by 0 bug
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user