|
struct{
float Kp;
float T;
float Ti;
float Td;
float ek; //本次偏差
float ek_1;//上次偏差
float ek_2;//上上次偏差
}pid;
void pidinit()
{
pid.Kp=3.4;//6.50
pid.T=12;
pid.Ti=109;
pid.Td=0;
}void pidcounter() //1ms中断中计数到200ms计算一次
{
pid.ek=(shedingwendu-t12wendu)/10;
EK=pid.ek-pid.ek_1;
p=pid.Kp*EK;
I=(pid.T*pid.ek)/pid.Ti;
EK2=pid.ek-2*pid.ek_1+pid.ek_2;
D=(pid.Td*EK2)/pid.T;
PIDOUT=p+(I*pid.Kp)+(pid.Kp*D);
jiareshu+=PIDOUT; //中断计数值小于加热数,t12开始加热大于就停止加热。
if(jiareshu<=0)
jiareshu=0;
pid.ek_2=pid.ek_1;
pid.ek_1=pid.ek;
}
|
|