单片机如何写PID程序?

单片机如何写PID程序?,第1张

具体如下:

1、如果加入D抖动的特别厉害,试试只用PI控制。

2、还有PID参数都是一步一步调出来的,我建议你做个上位机,就是个简单的VB串口程序,用来设置PID参数

3、然后在单片机这边弄个串口接收程序,这里就是个简单的串口程序,人人都会,把接收到的PID存储在缓冲区里。

4、然后单片机程序直接调用。单片机带EEPROM的话,当接收到改变的PID参数时,存储这些参数。去STC官网下你的单片机资料,上面有EEPROM测试程序,直接套用。

我这有51的#include#include"global_varible.h"/*****************************************************************************模块名:PID*描述:PID调节子程序*采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。*当偏差绝对值小于△e时,用PID算法,提高稳定精度。*PIDout=kp*e(t)+ki*[e(t)+e(t-1)++e(1)]+kd*[e(t)-e(t-1)]*============================================================================*入口:无*出口:无*改变:PID_T_Run=加热时间控制*****************************************************************************/voidPID_Math(void){signedlongee1//偏差一阶//signedlongee2//偏差二阶signedlongd_out//积分输出if(!Flag_PID_T_OK)returnFlag_PID_T_OK=0Temp_Set=3700//温度控制设定值37.00度PID_e0=Temp_Set-Temp_Now//本次偏差ee1=PID_e0-PID_e1//计算一阶偏差//ee2=PID_e0-2*PID_e1+PID_e2//计算二阶偏差if(ee1>500)//一阶偏差的限制范围ee1=500if(ee1200)//积分最多累计的温差PID_e_SUM=200if(PID_e_SUM100)//如果温度相差大于1度时积分累计限制{if(PID_e_SUM>100)PID_e_SUM=100if(PID_e_SUM150)PID_e_SUM=150if(PID_e_SUM>0)//当前温度高于设定温度0.5度时削弱积分正输出d_out>>=1}PID_Out+=d_out//PID比例,积分和微分输出}elsePID_e_SUM=0PID_Out/=100//恢复被PID_Out系数放大的倍数if(PID_Out>200)PID_Out=200if(PID_Out300)//当前温度比设定温度低3度则全速加热PID_Out=200if(PID_e0<-20)//当前温度高于设定温度0.2度则关闭加热PID_Out=0Hot_T_Run=PID_Out//加热时间控制输出PID_e2=PID_e1//保存上次偏差PID_e1=PID_e0//保存当前偏差}////////////////////////////////////////////////////////////voidPID_Math()end.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11081988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存