欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

微分先行PID控制算法用C语言实现!

发布时间:2025/6/15 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 微分先行PID控制算法用C语言实现! 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.微分先行PID控制算法框图

 

2.微分先行PID控制算法公式

 

3.微分先行PID控制公式用C语言实现

微分先行的PID算法实现,包括位置型和增量型两种实现方式。

(1)位置型

void PIDRegulation(PID *vPID, float processValue){float thisError;float c1,c2,c3,temp;thisError=vPID->setpoint-processValue;vPID->integral+=thisError;temp= vPID-> gama * vPID-> derivativegain + vPID-> proportiongain;c3= vPID-> derivativegain/temp;c2=( vPID-> derivativegain+ vPID-> proportiongain)/temp;c1= vPID-> gama*c3;vPID->derivative=c1* vPID-> derivative+c2* processValue+c3* vPID-> lastPv;vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID-> derivative;vPID->lasterror=thisError;vPID-> lastPv= processValue;}/*定义结构体和公用体*/typedef struct{float setpoint;           //设定值float proportiongain;     //比例系数float integralgain;       //积分系数float derivativegain;     //微分系数float lasterror;          //前一拍偏差float result;             //输出值float integral;           //积分值float derivative;         //微分项float lastPv;             //前一拍的测量值float gama;               //微分先行滤波系数}PID;

(2)增量型

void PIDRegulation(PID *vPID, float processValue){float thisError;float increment;float pError,iError;float c1,c2,c3,temp;float deltaPv;temp= vPID-> gama * vPID-> derivativegain + vPID-> proportiongain;c3= vPID-> derivativegain/temp;c2=( vPID-> derivativegain+ vPID-> proportiongain)/temp;c1= vPID-> gama*c3;deltaPv= processValue- vPID-> lastDeltaPvvPID-> deltadiff =c1* vPID-> deltadiff +c2* deltaPv +c3* vPID-> lastDeltaPv;thisError=vPID->setpoint-processValue; //得到偏差值pError=thisError-vPID->lasterror;iError=thisError;increment=vPID->proportiongain*pError+vPID->integralgain*iError+ vPID-> deltadiff; //增量计算vPID->preerror=vPID->lasterror; //存放偏差用于下次运算vPID->lastDeltaPv=deltaPv;vPID->lastPv= processValue;vPID->lasterror=thisError;vPID->result+=increment;}/*定义结构体和公用体*/ typedef struct{float setpoint; //设定值float proportiongain; //比例系数float integralgain; //积分系数float derivativegain; //微分系数float lasterror; //前一拍偏差float preerror; //前两拍偏差float deadband; //死区float result; //输出值float deltadiff; /*微分增量*/float integralValue; /*积分累计量*/float gama; /*微分先行滤波系数*/float lastPv; /*上一拍的过程测量值*/float lastDeltaPv; /*上一拍的过程测量值增量*/}PID;

微分先行PID控制是只对输出量进行微分,而对给定指令不起微分作用,因此它适合于给定指令频繁升降和高频干扰的场合,可以避免指令的改变导致超调过大。

(参考http://www.cnblogs.com/foxclever/p/9159677.html)

总结

以上是生活随笔为你收集整理的微分先行PID控制算法用C语言实现!的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。