📄 fuzzypid.lst
字号:
C51 COMPILER V7.50 FUZZYPID 09/16/2006 22:10:57 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FUZZYPID
OBJECT MODULE PLACED IN FuzzyPID.OBJ
COMPILER INVOKED BY: D:\SProgram\Keil\C51\BIN\C51.EXE FuzzyPID.c OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "TempCtrl.h"
2
3 #ifdef USING_FUZZYPID_CONCTRL
//-----------------------------------------------------------------------------
char FzE[2];
char FzEC[2];
//E使用梯形隶属度函数
FzFunNode code SubE[5]={
{1,2,3,4},
{2,3,4,6},
{3,5,8,7},
{4,5,8,6},
{4,4,5,8}
};
//EC使用梯形隶属度函数
FzFunNode SubEC[5]={
{1,2,3,4},
{2,3,4,6},
{3,5,8,7},
{4,5,8,6},
{4,4,5,8}
};
//输出使用单点隶属度函数
#define FP_NB 10
#define FP_NM 10
#define FP_NS 10
#define FP_ZZ 10
#define FP_PS 10
#define FP_PM 10
#define FP_PB 10
//模糊逻辑规则表
char code FzPRule[5][5]={
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
};
char code FzIRule[5][5]={
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
};
void FuzzyPidCtrl()
{
// char i;
//E模糊化
C51 COMPILER V7.50 FUZZYPID 09/16/2006 22:10:57 PAGE 2
for(i=0;i<5;i++)//寻找E的隶属度
if(Error>SubE[i].A0)
{//找到第一个隶属度函数
if(Error<=SubE[i].A1)
{//第一段
if(SubE[i].A0==(-127))
{//负无穷
FzE[0]=255;
}
else
{//
x1=255.0*(Error-SubE[i].A0)/(SubE[i].A1-SubE[i].A0);
x1+=0.5;
FzE[0]=(char)x1;
}
}
else if(Error<=SubE[i].A2)
{//第二段
FzE[0]=255;//1.0的隶属度
}
else
{//第三段
if(SubE[i].A3==127)
{//负无穷
FzE[0]=255;//1.0的隶属度
}
else
{//
x1=255-255.0*(Error-SubE[i].A2)/(SubE[i].A3-SubE[i].A2);
x1+=0.5;
FzE[0]=(char)x1;
}
}
//第二个隶属度
if(i!=4)
{//并非最后一个
i++;
if(Error<SubE[i].A0)
{
FzE[1]=0;
}
else if(Error<=SubE[i].A1)
{//第一段
x1=255.0*(Error-SubE[i].A0)/(SubE[i].A1-SubE[i].A0);
x1+=0.5;
FzE[1]=(char)x1;
}
else if(Error<=SubE[i].A2)
{//第二段
FzE[1]=255;//1.0的隶属度
}
else
{//第三段
if(SubE[i].A3==127)
{//正无穷
FzE[1]=255;//1.0的隶属度
}
else
{//
C51 COMPILER V7.50 FUZZYPID 09/16/2006 22:10:57 PAGE 3
x1=255-255.0*(Error-SubE[i].A2)/(SubE[i].A3-SubE[i].A2);
x1+=0.5;
FzE[1]=(char)x1;
}
}
}
else
{
FzE[1]=FzE[0];
FzE[1]=0;
}
break;
}//end of if
k0=i;//k0第一维
//EC模糊化
for(i=0;i<5;i++)//寻找EC的隶属度
if(dError>SubEC[i].A0)
{//找到第一个隶属度函数
if(dError<=SubEC[i].A1)
{//第一段
if(SubEC[i].A0==(-127))
{//负无穷
FzE[0]=255;
}
else
{//
x1=255.0*(dError-SubEC[i].A0)/(SubEC[i].A1-SubEC[i].A0);
x1+=0.5;
FzE[0]=(char)x1;
}
}
else if(dError<=SubEC[i].A2)
{//第二段
FzE[0]=255;//1.0的隶属度
}
else
{//第三段
if(SubEC[i].A3==127)
{//负无穷
FzE[0]=255;//1.0的隶属度
}
else
{//
x1=255.0-255.0*(dError-SubEC[i].A2)/(SubEC[i].A3-SubEC[i].A2);
x1+=0.5;
FzE[0]=(char)x1;
}
}
//第二个隶属度
if(i!=4)
{//并非最后一个
i++;
if(dError<SubEC[i].A0)
{
FzEC[1]=0;
}
if(dError<=SubEC[i].A1)
{//第一段
C51 COMPILER V7.50 FUZZYPID 09/16/2006 22:10:57 PAGE 4
x1=255.0*(dError-SubEC[i].A0)/(SubEC[i].A1-SubEC[i].A0);
x1+=0.5;
FzE[1]=(char)x1;
}
else if(dError<=SubEC[i].A2)
{//第二段
FzE[1]=255;//1.0的隶属度
}
else
{//第三段
if(SubEC[i].A3==127)
{//正无穷
FzE[1]=255;//1.0的隶属度
}
else
{//
x1=255.0-255.0*(dError-SubEC[i].A2)/(SubEC[i].A3-SubEC[i].A2);
x1+=0.5;
FzE[1]=(char)x1;
}
}
}
else
{
FzE[1]=FzE[0];
FzE[1]=0;
}
break;
}//end of if
k1=i;//k1为第二维
//△Kp反模糊化
x1= FzE[0]*FzEC[0]*FzP_Rule[k1-1][k0-1]+
FzE[1]*FzEC[0]*FzP_Rule[k1-1][k0]+
FzE[0]*FzEC[1]*FzP_Rule[k1][k0-1]+
FzE[1]*FzEC[1]*FzP_Rule[k1][k0];
x2= FzE[0]*FzEC[0]+FzE[0]*FzEC[1]+FzE[1]*FzEC[0]+FzE[1]*FzEC[1];
x1=x1/x2;//已经被放大
////△Ki反模糊化
x3= FzE[0]*FzEC[0]*FzI_Rule[k1-1][k0-1]+
FzE[1]*FzEC[0]*FzI_Rule[k1-1][k0]+
FzE[0]*FzEC[1]*FzI_Rule[k1][k0-1]+
FzE[1]*FzEC[1]*FzI_Rule[k1][k0];
// x2= FzE[0]*FzEC[0]+FzE[0]*FzEC[1]+FzE[1]*FzEC[0]+FzE[1]*FzEC[1];
x3=x3/x2;//已经被放大
//Fuzzy Output:Pi arithmetic
}
///------------------------------------------------------------------------------
#endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
C51 COMPILER V7.50 FUZZYPID 09/16/2006 22:10:57 PAGE 5
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -