#define KPU 0.01
#define KIU 0.0005
#define KDU 0.1
#define KE 0.06
#define KEC 3
char code dkp[13][13]={
{6,6,6,5,4,4,4,3,3,2,0,0,0},
{6,6,6,5,4,3,3,3,3,2,0,-1,-1},
{6,6,6,5,4,3,3,3,3,2,0,-1,-2},
{5,5,5,5,4,3,3,2,2,0,-1,-1,-2},
{4,4,4,4,4,3,3,2,0,-1,-2,-2,-2},
{4,4,4,3,3,2,2,0,-1,-1,-3,-3,-3},
{4,4,4,3,3,2,0,-1,-2,-3,-3,-3,-3},
{3,3,3,2,2,0,-1,-1,-2,-3,-3,-3,-3},
{3,3,3,2,0,-1,-2,-2,-2,-3,-3,-3,-3},
{3,2,2,0,-1,-1,-3,-3,-3,-3,-3,-4,-4},
{3,2,0,-1,-2,-3,-3,-3,-3,-3,-3,-4,-6},
{2,2,0,-1,-3,-3,-3,-3,-3,-4,-4,-4,-5},
{0,0,0,-1,-3,-3,-3,-3,-3,-4,-6,-5,-6}
}; //K含糊操控表
char code dki[13][13]={{-6,-5,-6,-4,-3,-3,-3,-3,-2,-1,0,0,0},
{-5,-5,-5,-4,-3,-3,-3,-3,-2,-1,0,0,0},
{-6,-5,-6,-4,-3,-3,-2,-2,-2,-1,0,0,0},
{-5,-4,-4,-3,-3,-3,-2,-1,-1,0,2,2,2},
{-6,-4,-3,-3,-2,-2,-2,-1,0,2,3,3,3},
{-4,-4,-3,-3,-2,-1,-1,0,2,2,3,3,3},
{-3,-3,-3,-3,-2,-1,0,2,3,3,4,4,4},
{-3,-3,-3,-1,-1,0,2,2,3,3,4,5,5},
{-3,-3,-2,-1,0,2,3,3,3,3,4,5,6},
{-1,-1,-1,0,2,2,3,3,3,4,5,5,6},
{0,0,0,2,3,3,3,3,4,5,6,6,6},
{0,0,0,2,3,3,3,3,4,5,6,6,6},
{0,0,0,2,3,3,4,4,4,5,6,6,6}
};
char code dkd[13][13]={{3,0,-2,-3,-6,-5,-6,-5,-6,-4,-3,0,3},
{3,0,-2,-3,-5,-4,-4,-4,-4,-3,-3,0,2},
{3,0,-2,-3,-6,-4,-3,-3,-3,-3,-2,-1,0},
{2,0,-2,-3,-4,-4,-3,-3,-3,-3,-2,-1,0},
{0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0},
{0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0},
{0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,0},
{0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,1,-1,0,2,2,2,2,2,2,2,2,2},
{6,1,-2,0,3,3,3,3,3,3,3,4,6},
{6,2,1,2,3,3,3,3,3,3,3,4,6},
{6,5,4,4,4,4,4,3,3,3,3,4,6}
};
/*===========================================
函数功用:温度主动调理函数
============================================*/
void fuzzypid(void)
{
uchar te=0,tec=0;
float kp,ki,kd;
kp=0.35;
ki=0.001;kd=1.8;
Error = setPoint – rellytemp;
sumError+=Error;
dError =Error – LastError;
LastError=Error;
te=(uchar)(KE*Error+0.5)+6;
tec=(uchar)(KEC*dError+0.5)+6;
kp=kp+KPU*dkp[te][tec];
ki=ki+KIU*dki[te][tec];
kd=kd+KDU*dkd[te][tec];
uout=kp*Error+ki*sumError+kd*dError;
open_time=(int)(uout+0.5);
if(open_time>40)//PID限幅
open_time=40;
if(open_time<1)
open_time=0;
}