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=9ca7b851471a5ee375434e817a5a1c817b814202;hb=9600299d1815cb14a3f49c72c4266adc1f471bcb;hpb=66133e1fb38af4db9256a0aef0efae4dd1114df2 diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 9ca7b85..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) @@ -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; @@ -895,6 +914,9 @@ int main(void) { DDRB = (1 << 3); DDRC = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2); DDRD = (1 << 7) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2); + // Pullup TLEs EF + PORTB = (1 << 0) | (1 << 1) | (1 << 2); + PORTD = (1 << 6); bootloader = 0x00; setup_uart(9600); @@ -957,13 +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; - speed1_wish = speed_wish_left * (100-aft_handicap)/100.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-aft_handicap)/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 (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; + speed3_wish = speed_wish_right; + } motor1_mode = MOTOR_PID; motor2_mode = MOTOR_PID; motor3_mode = MOTOR_PID;