PID

位置式PID的实现

2017-05-15  本文已影响536人  AE_sdyang

PID结构体

typedef  struct{
  volatile int SetPoint;       //设定目标值 Desired Value
  volatile long SumError;      //误差累计
  volatile double Proportion;  //比例常数 Proportional Const
  volatile double Integral;    //积分常数 Integral Const
  volatile double Derivative;  //微分常数 Derivative Const
  volatile int LastError;      //Error[-1]
  volatile int PervError;      //Error[-2]
}PID;

位置式PID结构体比增量式PID结构体多了一个SumError成员,用于记录当前量与目标值的累积误差,位置式PID是不需要PrevError成员的。
LocPIDCalc函数

unsigned int LocPIDCalc(int NextPoint)
{
  int iError;
  int dError;
  iError = sptr->SetPoint - NextPoint;  //偏差
  sptr->SumError += iError;             //积分
  //最好进行积分限幅
  dError = iError - sptr->LastError;    //微分
  sptr->LastError = iError;
  return(sptr->Proportion*iError      //比例项
        +sptr->Integral*sptr->SumError//积分项
        +sptr->Derivative*dError);    //微分项
}

上述函数是位置式PID算法实现方法。首先求出目标值与当前量的偏差保存在iError变量中,这个偏差量将作为位置式PID运算的比例项因子。把这个偏差值加到PID结构体成员SumError计算累积误差,这个累积误差将作为PID运算的积分项因子。把偏差值减去上次偏差值的结果作为PID运算的微分项因子。

int main(void)
{
  count = 当前值;
  PWM_Duty = LocPIDCalc(count);
  //输出限幅
  if(PWM_Duty>899)
    PWM_Duty = 899;

return 0;
}
上一篇下一篇

猜你喜欢

热点阅读