X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fmotor_ctrl%2Fmain.c;h=ec9965f68800c26812a9eadf04da5e67dd3cec81;hp=5d655290a7e8b78cb3efd33b881eaf85fafd3bfe;hb=540df9f5842bf55260f494c985fd75e4c54fb7cb;hpb=b301eb19e6487497a8bb946c538a25aa4ee28c1d diff --git a/avr/motor_ctrl/main.c b/avr/motor_ctrl/main.c index 5d65529..ec9965f 100644 --- a/avr/motor_ctrl/main.c +++ b/avr/motor_ctrl/main.c @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include #include "uart.h" /* @@ -97,23 +100,23 @@ */ -#define KP 0.09 -#define KI 0.07 +#define KP 0.062 +#define KI 0.12 #define KD 0.0 #define PID_T 0.01 // wheel diameter=12cm, encoder=48cpr, gear ratio=1:47 // STEP_PER_M = 48*47/(d*pi) // Left real diameter: 0.12808, Right real diameter: 0.121 -#define STEP_PER_M 5770.8 +#define STEP_PER_M 5573.0 #define STEP_PER_M_LEFT (STEP_PER_M) #define STEP_PER_M_RIGHT (STEP_PER_M) #define WHEEL_DIST 0.39912 // Measured: 0.252 #define PWM_BREAK INT16_MIN #define STALL_LIMIT 140000 -#define TWI_ACK TWCR = (1< 0 && speed1 < 0) || (speed1_wish < 0 && speed1 > 0); // Prevent dangerous immediate engine reverse + if (speed1_wish == 0 || dir_change) { motor1 = 0; eold1 = 0; error_state &= ~(1<<4); @@ -953,7 +960,8 @@ static void update_pid(void) { speed2_wish_old = speed2_wish; } - if (speed2_wish == 0) { + uint8_t dir_change = (speed2_wish > 0 && speed2 < 0) || (speed2_wish < 0 && speed2 > 0); // Prevent dangerous immediate engine reverse + if (speed2_wish == 0 || dir_change) { motor2 = 0; eold2 = 0; error_state &= ~(1<<5); @@ -975,7 +983,8 @@ static void update_pid(void) { speed3_wish_old = speed3_wish; } - if (speed3_wish == 0) { + uint8_t dir_change = (speed3_wish > 0 && speed3 < 0) || (speed3_wish < 0 && speed3 > 0); // Prevent dangerous immediate engine reverse + if (speed3_wish == 0 || dir_change) { motor3 = 0; eold3 = 0; error_state &= ~(1<<6); @@ -997,7 +1006,8 @@ static void update_pid(void) { speed4_wish_old = speed4_wish; } - if (speed4_wish == 0) { + uint8_t dir_change = (speed4_wish > 0 && speed4 < 0) || (speed4_wish < 0 && speed4 > 0); // Prevent dangerous immediate engine reverse + if (speed4_wish == 0 || dir_change) { motor4 = 0; eold4 = 0; error_state &= ~(1<<7); @@ -1041,7 +1051,7 @@ int main(void) { // I2C TWAR = 0x50; - TWI_RESET; + TWI_ACK; // Motor 1 & 2 // Also used for PWM frequency TIMER1_FREQ (F_CPU/256) @@ -1082,10 +1092,11 @@ int main(void) { case 0xff: // Magic reg that starts the bootloader if (bootloader == 0xa5) { cli(); - { - void (*start)(void) = (void*)0x1800; - start(); - } + // write mark to first area in eeprom + eeprom_write_byte((uint8_t*)0, 123); + eeprom_busy_wait(); + // Use watchdog to restart + wdt_enable(WDTO_15MS); } break; }