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=1fd829253bd09f76c7e45800fa41cdedfe0255b2;hb=9600299d1815cb14a3f49c72c4266adc1f471bcb;hpb=2dbdb0777dda392369a9782812556f712ac1c1e2 diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 1fd8292..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,12 +101,15 @@ #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 @@ -666,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 @@ -770,13 +789,13 @@ static void update_pos(void) { new_speed3 = pos3_diff/PID_T; new_speed4 = pos4_diff/PID_T; - diff_left_m = (pos1_diff + pos2_diff)/(2*STEP_PER_M); - diff_right_m = (pos3_diff + pos4_diff)/(2*STEP_PER_M); + diff_left_m = (pos1_diff + pos2_diff)/(2*STEP_PER_M_LEFT); + diff_right_m = (pos3_diff + pos4_diff)/(2*STEP_PER_M_RIGHT); angle_diff = (diff_right_m - diff_left_m) / WHEEL_DIST; angle_new = angle.f + angle_diff; if (angle_new > 2*M_PI) angle_new-=2*M_PI; - else if (angle_new < 2*M_PI) angle_new+=2*M_PI; + else if (angle_new < -2*M_PI) angle_new+=2*M_PI; translation = (diff_left_m + diff_right_m)/2.0; pos_x_new = pos_x.f + cos(angle_new)*translation; @@ -784,8 +803,8 @@ static void update_pos(void) { speed_l = (new_speed1+new_speed2)/2; speed_r = (new_speed3+new_speed4)/2; - tmp_speed_lin = (speed_l + speed_r)/(2.0*STEP_PER_M); - tmp_speed_rot = (speed_r - speed_l)/(M_PI*WHEEL_DIST*STEP_PER_M); + tmp_speed_lin = (speed_l + speed_r)/(2.0*STEP_PER_M_AVG); + tmp_speed_rot = (speed_r - speed_l)/(M_PI*WHEEL_DIST*STEP_PER_M_AVG); // copy from tmp cli(); @@ -825,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; @@ -840,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; @@ -855,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; @@ -870,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; @@ -960,29 +979,23 @@ int main(void) { speed_wish_right = angle*M_PI*WHEEL_DIST/2 + speed; speed_wish_left = speed*2-speed_wish_right; - speed_wish_left*=STEP_PER_M; - speed_wish_right*=STEP_PER_M; + speed_wish_left*=STEP_PER_M_LEFT; + speed_wish_right*=STEP_PER_M_RIGHT; - if (speed1_wish > 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 (speed2_wish > 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 (speed3_wish > 0 && front_handicap_bwd > 0) { - speed3_wish = speed_wish_right * (100-front_handicap_bwd)/100.0; - } else { speed3_wish = speed_wish_right; } - if (speed4_wish > 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;