您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 模糊PID-C语言程序
C语言PID演示程序#includestring.h#includestdio.htypedefstructPID{doubleCommand;//输入指令doubleProportion;//比例系数doubleIntegral;//积分系数doubleDerivative;//微分系数doublepreErr;//前一拍误差doublesumErr;//误差累积}PID;doublePIDCale(PID*p,doublefeedback){doubledErr,Err;Err=p-Command-feedback;//当前误差p-sumErr+=Err;//误差累加dErr=Err-p-preErr;//误差微分p-preErr=Err;return(p-Proportion*Err//比例项+p-Derivative*dErr//微分项+p-Integral*p-sumErr);//积分项}voidPIDInit(PID*p){memset(p,0,sizeof(PID));//初始化}typedefstructmotor{doublelastY;doublepreY;doublelastU;doublepreU;}motor;voidmotorInit(motor*m){memset(m,0,sizeof(motor));}doublemotorCal(motor*m,doubleu){doubley=1.9753*m-lastY-0.9753*m-preY+0.00003284*u+0.00006568*m-lastU+0.00003284*m-preU;//二阶系统m-preY=m-lastY;m-lastY=y;m-preU=m-lastU;m-lastU=u;returny;}voidmain(){FILE*fp=fopen(data.txt,w+);PIDsPID;motorm_motor;intk=0;doubleu;doubley=0;PIDInit(&sPID);sPID.Proportion=2;sPID.Derivative=1;sPID.Integral=0.00001;sPID.Command=10;motorInit(&m_motor);while(k=1000){•fprintf(fp,%d设定值=%f被控量=%f偏差=%f控制量=%f\n,k,sPID.Command,y,sPID.Command-y,u);u=PIDCale(&sPID,y);y=motorCal(&m_motor,u);k++;}printf(%f\n,y);fclose(fp);}增量式PID控制C语言代码增量式PID控制C语言代码//////////////////////////////////////////////////////////////////定义PID参数结构体///////////////////////////////////////////////////////////////typedefstructPID{//结构体定义intSetPoint//设定值intProportion;//Proportion比例系数intIntegral;//Integral积分系数intDerivative;//Derivative微分系数intLastError;//Error[-1]前一拍误差intPreError;//Error[-2]前两拍误差}PID;main(){PIDvPID;//定义结构变量名PIDInit(&vPID);//InitializeStructurevPID.Proportion=10;//SetPIDCoefficientsvPID.Integral=10;//SetPIDIntegralvPID.Derivative=10;//SetPIDDerivativevPID.SetPoint=//根据实际情况设定while(1){Verror=Measure();//得到AD的输出值Error=vPID.SetPoint-Verror;//与设定值比较,得到误差值tempi=PIDCal(&vPID,Error;laser.Value+=tempi;//Value与Num[2]为共同体,共同体名laserLASERH=laser.Num[0];LASERL=laser.Num[1];}}/////////////////////////////////////////////////////////////////////////Title:PID参数初始化//Description:Proportion=0//Integral=0//LastError=0//Input:PID的P、I控制常数和之前的误差量(PID*pp)//Return://////////////////////////////////////////////////////////////////////voidPIDInit(PID*pp)//PID参数初始化,都置0{memset(pp,0,sizeof(PID));//memset()的函数,它可以一字节一字节地把整个数组设置为一个指定的值。//memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,//第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。//其函数原型为:void*memset(void*,int,unsigned);//头文件string.h}/////////////////////////////////////////////////////////////////////////Title:增量式PID算法程序//Description:给出一个误差增量//Input:PID的P、I控制常数和之前的误差量(PID*pp)&当前误差量(ThisError)//Return:误差增量templ//////////////////////////////////////////////////////////////////////intPIDCal(PID*pp,intThisError){//增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量)intpError,dError,iError;longtempl;pError=ThisError-pp-LastError;iError=ThisError;dError=ThisError-2*(pp-LastError)+pp-PreError;//增量计算templ=pp-Proportion*pError+pp-Integral*iError+pp-Derivative*dError;//增量//存储误差用于下次运算pp-PreError=pp-LastError;pp-LastError=ThisError;return((int)(templ8));}
本文标题:模糊PID-C语言程序
链接地址:https://www.777doc.com/doc-4833248 .html