多谢了!这是一个利用控制加热继电器通断时间来控制温度的程序。有点不明白的地方在程序里都注明了,,望大神不吝赐教。
/******************************
温度比较 PID算法
*******************************/
void pid_ys()
{
if(rltemp<settemp) // 如果实际温度小于设定值
{
if(settemp-rltemp>20) // 如果相差2度
{
hightime=100; //全速加热
}
else //否则运行PID算法进行平滑加热
{
e1 = settemp-rltemp;
duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
uk = uk+duk;
if(uk>100)
uk = 100;
else if(uk<-100)//uk为什么会是负数,,如果控制定时器产生高电平时间的话,怎么会是负数呢?
uk = -100;
if(uk<0)
{
hightime=-uk;//为什么直接对负数取相反数呢?
}
else
{
hi ghtime=uk;
}
e3 = e2;
e2 = e1;
}
}
if(rltemp>=settemp) // 如果实际温度大于设定值
{
if(rltemp-settemp>0) //只要实际温度与设定值有偏差
{
hightime=0; //停止加热
}
else //其他情况运行PID算法,但参数与前面的刚好相反
{
e1 = rltemp-settemp;
duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
uk = uk+duk;
if(uk>100)
uk = 100;
else if(uk<-100)
uk = -100;
if(uk<0)
{
hightime=100-(-uk);
}
else
{
hightime=100-uk;
} //这一段的情况是什么情况呢?是测量温度和设定温度相等吗?处理方法不能理解。。。
e3 = e2;
e2 = e1;
}
}
}
/******************************
主函数
*******************************/
void main()
{
uint i;
time_init();//定时器初始化
Pid_init(); // PID初始化
lcd_init(); // LCD初始化
table1[5]=0x43;
table1[4]=0xdf;
table1[2]=0x2e; //小数点 摄氏度符号ASCII码
for(i=0;i<15;i++) //带循环第一行显示"Real-time Temp:"
{
write_data(table);
delay(20);
}
while(1)
{
t=data1*196/100;
table1[3]=(t%100)%10+0x30;
table1[1]=(t%100)/10+0x30;
table1[0]=t/100+0x30; //以上温度数据转化
rltemp = t; //给PID算法装载实际值
write_com(0x80+0x45);//写LCD第二行的初地址
for(i=0;i<6;i++) //该循环显示温度值
{
write_data(table1);
delay(20);
}
pid_ys();//运行温度比较 PID算法
}
}
|