新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 模糊控制算法子程序

模糊控制算法子程序

作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
程序為模糊控制程序,基于8位單片機,為模糊控制算法程序,實現(xiàn)簡單的模糊控制,經(jīng)實踐總結(jié)得出,當調(diào)整幅度較大時,會出現(xiàn)振蕩,系統(tǒng)難以達到穩(wěn)定,這就需要更高一級的算法控制調(diào)整,當調(diào)整幅度較小時,系統(tǒng)可以很快達到穩(wěn)定。
以下為模糊算法源程序:

#include "reg52.h"
//------------------------------------------------------------------------------------
// 定義差距輸入常量
#define GAP_ZERO 0x00
#define GAP_VSMALL 0x01
#define GAP_SMALL 0x02
#define GAP_MEDIUM 0x03
#define GAP_BIG 0x04
// 定義控制輸出常量
#define TURN_ZERO 0x80
#define TURN_VSMALL 0x81
#define TURN_SMALL 0x82
#define TURN_MEDIUM 0x83
#define TURN_BIG 0x84
//-------------定義常量----------------------------------------------------------------
#define MU_MAX 0XFF //模糊度的最大值為0XFF代表面1
#define RULE_TOT 10 //規(guī)則數(shù)個數(shù)
#define MF_TOT 5 //成員函數(shù)的個數(shù)
#define IO_NUM 0x07
#define LABEL_NUM 0x70
#define DEFAULT_VALUE 0x00
//----------------定義數(shù)據(jù)庫-----------------------------------------------------------
unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:
//ZERO, VSMALL, SMALL, MEDIUM, BIG
unsigned char code input_memf[MF_TOT][4]={
// 輸入功能函數(shù)以點斜式方式存儲. 第一維成員函數(shù)標號第二維是點斜式數(shù)據(jù)
//距離功能函數(shù)
{ 0x00, 0x00, 0x00, 0x0d }, // VSLOW
{ 0x00, 0x0d, 0x14, 0x0d }, // SLOW
{ 0x1e, 0x0d, 0x32, 0x0d }, // MEDIUM
{ 0x3C, 0x0d, 0x50, 0x0d }, // FAST
{ 0x50, 0x09, 0x6e, 0x00 } // VFAST
};
//-----------定義模糊系統(tǒng)規(guī)則-----------------------------------------------------------
unsigned char code rules[RULE_TOT]={
// if... then...
GAP_ZERO,TURN_ZERO,
GAP_VSMALL,TURN_VSMALL,
GAP_SMALL,TURN_SMALL,
GAP_MEDIUM,TURN_MEDIUM,
GAP_BIG,TURN_BIG
};
//-----------定義各變量-----------------------------------------------------------------
unsigned char outputs[MF_TOT],fuzzy_out; //模糊輸出mu值
//-----------子程序函數(shù)頭申明-----------------------------------------------------------
void fuzzy_engine(uchar);
uchar compute_memval(uchar,uchar);
void defuzzify(void);

uchar compute_memval(uchar input,uchar label)
{
int data temp;
if (input < input_memf[label][0])
{ // 如果輸入不在曲線下u值為0
return 0;
}
else
{
if (input < input_memf[label][2])
{
temp=input; // 用點斜式計算mu
temp-=input_memf[label][0];
if (!input_memf[label][1])
{
temp=MU_MAX;
}
else
{
temp*=input_memf[label][1];
}
if (temp < 0x100)
{ // 如果結(jié)果不超過1
return temp; // 返回計算結(jié)果
}
else
{
return MU_MAX; // 確保mu值在范圍內(nèi)
}
}
else
{ // 輸入落在第二條斜線上
temp=input; // 用點斜式方法計算 mu
temp-=input_memf[label][2];
temp*=input_memf[label][3];
temp=MU_MAX-temp;
if (temp < 0)
{ // 確保結(jié)果不小于0
return 0;
}
else
{
return temp; // mu為正 – 返回結(jié)果
}
}
}
return 0;
}

void defuzzify(void)
{
unsigned long numerator, denominator;
unsigned char j;
numerator=0; // 恢復總數(shù)值
denominator=0;
for (j=0; j { // 計算總和值
numerator+=(outputs[j]*output_memf[j]);
denominator+=outputs[j];
outputs[j]=0; // 清零輸出作為參考使用 }
if (denominator)
{ // 確保分母是0的情況不發(fā)生
fuzzy_out=numerator/denominator; // 確定 COG
}
else
{
fuzzy_out=DEFAULT_VALUE; // 沒有規(guī)則被觸發(fā)
}
}
}

unsigned char bdata clause_val; // 保存當前的分支進行快速訪問
sbit clause_type = clause_val^7; // 表示分支是否是條件分支或者是結(jié)果分支
void fuzzy_engine(uchar input)
{
bit then; // 當正在分析結(jié)果時置位
unsigned char if_val, // 保存當前規(guī)則中條件分支中的值
clause, // 規(guī)則基中當前的分支
mu, // 保存當前分支中的值
label=0; // 被條件使用的成員函數(shù)
then=0; // 設第一個分支是條件分支
if_val=MU_MAX; // max out mu for the first rule
for (clause=0; clause { // 遍歷每條規(guī)則
clause_val=rules[clause]; // 讀入當前的分支
if (!clause_type)
{ // 當前的分支是不是條件分支
if (then)
{ // 是否正在分析結(jié)果...
then=0;
if_val=MU_MAX; // 復位mu
}
mu=compute_memval(input, label); // 得到條件分支的值
if_val=mu;
label++;
}
else
{ // 當前分支是結(jié)果
then=1; // 置位標志位,如果當前規(guī)則的mu比參考的值要大,保存這個值作為新的模糊輸出
if (outputs[clause_val&0x07] < if_val)
{
outputs[clause_val&0x07]=if_val;
}
}
}
defuzzify(); // 用COG方法計算模糊輸出和反模糊輸出
}
//------------------------------------------------------------------------------
給出模糊控制的流程圖,若想完全理解清楚其控制原理,最好還是要找想關的模糊控制理論書籍,方能理解透徹:
1.控制理論框圖
2.控制算法的總流程圖,對應模糊控制算法的程序流程圖



評論


技術專區(qū)

關閉