1、float P_temp=20.0。float Kp。float Ki。float Kd。float Err=0.0。float Last_Err=0.0。float D_Err=0.0。float Sum_Err=0.0。float U=0.0。/* 函数功能:延时*/void delay_ms(uchar z) uchar i。 uchar j。 for(i=z。i0。i-) for(j=360。jj-)。 void delay_us(uchar z) i-)。void LCD_WriteData(uchar Dat) RS = 1。 P1 = Dat。 delay_us(10)。 EN
2、= 1。 EN = 0。void LCD_WriteCOM(uchar com) RS = 0。 P1 = com。void Show_Num(uchar x,uchar y,uchar n,float num) uchar a3。 uint Temp。 Temp=(int)num。 for(i=0。i=200) S_temp=200。 while(!KEY1)。 if(KEY2=0) if(KEY2=0)0) S_temp=S_temp-1。 else if(S_temp=0) S_temp=0。KEY2)。 if(KEY3=0) if(KEY3=0) if(S_temp if(U U=20
3、0。 flag=1。 U=-U。 flag=0。 /*PID参数Kp的计算 */ float fuzzy_kp(float e, float ec) /e,ec,表示误差,误差变化率 float Kp_calcu。 uchar num,pe,pec。 float code eRule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0。 /误差E的模糊论域 float code ecRule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0。 /误差变化率EC的模糊论域 float eFuzzy2=0.0,0.0。 /隶属于误差E的隶属程度 float ecFuzzy
4、2=0.0,0.0。 /隶属于误差变化率EC的隶属程度 float code kpRule4=0.0,8.0,16.0,24.0。 /Kp的模糊子集 float KpFuzzy4=0.0,0.0,0.0,0.0。 /隶属于Kp的隶属程度 int code KpRule77= /Kp的模糊控制表 3,3,3,3,3,3,3, 2,2,2,2,1,2,2, 1,1,1,1,1,1,1, 1,1,0,1,0,1,1, 0,0,1,0,0,1,0, 0,1,0,1,0,0,2, 3,3,3,3,3,3,3 。 /*误差E隶属函数描述*/ if(eeRule0) eFuzzy0 =1.0。 pe = 0
5、。 else if(eRule0=e & eeRule1) eFuzzy0 = (eRule1-e)/(eRule1-eRule0)。 else if(eRule1eRule2) eFuzzy0 = (eRule2 -e)/(eRule2-eRule1)。 pe = 1。 else if(eRule2eRule3) eFuzzy0 = (eRule3 -e)/(eRule3-eRule2)。 pe = 2。 else if(eRule3eRule4) eFuzzy0 = (eRule4-e)/(eRule4-eRule3)。 pe = 3。 else if(eRule4eRule5) eFuz
6、zy0 = (eRule5-e)/(eRule5-eRule4)。 pe = 4。 else if(eRule5eRule6) eFuzzy0 = (eRule6-e)/(eRule6-eRule5)。 pe = 5。 eFuzzy0 =0.0。 pe =5。 eFuzzy1 =1.0 - eFuzzy0。 /*误差变化率EC隶属函数描述*/ if(ececRule0) ecFuzzy0 =1.0。 pec = 0。 else if(ecRule0=ec & ececRule1) ecFuzzy0 = (ecRule1 - ec)/(ecRule1-ecRule0)。 pec = 0 。 el
7、se if(ecRule1ecRule2) ecFuzzy0 = (ecRule2 - ec)/(ecRule2-ecRule1)。 pec = 1。 else if(ecRule2ecRule3) ecFuzzy0 = (ecRule3 - ec)/(ecRule3-ecRule2)。 pec = 2 。 else if(ecRule3ecRule4) ecFuzzy0 = (ecRule4-ec)/(ecRule4-ecRule3)。 pec=3。 else if(ecRule4ecRule5) ecFuzzy0 = (ecRule5-ec)/(ecRule5-ecRule4)。 pec=
8、4。 else if(ecRule5ecRule6) ecFuzzy0 = (ecRule6-ec)/(ecRule6-ecRule5)。 pec=5。 ecFuzzy0 =0.0。 pec = 5。 ecFuzzy1 = 1.0 - ecFuzzy0。 /*查询模糊规则表*/ num =KpRulepepec。 KpFuzzynum += eFuzzy0*ecFuzzy0。 num =KpRulepepec+1。 KpFuzzynum += eFuzzy0*ecFuzzy1。 num =KpRulepe+1pec。 KpFuzzynum += eFuzzy1*ecFuzzy0。 num =K
9、pRulepe+1pec+1。 KpFuzzynum += eFuzzy1*ecFuzzy1。/*加权平均法解模糊*/ Kp_calcu=KpFuzzy0*kpRule0+KpFuzzy1*kpRule1+KpFuzzy2*kpRule2+KpFuzzy3*kpRule3。return(Kp_calcu)。PID参数Ki的计算 float fuzzy_ki(float e, float ec) float Ki_calcu。 float code kiRule4=0.00,0.01,0.02,0.03。 float KiFuzzy4=0.0,0.0,0.0,0.0。 int code KiRu
10、le77= 0,0,0,0,0,0,0, 2,0,0,0,0,0,1, /*误差隶属函数描述*/if(e /*误差变化隶属函数描述*/ /*查询模糊规则表*/ num =KiRulepepec。 KiFuzzynum += eFuzzy0*ecFuzzy0。 num =KiRulepepec+1。 KiFuzzynum += eFuzzy0*ecFuzzy1。 num =KiRulepe+1pec。 KiFuzzynum += eFuzzy1*ecFuzzy0。 num =KiRulepe+1pec+1。 KiFuzzynum += eFuzzy1*ecFuzzy1。 /*加权平均法解模糊*/ Ki_calcu=KiFuzzy0*kiRule0+KiFuzzy1*kiRule1+KiFuzzy2*kiRule2+KiFuzzy3*kiRule3。 return(Ki_calcu)。/*