位置式PID算法

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值