温度控制的PID算法的C语言程序
我的题目是:基于 PID 算法的温度控制系统 89C51 单片机,通过键盘输入预设值,与 DS18B20 测得的实际值做比较,然后驱动制冷或加热电路。用 keil C 语言来实现 PID 的控制。 最佳答案//PID 算法温控 C 语言 2008-08-17 18:58#include #include #include #include struct PID { unsigned int SetPoint; // 设定目标 Desired Value unsigned int Proportion; // 比例常数 Proportional Const unsigned int Integral; // 积分常数 Integral Const unsigned int Derivative; // 微分常数 Derivative Const unsigned int LastError; // Error[-1] unsigned int PrevError; // Error[-2] unsigned int SumError; // Sums of Errors }; struct PID spid; // PID Control Structure unsigned int rout; // PID Response (Output) unsigned int rin; // PID Feedback () sbit data1=P1^0; sbit clk=P1^1; sbit plus=P2^0; sbit subs=P2^1; sbit stop=P2^2; sbit output=P3^4; sbit DQ=P3^3; unsigned char flag,flag_1=0; unsigned char high_time,low_time,count=0;//占空比调节参数 unsigned char set_temper=35; unsigned char temper; unsigned char i; unsigned char j=0; unsigned int s; /*********************************************************** 延时子程序,延时时间以 12M 晶振为准, 延时时间为 30us×time ***********************************************************/ void delay(unsigned char time) { unsigned char m,n; for(n=0;n>i; /*移位操作,将本次要写的位移到最低位*/ temp=temp write_bit(temp); /*向总线写该位*/ } delay(7); /*延时 120us 后*/ // TR0=1; EA=1; /*开中断*/} /*********************************************************** 读一位数据子程序 ***********************************************************/ unsigned char read_bit() { unsigned char i,value_bit; EA=0; DQ=0; /*拉低 DQ,开始读时序 */ _nop_(); _nop_(); DQ=1; /*释放总线*/ for(i=0;i>4; temper=i|j; /*获取的温度放在 temper 中*/ } /*==================================================================================================== Initialize PID Structure =====================================================================================================*/ void PIDInit (struct PID *pp) { memset ( pp,0,sizeof(struct PID)); } /*==================================================================================================== PID 计算部分 =====================================================================================================*/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) { unsigned int dError,Error; Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 积分 dError = pp->LastError - pp->PrevError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error; return (pp->Proportion * Error//比例+ pp->Integral * pp->SumError //积分项+ pp->Derivative * dError); // 微分项 } /*********************************************************** 温度比较处理子程序 ***********************************************************/ compare_temper() { unsigned char i; if(set_temper>temper) { if(set_temper-temper>1) { high_time=100; low_time=0; } else { for(i=0;i0) { high_time=0; low_time=100; } else { for(i=0;i>1; if(m==1) data1=1; else data1=0; _nop_(); clk=1; _nop_(); } } } /***************************************************** 显示子程序 功能:将占空比温度转化为单个字符,显示占空比和测得到的温度 ******************************************************/ void display() { unsigned