X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fmotor_ctrl%2Fmain.c;h=6d9f620c672151732547f12d40e904319c4134a3;hp=576d57c1c7d75d22b286f462f6c3618c57f61b3c;hb=581514e44d63392698ca47b9e50d0288e3fadbdb;hpb=8217c6feeab407f201dd55ea7be27ff51ed62c27 diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 576d57c..6d9f620 100644 --- a/avr/motor_ctrl/main.c +++ b/avr/motor_ctrl/main.c @@ -101,12 +101,12 @@ #define TWI_RESET TWCR &= ~((1 << TWSTO) | (1 << TWEN)); TWI_ACK #define TWI_NAK TWCR = (1<>3 | (PINB & 0x07)) & 0xf; + error_state &= 0xf0; // clear lower bits + error_state |= ~((PIND & 0x40)>>3 | (PINB & 0x07)) & 0xf; if (m1_old != motor1) { // update only when changed if (motor1 == 0) { @@ -857,11 +862,43 @@ static void update_pid(void) { static int32_t esum3=0; static int32_t esum4=0; + // protect motors from damage if stalling + if (labs(esum1) > 120000 && speed1 == 0) { + motor1 = 0; + motor1_mode = MOTOR_MANUAL; + error_state |= (1<<4); + esum1 = 0; + } + if (labs(esum2) > 120000 && speed2 == 0) { + motor2 = 0; + motor2_mode = MOTOR_MANUAL; + error_state |= (1<<5); + esum2 = 0; + } + if (labs(esum3) > 120000 && speed3 == 0) { + motor3 = 0; + motor3_mode = MOTOR_MANUAL; + error_state |= (1<<6); + esum3 = 0; + } + // protect motors from damage if stalling + if (labs(esum4) > 120000 && speed4 == 0) { + motor4 = 0; + motor4_mode = MOTOR_MANUAL; + error_state |= (1<<7); + esum4 = 0; + } + if (motor1_mode == MOTOR_PID) { + if (speed1_wish != speed1_wish_old) { + esum1 = 0; + speed1_wish_old = speed1_wish; + } + if (speed1_wish == 0) { motor1 = 0; eold1 = 0; - esum1 = 0; + error_state &= ~(1<<4); } else { int16_t e = speed1_wish - speed1; esum1+=e; @@ -875,10 +912,15 @@ static void update_pid(void) { } } if (motor2_mode == MOTOR_PID) { + if (speed2_wish != speed2_wish_old) { + esum2 = 0; + speed2_wish_old = speed2_wish; + } + if (speed2_wish == 0) { motor2 = 0; eold2 = 0; - esum2 = 0; + error_state &= ~(1<<5); } else { int16_t e = speed2_wish - speed2; esum2+=e; @@ -892,10 +934,15 @@ static void update_pid(void) { } } if (motor3_mode == MOTOR_PID) { + if (speed3_wish != speed3_wish_old) { + esum3 = 0; + speed3_wish_old = speed3_wish; + } + if (speed3_wish == 0) { motor3 = 0; eold3 = 0; - esum3 = 0; + error_state &= ~(1<<6); } else { int16_t e = speed3_wish - speed3; esum3+=e; @@ -909,10 +956,15 @@ static void update_pid(void) { } } if (motor4_mode == MOTOR_PID) { + if (speed4_wish != speed4_wish_old) { + esum4 = 0; + speed4_wish_old = speed4_wish; + } + if (speed4_wish == 0) { motor4 = 0; eold4 = 0; - esum4 = 0; + error_state &= ~(1<<7); } else { int16_t e = speed4_wish - speed4; esum4+=e; @@ -1013,17 +1065,17 @@ int main(void) { if (aft_handicap > 0) { speed1_wish = speed_wish_left * (100-aft_handicap)/100.0; - speed4_wish = speed_wish_right * (100-aft_handicap)/100.0; + speed3_wish = speed_wish_right * (100-aft_handicap)/100.0; } else { speed1_wish = speed_wish_left; - speed4_wish = speed_wish_right; + speed3_wish = speed_wish_right; } if (front_handicap > 0) { speed2_wish = speed_wish_left * (100-front_handicap)/100.0; - speed3_wish = speed_wish_right * (100-front_handicap)/100.0; + speed4_wish = speed_wish_right * (100-front_handicap)/100.0; } else { speed2_wish = speed_wish_left; - speed3_wish = speed_wish_right; + speed4_wish = speed_wish_right; } motor1_mode = MOTOR_PID; motor2_mode = MOTOR_PID;