增量式PID的两种计算方式及C代码 |
您所在的位置:网站首页 › 编程ijk增量值怎么算 › 增量式PID的两种计算方式及C代码 |
最近笔者在项目中需要使用到增量式PID进行电机控制,参考网上增量式PID算法,发现有两类算法的代码,便产生疑惑,究竟是哪 一种算法是正确的?——最终发现两种表达方式均为正确的! 从原理出发,分析如下: 位置式PID的离散化如下:
n-1时刻的控制量如下:
则控制量增量为:
即可得增量式PID计算公式:
其中 此为常见PID计算公式,另将公式4整理,可得:
其中 由此可见,公式4和公式5均为增量式PID的计算公式,原理一致,只是表达形式不同。两个公式的均对 综上所述,网上出现的两种增量式PID计算公式原理上均正确可行,但个人推荐公式4的形式,在实际理解和调参时都比较易于理解。 最后,附上增量式PID计算C语言代码 /* * 增量式PID计算C语言代码 * 输入参数: * CurrentPoint: 当前值 * SetPoint: 目标值 * sptr: 结构体指针,指向PID结构体变量,定义如下: * typedef struct * { * volatile double Proportion; // 比例常数 Proportional Const * volatile double Integral; // 积分常数 Integral Const * volatile double Derivative; // 微分常数 Derivative Const * volatile int Error1; // Error[n-1] * volatile int Error2; // Error[n-2] * volatile int iError; // Error[n] * }PID; * * 返回值: * PID计算增量值 */ float IncPIDCalc(int CurrentPoint,int SetPoint,PID* sptr) { float iIncpid; sptr->iError=SetPoint-CurrentPoint; // 计算当前误差 iIncpid=sptr->Proportion * (sptr->iError-sptr->Error1) // P +sptr->Integral * sptr->iError // I +sptr->Derivative * (sptr->iError-2*sptr->Error1+sptr->Error2); // D sptr->Error2=sptr->Error1; // 存储误差,用于下次计算 sptr->Error1=sptr->iError; return(iIncpid); // 返回增量值 }
|
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |