单片机 模糊控制 算法 c语言

发布者:中和子最新更新时间:2017-01-18 来源: eefocus关键字:单片机  模糊控制 手机看文章 扫描二维码
随时随地手机看文章

  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            //规则数个数

 18 #define MF_TOT 5               //成员函数的个数

 19 #define IO_NUM 0x07

 20 #define LABEL_NUM 0x70

 21 #define DEFAULT_VALUE 0x00

 22 //----------------定义数据库-----------------------------------------------------------

 23 unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:

 24                                                             // ZERO, VSMALL, SMALL, MEDIUM, BIG

 25                                                             // 输入功能函数以点斜式方式存储. 第一维成员函数标号第二维是点斜式数据

 26 unsigned char code input_memf[MF_TOT][4]={                  //距离功能函数

 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 //-----------定义模糊系统规则-----------------------------------------------------------

 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 //-----------子程序函数头申明-----------------------------------------------------------

 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;              // 用点斜式计算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              {                     // 如果结果不超过1

 72                 return temp;       // 返回计算结果

 73              }

 74              else

 75              {

 76                 return MU_MAX;     // 确保mu值在范围内

 77              }

 78         }

 79         else

 80         {                           // 输入落在第二条斜线上

 81             temp=input;               // 用点斜式方法计算 mu

 82             temp-=input_memf[label][2];

 83             temp*=input_memf[label][3];

 84             temp=MU_MAX-temp;

 85             if (temp < 0)

 86             {                      // 确保结果不小于0

 87                   return 0;

 88             }

 89             else

 90             {

 91                   return temp;        // mu为正 – 返回结果

 92             }

 93         }

 94     }

 95     return 0;

 96 }

 97 /*******************************************************************************

 98 Function: defuzzify

 99 Description: 计算模糊输出的重心并调用函数把它

100              转换成可被系统使用的输出量

101 Parameters: 无.

102 Returns: 无.

103 Side Effects: outputs[][] 数组被清零.

104 *******************************************************************************/

105 void defuzzify(void)

106 {

107     unsigned long numerator, denominator;

108     unsigned char j;

109     numerator=0;                         // 恢复总数值

110     denominator=0;

111     for (j=0; j

112     {                                // 计算总和值

113         numerator+=(outputs[j]*output_memf[j]);

114         denominator+=outputs[j];

115         outputs[j]=0;                        // 清零输出作为参考使用

116         if (denominator)

117         {                                     // 确保分母是0的情况不发生

118             fuzzy_out=numerator/denominator;  // 确定 COG

119         }

120         else

121         {

122             fuzzy_out=DEFAULT_VALUE;         // 没有规则被触发

123         }

124     }

125 }

126 /*******************************************************************************

127 Function: fuzzy_engine

128 Description: 实施规则基中的规则

129 Parameters: 无

130 Returns: 无.

131 Side Effects: 无

132 ********************************************************************************/

133 unsigned char bdata clause_val;                        // 保存当前的分支进行快速访问

134 sbit clause_type = clause_val^7;                       // 表示分支是否是条件分支或者是结果分支

135 void fuzzy_engine(uchar input)

136 {

137     bit then;                                       // 当正在分析结果时置位

138     unsigned char if_val,                           // 保存当前规则中条件分支中的值

139                   clause,                           // 规则基中当前的分支

140                       mu,                           // 保存当前分支中的值

141                  label=0;                           // 被条件使用的成员函数

142                   then=0;                           // 设第一个分支是条件分支

143            if_val=MU_MAX;                           // max out mu for the first rule

144     for (clause=0; clause

145     {                                               // 遍历每条规则

146         clause_val=rules[clause];                   // 读入当前的分支

147         if (!clause_type)

148         {                                           // 当前的分支是不是条件分支

149             if (then)

150             {                                       // 是否正在分析结果...

151                 then=0;

152                 if_val=MU_MAX;                      // 复位mu

153             }

154             mu=compute_memval(input, label);        // 得到条件分支的值

155             if_val=mu;

156             label++;

157         }

158         else

159         {                                       // 当前分支是结果

160             then=1;            // 置位标志位,如果当前规则的mu比参考的值要大,保存这个值作为新的模糊输出

161             if (outputs[clause_val&0x07] < if_val)

162             {

163                 outputs[clause_val&0x07]=if_val;

164             }

165         }

166     }

167     defuzzify(); // 用COG方法计算模糊输出和反模糊输出

168  }


关键字:单片机  模糊控制 引用地址:单片机 模糊控制 算法 c语言

上一篇:基于单片机的电子密码锁的实现
下一篇:用51单片机模拟I2C接口实例

推荐阅读最新更新时间:2024-03-16 15:31

8位MCU微控制器)体系架构特征及设计原则
1.引言 微控制器(Microcontroller)自上世纪70年代出现以来,在将近30年的时间里得到了迅猛的发展和广泛的应用。随着微电子技术的飞速发展,微控制器以其性能好、体积小、价格优、功能齐全等突出优点被广泛应用于家用电器、计算和外设、通讯、工业控制、自动化生产、智能化设备以及仪器仪表等领域,成为科研、教学、工业技术改造最得力的工具。从最初采用普林斯顿结构的简单微控制器到现在普遍采用哈佛总线结构的RISC微控制器,微控制器取得了飞速的发展 。 8位微控制器是目前应用数量最大的微控制器,也是目前最多公司致力耕耘的市场;其市场及价格竞争都极为激烈,各种多功能需求以及不同规格的产品推陈出新的速度也极为快速。随着集成电路和半导体
[单片机]
基于模糊单片机的温控系统设计
0 引 言   压电复合材料作为一种智能材料,在航天、航空、工业控制及制造等方面获得了广泛的应用。但是,能否对压电复合材料极化时的温度进行准确的控制是影响压电复合材料性能的重要因素,在本系统中采用模糊控制的方法,利用模糊单片机NLX230对极化温度进行控制。   NLX230是美国Neura Logic公司模糊单片机系统的一种基本型号,采用1.25微米COMS40脚DIP封装,具有很强的模糊逻辑处理能力,并行处理速度达3000万条/秒规则。它有和外部计算机的接口电路、外部EEPROM接口电路和振荡接口电路,通过这些接口,可以和外部计算机进行有关信息的传递,能够完成对温度、位移等参量的精确控制。 1 NLX230的结构特点   NL
[单片机]
基于模糊<font color='red'>单片机</font>的温控系统设计
平凡单片机教学 第二十三讲 动态扫描显示接口
动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,
[单片机]
平凡<font color='red'>单片机</font>教学 第二十三讲 动态扫描显示接口
瑞萨电子扩充RX130 MCU产品线 提高触控式家电与工业自动化
2018年1月29日,日本东京讯 – 瑞萨电子株式会社(TSE:6723)今日宣布推出38款新型微控制器(MCU),扩充其 RX130系列 产品线。新产品将存储容量提升至256KB, 384KB和512KB, 同时将封装管脚增至100管脚,以提升性能并增强与其触控应用产品RX231/RX230系列的兼容性。超低功耗、低成本的RX130系列产品为触控式家电以及需要3V或5V系统控制与低功耗的楼宇和工业自动化应用提供了更高的灵敏度和性能。新型32位RX130 MCU采用了新型电容式触控IP,支持更高的灵敏度和稳健性,并配备了全面的器件评估环境,非常适合用于具有挑战性的、非传统触控材料设计的设备,或者需要在潮湿或不洁环境中运行的设备,
[半导体设计/制造]
瑞萨电子扩充RX130 <font color='red'>MCU</font>产品线 提高触控式家电与工业自动化
常用单片机优缺点详细剖析
单片机现在可谓是铺天盖地,种类繁多,让开发者们应接不暇,发展也是相当的迅速,从上世纪80年代,由当时的4位8位发展到现在的各种高速单片机…… 各个厂商们也在速度、内存、功能上此起彼伏,参差不齐~~同时涌现出一大批拥有代表性单片机的厂商:Atmel、TI、ST、MicroChip、ARM…国内的宏晶STC单片机也是可圈可点… 下面为大家带来51、MSP430、TMS、STM32、PIC、AVR、STC单片机之间的优缺点比较及功能体现…… 51单片机 应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称
[单片机]
51单片机使用C语言点亮闪烁LED灯
导语 下面是点亮51单片机使用C语言闪烁LED灯的的一段代码,也是我们迈入C51的第一步。我们将从头开始,一步步讲解下面的程序。 #include #define uchar unsigned char #define uintunsigned int sbit LED= P1^0; void main() { LED=0; while(1) { LED=0; delay(1000); LED=1; delay(1000); } } void delay(uchar ms) { uint x=0, y=0; for(x=xms;x =0;x--) for(y=110;y =0;y--); } .C to .Hex 在从编写
[单片机]
瑞萨电子发布R8C/Lx系列低功耗MCU新品
瑞萨电子株式会社(TSE:6723,以下简称瑞萨电子)于2010年9月13日正式宣布发布56个R8C/Lx系列新款8位微控制器。新R8C/LAxA产品族采用公司的低功耗K0(8位)和K0R(8位)MCU,可提供业界同类产品中最低的功耗。R8C/Lx MCU将包括整体的4族产品,涉及32引脚至80引脚以及高达64KB的可编程闪存。首款产品的样品计划于2010年第三季度提供,其余产品将在其后进行供应。 除了降低电流损耗外,4族产品还可提供一些新的特性,从而有助于降低系统的整体功耗。例如,其采用了1.8V工作电压的片上闪存和两种掉电模式,从而在MCU待机的过程中有效的降低了电流损耗。 下表列出了4族产品的一些主要区别。具
[单片机]
51单片机与NRF24L01数据口连接问题解决
很多朋友在调试NRF24L01时,肯定遇到这样的问题,NRF24L01供电是3.3V,最大电压不能超过3.6V,但是89C51电压是5V。NRF24L01电源是好解决,加一个117(3.3V的LDO)就可以了,但是数据口电压怎么解决呢?在网上看到很多人说加一个限流电阻就可以,我在调试时,就用了这个方法,但是用万用表测数据口电压,竟然有4.几V。哎~~~~又报费了一个NRF24L01芯片,最后问了一个硬件工程师,他说是因为电流倒灌所致。解决方法:在每个数据口加一个10K下拉电阻即可,于是我按着他的方法试了一下,果然每个数据口的电压都在3.3V以下。希望朋友们能看到我这篇文章,按这种方法可以解决给你经济损失。 以下是连接图:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved