这程序是整个程序中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); }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>