📄 pid-fuzzy.c
字号:
unsigned int SetPoint //设定目标,应用时实际上取值该值的1/10,出现温度的0.x度
int ei; //最近1次偏差,ei=stPID.SetPoint-stPID.T_adc_data[2]
int LastError; //SetPoint-T_adc_data[1]
int delt_ei; //偏差的变化:delt_ei=PID.LastError-ei
int T_adc_data[3]; //近3次的测量值,T_adc_data[2]为最近一次
int ui; //ui:输出
int delt_ui; //增量式增量输出
char DFC_tbl[11][13]={ //增量式输出
/* -12 -10 -8 -6 -4 -2 0 +2 +4 +6 +8 +10 +12 */
/*-5*/ -5, -5, -4, -4, -3, -3, -3, -3, -3, -2, -2, -1, 0,
/*-4*/ -5, -5, -4, -3, -2, -2, -2, -2, -2, -2, -1, 0, 0,
/*-3*/ -5, -4, -3, -2, -1, -1, -1, -1, -2, -1, 0, 0, 0,
/*-2*/ -4, -3, -2, -2, -1, 0, 0, -1, -1, -1, 0, 1, 2,
/*-1*/ -3, -2, -1, -1, -1, 0, 0, 0, 1, 1, 2, 3, 4,
/* 0*/ -3, -2, -1, -1, -1, 0, 0, 2, 2, 2, 2, 3, 4,
/*+1*/ -2, -2, -1, -1, -1, 0, 0, 2, 2, 2, 2, 3, 4,
/*+2*/ 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5,
/*+3*/ 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 5,
/*+4*/ 0, 0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5,
/*+5*/ 0, 0, 0, 0, 2, 2, 3, 3, 4, 5, 5, 5, 5
};
int GetDeltFuzzyValue(int ei,int delt_ei)
{unsigned char i,j;
#define delt_M 20
if(di>delt_M) ei=delt_M;
if(di<delt_M) ei=-delt_M;
i=delt_ei+5;
j=6+ei*6/delt_M;
return DFC_table[i][j];
}
void Delt_FuzzyCtrl(void) //增量式PID,调节ui
{
#define delt_Um 50
LastError=ei; //刷新近2次偏差
ei=SetPoint-T_adc_data[2];
delt_ei=LastError-ei; //刷新偏差的变化
if(delt_ei>5) delt_ei=5;
if(delt_ei<-5) delt_ei=-5;
delt_ui=GetDeltFuzzyValue(ei,delt_ei); //采用模糊控制模型
delt_ui=delt_ui*2; //其中2是比例因子
if(delt_ui>delt_Um) delt_ui=delt_Um;
if(delt_ui<-delt_Um) delt_ui=-delt_Um;
ui+=delt_ui;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -