打印

PID控制代码,,求解读

[复制链接]
2166|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
anjaewook911|  楼主 | 2013-7-30 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多谢了!这是一个利用控制加热继电器通断时间来控制温度的程序。有点不明白的地方在程序里都注明了,,望大神不吝赐教。
/******************************
     温度比较  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算法
}
}

相关帖子

沙发
hopewise| | 2013-8-16 17:09 | 只看该作者
正想学习.Mark

使用特权

评论回复
板凳
林志财| | 2013-8-17 09:12 | 只看该作者
只能说学无止境。

使用特权

评论回复
地板
aimie| | 2013-8-17 11:18 | 只看该作者
好像 算法有点复杂。。。。没研究

使用特权

评论回复
5
linfuning| | 2013-8-17 12:04 | 只看该作者
有点兴趣

使用特权

评论回复
6
79xiaozaizai| | 2013-8-18 20:08 | 只看该作者
增量式PID

使用特权

评论回复
7
w522930954| | 2013-8-19 10:02 | 只看该作者
楼主程序看的头晕,格式能不能修改一下,大括号都找不清楚。。有个问题温度控制为什么用增量式的?还有你的温度变化的大部分情况都已经被if和else判定了,PID没法计算了。。。。只有实际温度>设定温度2度以内才进入到了PID计算范围。。

使用特权

评论回复
8
hopewise| | 2013-9-12 15:44 | 只看该作者
duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;中为啥要除以数字10啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

156

帖子

1

粉丝