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