X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fmotor_ctrl%2Fmain.c;h=e8c3d3f4346d9a6f1dbe1d305d9537ebed753127;hp=479770a49e404a392faec9696ee555fdb76139e3;hb=0622f0aa00918665a37b8fdfdf812a8127b55269;hpb=f0107d7c53dc0e5d8c0c46311ce92f9fb17027e3 diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 479770a..e8c3d3f 100644 --- a/avr/motor_ctrl/main.c +++ b/avr/motor_ctrl/main.c @@ -101,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 @@ -670,6 +671,37 @@ 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 (motor1_mode == MOTOR_PID && bit_is_set(error_state, 0)) { + // if error and running: stop + if (m1_old != 0) motor1 = 0; + // if we start motor in error state: start with full power + else if (motor1 > 0) motor1 = 255; + else if (motor1 < 0) motor1 = -255; + } + if (motor2_mode == MOTOR_PID && bit_is_set(error_state, 1)) { + // if error and running: stop + if (m2_old != 0) motor2 = 0; + // if we start motor in error state: start with full power + else if (motor2 > 0) motor2 = 255; + else if (motor2 < 0) motor2 = -255; + } + if (motor3_mode == MOTOR_PID && bit_is_set(error_state, 2)) { + // if error and running: stop + if (m3_old != 0) motor3 = 0; + // if we start motor in error state: start with full power + else if (motor3 > 0) motor3 = 255; + else if (motor3 < 0) motor3 = -255; + } + if (motor4_mode == MOTOR_PID && bit_is_set(error_state, 3)) { + // if error and running: stop + if (m4_old != 0) motor4 = 0; + // if we start motor in error state: start with full power + else if (motor4 > 0) motor4 = 255; + else if (motor4 < 0) motor4 = -255; + } + if (m1_old != motor1) { // update only when changed if (motor1 == 0) { // stop @@ -829,7 +861,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; @@ -844,7 +876,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; @@ -859,7 +891,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; @@ -874,7 +906,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;