?? 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 + -