http://www.amobbs.com/thread-5554367-1-1.html
void CTRL_1(float T) //x roll,y pitch,z yaw
{
xyz_f_t EXP_LPF_TMP;
/* 給期望(目標)角速度 */
EXP_LPF_TMP.x = MAX_CTRL_ASPEED *(ctrl_2.out.x/ANGLE_TO_MAX_AS);//*( (CH_filter[0])/500.0f );//
EXP_LPF_TMP.y = MAX_CTRL_ASPEED *(ctrl_2.out.y/ANGLE_TO_MAX_AS);//*( (CH_filter[1])/500.0f );//
EXP_LPF_TMP.z = MAX_CTRL_ASPEED *(ctrl_2.out.z/ANGLE_TO_MAX_AS);
except_AS.x = EXP_LPF_TMP.x;//20 *3.14 *T *( EXP_LPF_TMP.x - except_AS.x );//
except_AS.y = EXP_LPF_TMP.y;//20 *3.14 *T *( EXP_LPF_TMP.y - except_AS.y );//
except_AS.z = EXP_LPF_TMP.z;//20 *3.14 *T *( EXP_LPF_TMP.z - except_AS.z );//
/* 期望角速度限幅 */
except_AS.x = LIMIT(except_AS.x, -MAX_CTRL_ASPEED,MAX_CTRL_ASPEED );
except_AS.y = LIMIT(except_AS.y, -MAX_CTRL_ASPEED,MAX_CTRL_ASPEED );
except_AS.z = LIMIT(except_AS.z, -MAX_CTRL_ASPEED,MAX_CTRL_ASPEED );
/* 角速度直接微分(角加速度),負反饋可形成角速度的阻尼(阻礙角速度的變化)*/
ctrl_1.damp.x = ( mpu6050.Gyro_deg.x - g_old[A_X]) *( 0.002f/T );//ctrl_1.PID[PIDROLL].kdamp
ctrl_1.damp.y = (-mpu6050.Gyro_deg.y - g_old[A_Y]) *( 0.002f/T );//ctrl_1.PID[PIDPITCH].kdamp *
ctrl_1.damp.z = (-mpu6050.Gyro_deg.z - g_old[A_Z]) *( 0.002f/T );//ctrl_1.PID[PIDYAW].kdamp *
/* 角速度誤差 */
ctrl_1.err.x = ( except_AS.x - mpu6050.Gyro_deg.x ) *(300.0f/MAX_CTRL_ASPEED);
ctrl_1.err.y = ( except_AS.y + mpu6050.Gyro_deg.y ) *(300.0f/MAX_CTRL_ASPEED); //-y
ctrl_1.err.z = ( except_AS.z + mpu6050.Gyro_deg.z ) *(300.0f/MAX_CTRL_ASPEED); //-z
/* 角速度誤差權重 */
ctrl_1.err_weight.x = ABS(ctrl_1.err.x)/MAX_CTRL_ASPEED;
ctrl_1.err_weight.y = ABS(ctrl_1.err.y)/MAX_CTRL_ASPEED;
ctrl_1.err_weight.z = ABS(ctrl_1.err.z)/MAX_CTRL_YAW_SPEED;
/* 角速度微分 */
ctrl_1.err_d.x = ( ctrl_1.PID[PIDROLL].kd *( -10 *ctrl_1.damp.x) *( 0.002f/T ) );
ctrl_1.err_d.y = ( ctrl_1.PID[PIDPITCH].kd *( -10 *ctrl_1.damp.y) *( 0.002f/T ) );
ctrl_1.err_d.z = ( ctrl_1.PID[PIDYAW].kd *( -10 *ctrl_1.damp.z) *( 0.002f/T ) );
// ctrl_1.err_d.x += 40 *3.14 *0.002 *( 10 *ctrl_1.PID[PIDROLL].kd *(ctrl_1.err.x - ctrl_1.err_old.x) *( 0.002f/T ) - ctrl_1.err_d.x);
// ctrl_1.err_d.y += 40 *3.14 *0.002 *( 10 *ctrl_1.PID[PIDPITCH].kd *(ctrl_1.err.y - ctrl_1.err_old.y) *( 0.002f/T ) - ctrl_1.err_d.y);
// ctrl_1.err_d.z += 40 *3.14 *0.002 *( 10 *ctrl_1.PID[PIDYAW].kd *(ctrl_1.err.z - ctrl_1.err_old.z) *( 0.002f/T ) - ctrl_1.err_d.z);
/* 角速度誤差積分 */
ctrl_1.err_i.x += ctrl_1.PID[PIDROLL].ki *(ctrl_1.err.x - ctrl_1.damp.x) *T;
ctrl_1.err_i.y += ctrl_1.PID[PIDPITCH].ki *(ctrl_1.err.y - ctrl_1.damp.y) *T;
ctrl_1.err_i.z += ctrl_1.PID[PIDYAW].ki *(ctrl_1.err.z - ctrl_1.damp.z) *T;
/* 角速度誤差積分分離 */
ctrl_1.eliminate_I.x = Thr_Weight *CTRL_1_INT_LIMIT ;
ctrl_1.eliminate_I.y = Thr_Weight *CTRL_1_INT_LIMIT ;
ctrl_1.eliminate_I.z = Thr_Weight *CTRL_1_INT_LIMIT ;
/* 角速度誤差積分限幅 */
ctrl_1.err_i.x = LIMIT( ctrl_1.err_i.x, -ctrl_1.eliminate_I.x,ctrl_1.eliminate_I.x );
ctrl_1.err_i.y = LIMIT( ctrl_1.err_i.y, -ctrl_1.eliminate_I.y,ctrl_1.eliminate_I.y );
ctrl_1.err_i.z = LIMIT( ctrl_1.err_i.z, -ctrl_1.eliminate_I.z,ctrl_1.eliminate_I.z );
/* 角速度PID輸出 */
ctrl_1.out.x = 3 *( ctrl_1.FB *LIMIT((0.45f + 0.55f*ctrl_2.err_weight.x),0,1)*except_AS.x + ( 1 - ctrl_1.FB ) *ctrl_1.PID[PIDROLL].kp *( ctrl_1.err.x + ctrl_1.err_d.x + ctrl_1.err_i.x ) );
//*(MAX_CTRL_ASPEED/300.0f);
ctrl_1.out.y = 3 *( ctrl_1.FB *LIMIT((0.45f + 0.55f*ctrl_2.err_weight.y),0,1)*except_AS.y + ( 1 - ctrl_1.FB ) *ctrl_1.PID[PIDPITCH].kp *( ctrl_1.err.y + ctrl_1.err_d.y + ctrl_1.err_i.y ) );
//*(MAX_CTRL_ASPEED/300.0f);
ctrl_1.out.z = 3 *( ctrl_1.FB *LIMIT((0.45f + 0.55f*ctrl_2.err_weight.z),0,1)*except_AS.z + ( 1 - ctrl_1.FB ) *ctrl_1.PID[PIDYAW].kp *( ctrl_1.err.z + ctrl_1.err_d.z + ctrl_1.err_i.z ) );
//*(MAX_CTRL_ASPEED/300.0f);
Thr_Ctrl(T);// 油門控制
All_Out(ctrl_1.out.x,ctrl_1.out.y,ctrl_1.out.z);
ctrl_1.err_old.x = ctrl_1.err.x;
ctrl_1.err_old.y = ctrl_1.err.y;
ctrl_1.err_old.z = ctrl_1.err.z;
g_old[A_X] = mpu6050.Gyro_deg.x ;
g_old[A_Y] = -mpu6050.Gyro_deg.y ;
g_old[A_Z] = -mpu6050.Gyro_deg.z ;
}