大家帮我看一下我在网上找的一个单片机温度PID程序
还有它在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);
}
}
请各位看一下中断部分是怎么调节PWM的