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);/*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1