- /***************定时器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部分,这样设置有没问题?
|