美文网首页PID
位置式PID的实现

位置式PID的实现

作者: AE_sdyang | 来源:发表于2017-05-15 19:17 被阅读536次

    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;
    }
    

    相关文章

      网友评论

        本文标题:位置式PID的实现

        本文链接:https://www.haomeiwen.com/subject/rgghxxtx.html