微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大家帮我看一下我在网上找的一个单片机温度PID程序

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

时间:10-02 整理:3721RD 点击:
这程序是整个程序中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);

  }

}



请各位看一下中断部分是怎么调节PWM的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top