fix div by 0 bug

fixturemapping
Eggert Jung 6 months ago
parent 9852548a10
commit 29611f6d43

@ -10,7 +10,7 @@ typedef struct {
GPIO_TypeDef* home_port; GPIO_TypeDef* home_port;
uint8_t home_pin; uint8_t home_pin;
uint8_t homed:1; uint8_t homed:1;
uint8_t moving:1; uint8_t trigger_step:1;
int16_t pos; int16_t pos;
int16_t speed; int16_t speed;
int16_t ramp_to_speed; int16_t ramp_to_speed;

@ -77,7 +77,10 @@ void do_steps(){
timer++; timer++;
for(uint8_t i=0; i<(sizeof(steppers)/sizeof(stepper_T)); i++){ 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 */ /* ramp speed */
if(steppers[i].speed < steppers[i].ramp_to_speed) if(steppers[i].speed < steppers[i].ramp_to_speed)
steppers[i].speed++; steppers[i].speed++;
@ -96,26 +99,38 @@ void do_steps(){
if(steppers[i].speed<0) if(steppers[i].speed<0)
steppers[i].dir_port->BSRR |= 1 << (steppers[i].dir_pin + 16); steppers[i].dir_port->BSRR |= 1 << (steppers[i].dir_pin + 16);
/* calculate next step time */ // avoid division by zero
steppers[i].next_step = timer + (1000/abs(steppers[i].speed)); // should be safe for 1 overflow 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); printf("pos %d\tspeed %d\n", steppers[i].pos, steppers[i].speed);
} }
if(steppers[i].homed){ 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; steppers[i].ramp_to_speed = rxBuffer[1] - steppers[i].pos;
if(steppers[i].ramp_to_speed != 0 && old_ramp_to_speed == 0) if(old_ramp_to_speed == 0 && steppers[i].ramp_to_speed != 0)
steppers[i].next_step = timer+1; steppers[i].trigger_step = 1;
} }
else{ else{
if(~(steppers[i].home_port->IDR) & (1 << steppers[i].home_pin)){ if(~(steppers[i].home_port->IDR) & (1 << steppers[i].home_pin)){
@ -128,7 +143,7 @@ void do_steps(){
else{ else{
if(steppers[i].ramp_to_speed == 0){ if(steppers[i].ramp_to_speed == 0){
steppers[i].ramp_to_speed=10; steppers[i].ramp_to_speed=10;
steppers[i].next_step = timer+1; steppers[i].trigger_step = 1; // trigger first step
} }
} }
} }

Loading…
Cancel
Save