[应用方案] C语言实现PID算法:位置式PID和增量式PID

[复制链接]
877|0
 楼主| mnynt121 发表于 2023-10-23 08:22 | 显示全部楼层 |阅读模式



  1. typedef struct {
  2.   float Kp;                       //比例系数Proportional
  3.   float Ki;                       //积分系数Integral
  4.   float Kd;                       //微分系数Derivative

  5.   float Ek;                       //当前误差
  6.   float Ek1;                      //前一次误差 e(k-1)
  7.   float Ek2;                      //再前一次误差 e(k-2)
  8.   float LocSum;                   //累计积分位置 }PID_LocTypeDef;

  9. /************************************************ 函数名称 : PID_Loc 功    能 : PID位置(Location)计算 参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构 返 回 值 : PIDLoc -------- PID位置 作    者 : strongerHuang *************************************************/ float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
  10. {
  11.   float PIDLoc;                                  //位置

  12.   PID->Ek = SetValue - ActualValue;
  13.   PID->LocSum += PID->Ek;                         //累计误差

  14.   PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);

  15.   PID->Ek1 = PID->Ek;  return PIDLoc;
  16. }

  1. typedef struct {
  2.   float Kp;                       //比例系数Proportional
  3.   float Ki;                       //积分系数Integral
  4.   float Kd;                       //微分系数Derivative

  5.   float Ek;                       //当前误差
  6.   float Ek1;                      //前一次误差 e(k-1)
  7.   float Ek2;                      //再前一次误差 e(k-2) }PID_IncTypeDef;

  8. /************************************************ 函数名称 : PID_Inc 功    能 : PID增量(Increment)计算 参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构 返 回 值 : PIDInc -------- 本次PID增量(+/-) 作    者 : strongerHuang *************************************************/ float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
  9. {
  10.   float PIDInc;                                  //增量

  11.   PID->Ek = SetValue - ActualValue;
  12.   PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);

  13.   PID->Ek2 = PID->Ek1;
  14.   PID->Ek1 = PID->Ek;  return PIDInc;
  15. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

3357

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部