大家帮我看一下我在网上找的一个单片机温度PID程序

2019-07-15 11:26发布

这程序是整个程序中PID控制部分,在中断服务部分它直接定义了i,然后直接i++,这应该有问题吧?
还有它在pID控制之后生成PWM波感觉也很有问题啊。看一看,各位前辈。
//***********************初始化***********************//void chushihua(void){dbuf[3]=24; dbuf[2]=24; dbuf[1]=24; dbuf[0]=24; display(); TMOD=0x01; TH0=(65536-200)/256; TL0=(65536-200)%256; EA=1; ET0=1; TR0=1;}//********************PID计算***********************//void pid(void){float ek,       ek1,     ek2,         ek_sum;  //本次偏差,上次偏差,上上一次偏差,偏差积分 ek=temp_set-temp; if((ek>15)||(ek==15))  {EA=0;   pwm=1;  } if((ek<0)||(ek==0))  {EA=0;   pwm=0;  } if((ek>0)&&(ek<15))    {EA=1;    ek2=ek1;    ek1=ek;    ek_sum+=ek;    uk=kp*ek+ki*ek_sum+kd*(ek1-ek2);   }}void disp_temp(void){   ReadTemperature();  if(temp<temp_l) {alm_l=0;alm_h=1;tgt=1;}  else if(temp>temp_h) {alm_l=1;alm_h=0;tgt=1;}  else if((temp>temp_set-1)&&(temp<temp_set+1)) { alm_l=1;alm_h=1;tgt=0;}  else { alm_l=1;alm_h=1;tgt=1;}   bcd(temp*10);   display();  }//********************中断服务***********************//void to(void) interrupt 1{uchar i; TH0=60536/256; TL0=60536%256; i++; if(i==uk) pwm=0; if(i==100) {pwm=1;i=0;}}void main(void){chushihua(); kp=4; ki=0.0015; kd=0; while(1) { key_set();   key_add1();   key_add10();   key_swon();   key_check();   while(flag==1)    { EA=0;          disp_temp();          pid();          key_set();          key_swon();          delayms(500);         }     delayms(550);  }}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。