X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fmotor_ctrl%2Fmain.c;h=048fab01bbf645fe7ee949cb20045b8e878b5dab;hp=2ec14a12c6c26f2d581f9919a868765bb07e3527;hb=9600299d1815cb14a3f49c72c4266adc1f471bcb;hpb=cb29fa4ba7d1492c9f91752a7a07b512fee7dad0 diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 2ec14a1..048fab0 100644 --- a/avr/motor_ctrl/main.c +++ b/avr/motor_ctrl/main.c @@ -60,7 +60,6 @@ * 0x3D Angle (rad/s) * 0x3E Angle (rad/s) * 0x3F Angle (rad/s) LSB - * free * 0x40 Position x (m) MSB * 0x41 Position x (m) * 0x42 Position x (m) @@ -87,8 +86,8 @@ * 0x91 Motor 2 switch * 0x92 Motor 3 switch * 0x93 Motor 4 switch - * 0x94 Front Handicap backward - * 0x95 Aft Handicap forward + * 0x94 Front Handicap + * 0x95 Aft Handicap * free * 0xA0 Reset reason * 0xA1 TLE Error status @@ -102,9 +101,9 @@ #define TWI_RESET TWCR &= ~((1 << TWSTO) | (1 << TWEN)); TWI_ACK #define TWI_NAK TWCR = (1<>3 | (PINB & 0x07)) & 0xf; + TWDR = error_state; TWI_ACK; break; case 0xA2: // count test @@ -671,6 +671,20 @@ static void update_motor(void) { static int16_t m3_old=SHRT_MIN; static int16_t m4_old=SHRT_MIN; + error_state = ~((PIND & 0x40)>>3 | (PINB & 0x07)) & 0xf; + + // if error and running: stop + if (motor1_mode == MOTOR_PID && bit_is_set(error_state, 0) && m1_old != 0) motor1 = 0; + if (motor2_mode == MOTOR_PID && bit_is_set(error_state, 1) && m2_old != 0) motor2 = 0; + if (motor3_mode == MOTOR_PID && bit_is_set(error_state, 2) && m3_old != 0) motor3 = 0; + if (motor4_mode == MOTOR_PID && bit_is_set(error_state, 3) && m4_old != 0) motor4 = 0; + + // if we start motor in error state: start with full power + if (motor1_mode == MOTOR_PID && bit_is_set(error_state, 0) && m1_old == 0 && motor1 != 0) motor1 = 255; + if (motor2_mode == MOTOR_PID && bit_is_set(error_state, 1) && m2_old == 0 && motor2 != 0) motor2 = 255; + if (motor3_mode == MOTOR_PID && bit_is_set(error_state, 2) && m3_old == 0 && motor3 != 0) motor3 = 255; + if (motor4_mode == MOTOR_PID && bit_is_set(error_state, 3) && m4_old == 0 && motor4 != 0) motor4 = 255; + if (m1_old != motor1) { // update only when changed if (motor1 == 0) { // stop @@ -830,7 +844,7 @@ static void update_pid(void) { } else { int16_t e = speed1_wish - speed1; esum1+=e; - motor1 += KP*e + KI*PID_T*esum1 + KD/PID_T*(e - eold1); + motor1 = KP*e + KI*PID_T*esum1 + KD/PID_T*(e - eold1); eold1 = e; if (motor1 > 255) motor1 = 255; @@ -845,7 +859,7 @@ static void update_pid(void) { } else { int16_t e = speed2_wish - speed2; esum2+=e; - motor2 += KP*e + KI*PID_T*esum2 + KD/PID_T*(e - eold2); + motor2 = KP*e + KI*PID_T*esum2 + KD/PID_T*(e - eold2); eold2 = e; if (motor2 > 255) motor2 = 255; @@ -860,7 +874,7 @@ static void update_pid(void) { } else { int16_t e = speed3_wish - speed3; esum3+=e; - motor3 += KP*e + KI*PID_T*esum3 + KD/PID_T*(e - eold3); + motor3 = KP*e + KI*PID_T*esum3 + KD/PID_T*(e - eold3); eold3 = e; if (motor3 > 255) motor3 = 255; @@ -875,7 +889,7 @@ static void update_pid(void) { } else { int16_t e = speed4_wish - speed4; esum4+=e; - motor4 += KP*e + KI*PID_T*esum4 + KD/PID_T*(e - eold4); + motor4 = KP*e + KI*PID_T*esum4 + KD/PID_T*(e - eold4); eold4 = e; if (motor4 > 255) motor4 = 255; @@ -968,26 +982,20 @@ int main(void) { speed_wish_left*=STEP_PER_M_LEFT; speed_wish_right*=STEP_PER_M_RIGHT; - if (speed_wish_left > 0 && aft_handicap_fwd > 0) { - speed1_wish = speed_wish_left * (100-aft_handicap_fwd)/100.0; + if (aft_handicap > 0) { + speed1_wish = speed_wish_left * (100-aft_handicap)/100.0; + speed4_wish = speed_wish_right * (100-aft_handicap)/100.0; } else { speed1_wish = speed_wish_left; + speed4_wish = speed_wish_right; } - if (speed_wish_left < 0 && front_handicap_bwd > 0) { - speed2_wish = speed_wish_left * (100-front_handicap_bwd)/100.0; + if (front_handicap > 0) { + speed2_wish = speed_wish_left * (100-front_handicap)/100.0; + speed3_wish = speed_wish_right * (100-front_handicap)/100.0; } else { speed2_wish = speed_wish_left; - } - if (speed_wish_right < 0 && front_handicap_bwd > 0) { - speed3_wish = speed_wish_right * (100-front_handicap_bwd)/100.0; - } else { speed3_wish = speed_wish_right; } - if (speed_wish_right > 0 && aft_handicap_fwd > 0) { - speed4_wish = speed_wish_right * (100-aft_handicap_fwd)/100.0; - } else { - speed4_wish = speed_wish_right; - } motor1_mode = MOTOR_PID; motor2_mode = MOTOR_PID; motor3_mode = MOTOR_PID;