單片機(jī) 模糊控制 算法 c語言
1 #include "reg52.h"
2 //------------------------------------------------------------------------------------
3 // 定義差距輸入常量
4 #define GAP_ZERO 0x00
5 #define GAP_VSMALL 0x01
6 #define GAP_SMALL 0x02
7 #define GAP_MEDIUM 0x03
8 #define GAP_BIG 0x04
9 // 定義控制輸出常量
10 #define TURN_ZERO 0x80
11 #define TURN_VSMALL 0x81
12 #define TURN_SMALL 0x82
13 #define TURN_MEDIUM 0x83
14 #define TURN_BIG 0x84
15 //-------------定義常量----------------------------------------------------------------
16 #define MU_MAX 0XFF //模糊度的最大值為0XFF代表面1
17 #define RULE_TOT 10 //規(guī)則數(shù)個(gè)數(shù)
18 #define MF_TOT 5 //成員函數(shù)的個(gè)數(shù)
19 #define IO_NUM 0x07
20 #define LABEL_NUM 0x70
21 #define DEFAULT_VALUE 0x00
22 //----------------定義數(shù)據(jù)庫-----------------------------------------------------------
23 unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:
24 // ZERO, VSMALL, SMALL, MEDIUM, BIG
25 // 輸入功能函數(shù)以點(diǎn)斜式方式存儲(chǔ). 第一維成員函數(shù)標(biāo)號(hào)第二維是點(diǎn)斜式數(shù)據(jù)
26 unsigned char code input_memf[MF_TOT][4]={ //距離功能函數(shù)
27 { 0x00, 0x00, 0x00, 0x0d }, // VSLOW
28 { 0x00, 0x0d, 0x14, 0x0d }, // SLOW
29 { 0x1e, 0x0d, 0x32, 0x0d }, // MEDIUM
30 { 0x3C, 0x0d, 0x50, 0x0d }, // FAST
31 { 0x50, 0x09, 0x6e, 0x00 } // VFAST
32 };
33 //-----------定義模糊系統(tǒng)規(guī)則-----------------------------------------------------------
34 unsigned char code rules[RULE_TOT]={
35 // if... then...
36 GAP_ZERO,TURN_ZERO,
37 GAP_VSMALL,TURN_VSMALL,
38 GAP_SMALL,TURN_SMALL,
39 GAP_MEDIUM,TURN_MEDIUM,
40 GAP_BIG,TURN_BIG
41 };
42 //-----------定義各變量-----------------------------------------------------------------
43 unsigned char outputs[MF_TOT],fuzzy_out; //模糊輸出mu值
44 //-----------子程序函數(shù)頭申明-----------------------------------------------------------
45 void fuzzy_engine(uchar);
46 uchar compute_memval(uchar,uchar);
47 void defuzzify(void);
48 /***************************************************************************************************************/
49 uchar compute_memval(uchar input,uchar label)
50 {
51 int data temp;
52 if (input < input_memf[label][0])
53 { // 如果輸入不在曲線下u值為0
54 return 0;
55 }
56 else
57 {
58 if (input < input_memf[label][2])
59 {
60 temp=input; // 用點(diǎn)斜式計(jì)算mu
61 temp-=input_memf[label][0];
62 if (!input_memf[label][1])
63 {
64 temp=MU_MAX;
65 }
66 else
67 {
68 temp*=input_memf[label][1];
69 }
70 if (temp < 0x100)
71 { // 如果結(jié)果不超過1
72 return temp; // 返回計(jì)算結(jié)果
73 }
74 else
75 {
76 return MU_MAX; // 確保mu值在范圍內(nèi)
77 }
78 }
79 else
80 { // 輸入落在第二條斜線上
81 temp=input; // 用點(diǎn)斜式方法計(jì)算 mu
82 temp-=input_memf[label][2];
83 temp*=input_memf[label][3];
84 temp=MU_MAX-temp;
85 if (temp < 0)
86 { // 確保結(jié)果不小于0
87 return 0;
88 }
89 else
90 {
91 return temp; // mu為正 – 返回結(jié)果
92 }
93 }
94 }
95 return 0;
96 }
97 /*******************************************************************************
98 Function: defuzzify
99 Description: 計(jì)算模糊輸出的重心并調(diào)用函數(shù)把它
100 轉(zhuǎn)換成可被系統(tǒng)使用的輸出量
101 Parameters: 無.
102 Returns: 無.
103 Side Effects: outputs[][] 數(shù)組被清零.
104 *******************************************************************************/
105 void defuzzify(void)
106 {
107 unsigned long numerator, denominator;
108 unsigned char j;
109 numerator=0; // 恢復(fù)總數(shù)值
110 denominator=0;
111 for (j=0; j 112 { // 計(jì)算總和值 113 numerator+=(outputs[j]*output_memf[j]); 114 denominator+=outputs[j]; 115 outputs[j]=0; // 清零輸出作為參考使用 116 if (denominator) 117 { // 確保分母是0的情況不發(fā)生 118 fuzzy_out=numerator/denominator; // 確定 COG 119 }