1、
typedef struct PID
{
float kp,ki,kd,PreErr,Pout,Iout,Dout,I_sum,Dt,Imax;
}PID;
//===============================================================================
//姿态环角度环
//input: pid—pid指针,EurDesir—期望的欧拉角,measure—测量的欧拉角,
// output—输出期望的角速度
//===============================================================================
void PID_EurLoop(PID* pid,float EurDesir,float measure,float* Output)
{
float Err,Diff;
Err = EurDesir-measure; //得到误差
Diff = (Err-pid->PreErr)/pid->Dt;
pid->PreErr = Err; //更新前次误差
pid->Pout = pid->kp * Err; //比例计算,P*误差
pid->Dout = pid->kd * Diff;
*Output = pid->Pout + pid->Iout + pid->Dout;
}
//===============================================================================
//角速度环
//
//===============================================================================
void PID_GRYLoop(PID* pid,float EurDesir,float measure,float* Output)
{
float Err,Diff;
Err = EurDesir-measure; //得到误差
Diff = (Err-pid->PreErr)/pid->Dt;
pid->PreErr=Err; //更新前次误差
if(fabs(Err)>=0.5 && fabs(Err)<=800 ) pid->I_sum+=(Err*pid->Dt);
if (pid->I_sum> pid->Imax ) pid->I_sum = pid->Imax;
if (pid->I_sum<-(pid->Imax) ) pid->I_sum = -(pid->Imax);
if (fly_state == FlyStop) pid->I_sum=0;
pid->Pout = pid->kp * Err; //比例计算,P*误差
pid->Iout = pid->ki * pid->I_sum;
pid->Dout = pid->kd * Diff;
*Output=pid->Pout+pid->Iout+pid->Dout;
}