欢迎来到天天文库
浏览记录
ID:49761836
大小:57.00 KB
页数:16页
时间:2020-03-04
《PID算法完全讲解.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、.PID算法完全讲解#includetypedefunsignedchar uChar8; typedefunsignedint uInt16;typedefunsignedlongint uInt32; sbitConOut=P1^1; //加热丝接到P1.1口 typedefstructPID_Value{ uInt32liEkVal[3]; //差值保存,给定和反馈的差值 uChar8uEkFlag[3]; //符号,1则对应的为
2、负数,0为对应的为正数 uChar8uKP_Coe; //比例系数 uChar8uKI_Coe; //积分常数 uChar8uKD_Coe; //微分常数 uInt16iPriVal; //上一时刻值 uInt16iSetVal; //设定值 uInt16iCurVal; //实际值}PID_ValueStr; PID_ValueStrPID;
3、 //定义一个结构体,这个结构体用来存算法中要用到的各种数据页脚.bitg_bPIDRunFlag=0; //PID运行标志位,PID算法不是一直在运算。而是每隔一定时间,算一次。/*********************************************************/*函数名称:PID_Operation() /*函数功能:PID运算 /*入口参数:无(隐形输入,系数、设定
4、值等) /*出口参数:无(隐形输出,U(k))/*函数说明:U(k)+KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)] *********************************************************/voidPID_Operation(void){ uInt32Temp[3]={0}; //中间临时变量 uInt32Po
5、stSum=0; //正数和 uInt32NegSum=0; //负数和 if(PID.iSetVal>PID.iCurVal) //设定值大于实际值否? { if(PID.iSetVal-PID.iCurVal>10) //偏差大于10否?页脚. PID.iPriVal=100; //偏差大于10为上限幅值输出(全速加热) else
6、 //否则慢慢来 { Temp[0]=PID.iSetVal-PID.iCurVal; //偏差<=10,计算E(k) PID.uEkFlag[1]=0; //E(k)为正数,因为设定值大于实际值 /*数值进行移位,注意顺序,否则会覆盖掉前面的数值*/ PID.liEkVal[2]=PID.liEkVal[1]; PID.liEkVal[1]=P
7、ID.liEkVal[0]; PID.liEkVal[0]=Temp[0]; /*===================================================================*/ if(PID.liEkVal[0]>PID.liEkVal[1]) //E(k)>E(k-1)否? { Temp[0]=PID.liEkVal[0]-PID.liEkVa
8、l[1]; //E(k)>E(k-1) PID.uEkFlag[0]=0; //E(k)-E(k-1)为正数页脚. }
此文档下载收益归作者所有