位置式PID的实现

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容