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;
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,8 +99,14 @@ 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;
@ -106,16 +115,22 @@ void do_steps(){
if(steppers[i].speed<0)
steppers[i].pos--;
}
else{
// dont send step at speed == 0
steppers[i].next_step = timer + 1;
}
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
}
}
}

Loading…
Cancel
Save