diff --git a/HalloRobot/libProject/src/control.c b/HalloRobot/libProject/src/control.c index e37e29c73cc7cdcc1bf58de9b0cb29bf871c5eac..96ccb1f833f4b59cbe9c0421110709e71caa61b7 100644 --- a/HalloRobot/libProject/src/control.c +++ b/HalloRobot/libProject/src/control.c @@ -55,14 +55,16 @@ float pi_control(float e) }else if(new_out<OUT_MIN){ new_out = OUT_MIN; sum_error -= e; - } - + } + return new_out; } #define K_FEIN 0.4 #define K_GROB 40.0 +#define I_MAX 1.2 +#define I_MIN -1.2 /* * Implements PID-controller. * Feeds back correction for system input depending on system error e, @@ -71,15 +73,15 @@ float pi_control(float e) */ float pid_control(float e) { - static float K = 5.0; + static float K = 4.0; const float T_i = 0.1f;//0.18 - const float T_d = 0.025; + const float T_d = 0.04; /* - if(e < 0.45 && e > -0.45){ - K = 0.4f; + if(e < 1 && e > -1){ + K = 5.0; } - if(e > 4.0 || e < -4.0){ + if(e > 3.0 || e < -3.0){ K = 100.0; } */ @@ -106,10 +108,12 @@ float pid_control(float e) sum_error += e/F_CONTROL; float derivative = (e - e_old)*F_CONTROL; e_old = e; - - - float new_out = K*(e + sum_error/T_i + T_d*derivative); + float p = e; + float c_i = sum_error/T_i; + float c_d = T_d*derivative; + float new_out = K*(p + c_i + c_d); + //ezs_printf("%f,%f,%f,%f\n",p,c_i,c_d,new_out); if(new_out>OUT_MAX){ new_out = OUT_MAX; sum_error -= e/F_CONTROL; @@ -117,7 +121,12 @@ float pid_control(float e) new_out = OUT_MIN; sum_error -= e/F_CONTROL; } - + if(sum_error>I_MAX){ + sum_error = I_MAX; + }else if(sum_error<I_MIN){ + sum_error = I_MIN; + } + return new_out; } @@ -163,11 +172,14 @@ float offset_control(float motor_signal) const float K = -0.01f;//0.001 float max_offset = 10.0; float min_offset = -10.0; - static int i = 0; + static int i = 1; //sum_offset += K*motor_signal/F_CONTROL; + static float sum = 0; + sum += motor_signal; if(i==10){ - sum_offset = K*iir_filter_05Hz_N3(motor_signal) + INITIAL_OFFSET; + sum_offset = K*iir_filter_05Hz_N3(sum/10) + INITIAL_OFFSET; i=0; + sum = 0; } float new_offset = sum_offset; diff --git a/HalloRobot/libProject/src/filter.c b/HalloRobot/libProject/src/filter.c index 52d61286df284ccd5f6e368527b76f48ac4f434a..76642b1d5105f2b242813211e28b1874e5ec8800 100644 --- a/HalloRobot/libProject/src/filter.c +++ b/HalloRobot/libProject/src/filter.c @@ -33,7 +33,7 @@ static float iir_filter(float phi_acc) */ float complementary_filter(float phi_acc, float gyro_rate, uint16_t f_sampling) { - float k = 0.995; + float k = 0.993; float phi_acc_fil = iir_filter(phi_acc); phi_cor = k*(phi_cor+gyro_rate/f_sampling)+(1.0-k)*phi_acc_fil; return phi_cor; diff --git a/HalloRobot/main.c b/HalloRobot/main.c index 84c28dc90f1ba3fe36df88b6266216f662e9e6ed..4d90a9568c11cfaa017824aafab67a1cf66118dc 100644 --- a/HalloRobot/main.c +++ b/HalloRobot/main.c @@ -182,7 +182,7 @@ void control_thread(cyg_addrword_t arg) error = null_offset_pos - phi_cor; motor_signal = control_func_ptr(error); null_offset_pos = offset_control(motor_signal); - ezs_printf("%f,%f,%f,%f\n",null_offset_pos,phi_cor,error,motor_signal); + //ezs_printf("%f,%f,%f,%f\n",null_offset_pos,phi_cor,error,motor_signal); motor_pwm(motor_signal); #ifdef WCET uint32_t current_run = ezs_watch_stop(&time_sample);