/***************定时器0***********/
void timer0(void) interrupt 1
{
//10US中断(1T模式,自装载)
num++;
if(num>=1)
num=0;
if(num<ZKB) //产生PWM
PM_out=1;
else
PM_out=0;
}
/*****************PID初始化****************/
void PID_Init()
{
ZKB=0; //输出占空比
e1=0; //本次的温度差
e2=0; //前一次温度差
e3=0; //前两次温度差
kp=10; //比例值
ki=0; //积分值
kd=6; //微分值
}
/******************PID运算*****************/
void PID_isr(void)
{
if(set_sum>temper) //如果设定温度大于实际温度
{
if(set_sum-temper>5) //如果相差5度
{
ZKB=10; //全速加热
}
else //否则进行PID运算平滑加热
{
e1=set_sum-temper;
duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
uk=uk+duk;
if(uk>10)
uk=10;
else
if(uk<-10)
uk=-10;
if(uk<0)
{
ZKB=-uk;
}
else
{
ZKB=uk;
}
e3=e2;
e2=e1;
}
}
if(temper>=set_sum) //如果实际温度大于设定温度
{
if(temper-set_sum>0) //如果实际温度与设定温度不相等
{
ZKB=0; //停止加热
}
else
{
e1=temper-set_sum;
duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3));
uk=uk+duk;
if(uk>10)
uk=10;
else
if(uk<-10)
uk=-10;
e3=e2;
e2=e1;
}
}
}
这是PID部分,这样设置有没问题?
|