資源簡介
模糊控制pid,可設(shè)定參數(shù),且有詳細(xì)注釋,學(xué)習(xí)或者移植都很方便
代碼片段和文件信息
/****************************************************************************
*
*文件名:FUZZY_PID.c
*
*功??能:此文件是模糊自適應(yīng)整定PID控制程序
*
*作??者:?Sahara
*
****************************************************************************/
#include?“fuzzy_pid.h“
/****************************************************************************
*
*文件名:FUZZY_Calc_Kp(float?efloat?ecuint16_t?e_maxuint16_t?ec_maxuint8_t?fuzzy_max)
*
*功??能:模糊處理?(具體處理依靠參數(shù)設(shè)定)
*
*作??者:?Sahara???Ekko
*?
*入口參數(shù):float?efloat?ec,e_max(誤差變化范圍為+-e_max)ec_max同理,
*
*出口參數(shù):fuzzy
*
****************************************************************************/
float?FUZZY_Calc(float?efloat?ecuint16_t?e_maxuint16_t?ec_maxuint8_t?fuzzy_max)
{
float?eRule[7]??=?{-e_max?-e_max?*?0.667f?-e_max?*?0.333f?0?e_max?*?0.333f?e_max?*?0.667f?e_max};
float?ecRule[7]?=?{-ec_max?-ec_max?*?0.667f?-ec_max?*?0.333f?0?ec_max?*?0.333f?ec_max?*?0.667f?ec_max};
float?uRule[7]??=?{fuzzy_max?fuzzy_max?*?0.667f?fuzzy_max?*?0.333f?0?fuzzy_max?*?0.333f?fuzzy_max?*?0.667f?fuzzy_max};
float?eFuzzy[7];
float?eFuzzy_Out[6];
float?ecFuzzy[7];
float?ecFuzzy_Out[6];
float?uFuzzy[7];
int???PePec;
float?Rule[7][7];
float?a1?a2;//生成模糊規(guī)則表的可調(diào)因子
??float?fuzzy;?//輸出值
/*int?Rule[6][6]={{3?2?2?1?0?0}
{3?2?1?1?0?-1}
{2?2?1?0?-1?-1}
{2?1?0?-1?-2?-2}
{1?0?-1?-1?-2?-2}
{0?-1?-2?-2?-2?-3}
};
*/
/*int?Rule[7][7]={{3?3?2?2?1?0?0}
{3?3?2?1?1?0?-1}
{2?2?2?1?0?-1?-1}
{2?2?1?0?-1?-2?-2}
{1?1?0?-1?-1?-2?-2}
{1?0?-1?-2?-2?-2?-3}
{0?0?-2?-2?-2?-3?-3}
};
*/
int?ij;
for(i=0;i<7;i++)
{
eFuzzy[i]=0;
}
for(i=0;i<7;i++)
{
ecFuzzy[i]=0;
}
for(i=0;i<7;i++)
{
uFuzzy[i]=0;
}
for(i=0;i<2;i++)
{
eFuzzy_Out[i]=0;
}
for(i=0;i<2;i++)
{
ecFuzzy_Out[i]=0;
}
/****************************************************************************
*
*?誤差隸屬函數(shù)描述
*?誤差隸屬函數(shù)的描述采用三角形隸屬函數(shù)描述
*
****************************************************************************/
if(e? {
eFuzzy_Out[0]?=?1.0;
Pe?=?0;
}
else?if(e?>?eRule[0]?&&?e? {
eFuzzy[0]?=?(e?-?eRule[1])/(eRule[0]?-?eRule[1]);
eFuzzy[1]?=?(e?-?eRule[0])/(eRule[1]?-?eRule[0]);
eFuzzy_Out[0]?=?eFuzzy[0]?>?eFuzzy[1]???eFuzzy[0]?:?eFuzzy[1];
Pe?=?0;
}
else?if(e?>?eRule[1]?&&?e? {
eFuzzy[1]?=?(e?-?eRule[2])/(eRule[1]?-?eRule[2]);
eFuzzy[2]?=?(e?-?eRule[1])/(eRule[2]?-?eRule[1]);
eFuzzy_Out[1]?=?eFuzzy[1]?>?eFuzzy[2]???eFuzzy[1]?:?eFuzzy[2];
Pe?=?1;
}
else?if(e?>?eRule[2]?&&?e? {
eFuzzy[2]?=?(e?-?eRule[3])/(eRule[2]?-?eRule[3]);
eFuzzy[3]?=?(e?-?eRule[2])/(eRule[3]?-?eRule[2]);
eFuzzy_Out[2]?=?eFuzzy[2]?>?eFuzzy[3]???eFuzzy[2]?:?eFuzzy[3];
Pe?=?2;
}
else?if(e?>?eRule[3]?&&?e? {
eFuzzy[3]?=?(e?-?eRule[4])/(eRule[3]?-?e
評論
共有 條評論