首页 即热式电热水器模糊控制器的设计

即热式电热水器模糊控制器的设计

举报
开通vip

即热式电热水器模糊控制器的设计毕  业  设  计 题    目:   即热式电热水器模糊控制器的设计                        系:        电气与信息工程系              专业: 自动化 班级: XXXX 学号:XXXX 学生姓名:          XXX                导师姓名:            XX                完成日期:          2006年06月            诚  信  声  明 本人声明: 1、本人所呈交的毕业设计(论文)...

即热式电热水器模糊控制器的设计
毕  业  设  计 题    目:   即热式电热水器模糊控制器的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计                         系:        电气与信息工程系              专业: 自动化 班级: XXXX 学号:XXXX 学生姓名:          XXX                导师姓名:            XX                完成日期:          2006年06月            诚  信  声  明 本人声明: 1、本人所呈交的毕业设计(论文)是在老师指导下进行的研究工作及取得的研究成果; 2、据查证,除了文中特别加以标注和致谢的地方外,毕业设计(论文)中不包含其他人已经公开发表过的研究成果,也不包含为获得其他教育机构的学位而使用过的材料; 3、我承诺,本人提交的毕业设计(论文)中的所有内容均真实、可信。 作者签名:                    日期:2006年06月15日 毕业设计(论文)任务书 题目:                      即热式电热水器模糊控制器的设计                    一、 基本任务及要求: 采用模糊控制算法实现热水器的温控,利用热敏电阻检测电热水器出水口温度,根据  出水口温度与设定温度的差值及该差值随时间的变化率实施模糊逻辑控制。            1.阐述恒温模糊控制的原理;                                                2.基于单片机恒温模糊控制系统硬件结构的设计;                              3.控制系统软件的编制;                                                    4.绘制硬件结构图和软件流程图;                                            5.说明书的编制;                                                          二、 进度安排及完成时间: 2月20日——3月10日: 查阅资料、撰写文献综述、撰写开题报告                  3月13日——3月25日:毕业实习、撰写实习报告                                  3月27日——5月30日:毕业设计                                                4月中旬:毕业设计中期抽查                                                      6月1日——6月14日:撰写毕业设计说明书(论文)                              6月15日——6月17日:修改、装订毕业设计说明书(论文),并将电子文档上传 FTP。 6月17日——6月20日:毕业设计答辩                                            前言 即热式电热水器又称快热型,就是让通过机体的水流即刻转化成理想水温的热水器。它的问世是家用电热器具领域一次新的进步,弥补了其它热水器的不足,属传统型热水器的替代产品,是家庭、公用住宅、小型饭店、宾馆理想的配套服务设施。 即热式电热水器在国外使用相当广泛,尤其是在欧美和东南亚地区。前些年,即热式产品在国内市场上曾经出现过一段时间,由于当时国内电力条件不成熟,对大功率的电器产品一般无法正常使用,也没有好技术来保证其质量与安全,种种因素限制了其在国内的发展。近几年来,随着人们生活水平的不断提高,国家电网改造和相关法规的出台,电力工业迅速发展,预示了即热式产品在国内的广阔前景。根据国家住宅设计规范(GF500%一1999)现有商品住房的电器线路导线必须采用铜芯线,每套住宅进线截面积不小于1 Omm},分支引线不得小于2.5m2,电表规格不得小于20 (40) A,所以现购新 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 住宅用户,都有条件使用上述这种安全、方便的即热式电热水器,确保产品万无一失,安全系数达100%, 通过检测,即热式比传统的热水器可节省40%的能耗,用多少热水加热多少,没有热水用不完时的浪费和使用中途热水供应不足的现象,热水利用率100%,因为它既不需要提前预热,也不需保温,省去了大量的额外开支,给用户带来真正的实惠。即热式产品作为新型环保产品在我国广泛使用己是大势所趋,符合现代消费潮流。 目录 摘要    I Abstract    II 第1章  绪论    1 1.1 本研究课题的学术背景及理论与实际意义    1 1.2 本研究课题研究内容和 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载     1 1.2.1 研究内容    1 1.2.2 研究方法    2 第2章  硬件电路总体设计    3 2.1 总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载     3 2.2 各单元电路设计    3 2.2.1 PIC16C7B 简介    3 2.2.2 复位电路设计    6 2.2.3 数据显示    6 2.2.4 键盘设计    7 2.2.5 温度检测电路设计    8 2.2.6 PWM输出电路设计    9 2.2.7 整流和稳压电路设计    10 2.2.8 同步信号检测电路    10 第3章  系统软件设计    12 3.1 软件总体方案    12 3.1.1 温度检测部分    12 3.1.2 模糊算法部分    14 3.1.3 脉宽调制(PWM)部分    23 3.2 各子模块程序设计    24 3.2.1 主程序设计    24 3.2.2 总中断服务程序设计    25 3.2.3 定时器1中断服务程序设计    27 3.2.4 定时器0中断服务程序设计    28 3.2.5 AD转换中断服务程序设计    29 3.2.6 B口电平变化中断程序设计    29 3.2.7 液晶显示程序设计    30 3.3  仿真结果    32 结束语    33 参考文献    34 致谢    35 附录A  模糊控制器源程序    36 附录B  模糊控制仿真程序    55 附录C  控制器原理图    58 附录D  控制器PCB图    59 即热式电热水器模糊控制器的设计 摘要:本系统以单片机为核心,辅以键盘,显示电路,利用热敏电阻对热水器出口温度进行检测,将温度转换成电压,并将其反馈到单片机,经与温度给定值比较,选择温度的误差和误差的变化率为模糊控制器的输入,采用模糊算法后,输出相应的PWM脉冲,实现对热水器温度的控制,控制器具有数字给定,步进调整,热水器给定温度,实际温度和当前时间实时显示,故障显示及报警等功能,该系统还具有人机交互性好,精度高,操作简单等优点。 关键字:模糊控制 单片机 PWM 温度 The Design of Fuzzy Controller of Water Heater Abstract:With a single-chip microcomputer as the key,complimented by keyboard and LCD display,the water heater fuzzy controller is designed in this system.After beening converned to voltage,the value of temperature detected  by thermistor of the water heater is feedback to the single-chip microcomputer and compared with the given temperature.After adopting fuzzy algorithm,the single chip microcomputer output PWM pulse to achieve the control of water temperature.The fuzzy controller has the function of given digital,step adjusting,real-time display of the given temperature,current temperature and current time,fault and alarm display.The system has some advantages of good human-computer interaction and simple operation. Keywords: Fuzzy control, Single-chip microcomputer, PWM ,Temperature 第1章  绪论 1.1 本研究课题的学术背景及理论与实际意义 近年来,热水器行业的发展趋势可以用一句话来概括,即仍将呈现出以电热水器为主导,燃气热水器为辅助,太阳能热水器为补充,三者互相共生。对电热水器而言,它具有安全、环保的特点,而且全国电网的改造、电的普及、电价的大幅度下调,以及用电设施的改善,均为电热水器的迅速普及提供了便利的条件。尤其三峡工程的建设、核电站的建设,更是为电热水器的推广和普及起到了助推剂的作用。电热水器对安装的要求也比较简单,它不受空间限制,可以因地制宜。模糊控制(Fuzzy Control),是以模糊集合论、模糊语言变量和模糊逻辑推理为基础的一种计算机数字控制技术。模糊控制实质上是一种非线性控制,模糊控制的一大特点是既具有系统化的理论,又有着大量实际应用背景。近 20多年来,模糊控制不论从理论上还是技术上都有了长足的进步,成为自动控制领域中一个非常活跃而又硕果累累的分支。其典型应用的例子涉及生产和生活的许多方面,例如在家用电器设备中有模糊热水器,洗衣机、空调、微波炉、吸尘器、照相机和摄录机等;在工业控制领域中有水净化处理、发酵过程、化学反应釜、水泥窑炉等的模糊控制;在专用系统和其它方面有地铁靠站停车、汽车驾驶、电梯、自动扶梯、蒸汽引擎以及机器人的模糊控制等。 模糊控制比传统的PID等控制方法,在强时变、大时滞、非线性系统中的控制效果有着明显的优势。将模糊控制技术应用于家电产品在国外已是很普遍的现象。单片机是家用电器常用的控制器件,把二者结合起来,可使控制器的性能指标达到最优的目的。基于模糊控制技术的单片机控制的电热水器,是对传统的电热水器开关控制的改造,具有达到设定温度的时间短、稳态温度波动小、反应灵敏、抗干扰能力强、节省电能等优点。 1.2 本研究课题研究内容和方法 1.2.1 研究内容 该热水器的工作原理为:温度传感器及有关电路将电热水器出口温度转化为电压,单片机利用本身具有的AD转换器将测得的模拟量转换为数字量,再转化为与之对应的温度值。与设定的温度相比较后,以偏差及其变化量为输入、加热量为输出,通过模糊控制算法,就可达到温度自调的目的,并加以显示。 基于以上原理,该电热水器将实现如下的功能: 1、对温度精确控制,采用高性能的温敏电阻实时采集热水器内水温,将温度信号转变为电压信号后送单片机处理,可用LCD进行实时显示. 2、能显示当前的时间,热水器的实际温度。 3、自动检测热水器是否处于正常工作状态,并具有调温、恒温、防超高温等多项自检功能,使用户在使用过程中安全更有保障。 1.2.2 研究方法 本控制系统主要完成数据采集,温度显示,水温控制,故障检测以及报警等功能,智能模糊控制器由单片机,采用模糊控制算法进行过程控制,加热装置采用双向可控硅控制,由单片机输出通断率控制信号,产生可控硅的过零触发脉冲。 整个系统的核心是模糊控制器,PIC16C74单片机是控制器的主体。它与若干扩展电路构成处理器模块。由热敏电阻组成的桥式测温电路输出的信号经过变送器转换成0-5V的标准信号,再将此信号送给单片机,由于PIC16C74单片机本身有AD转换器,这样省略了外加AD转换器。单片机根据输入的各种命令,通过模糊控制算法计算控制量,输出脉冲触发信号,通过过零触发电路驱动双向可控硅,从而控制热水器的加热装置,此外,智能控制器还包括故障检测电路,液晶显示以及电源等。 模糊控制是一种基于规则的控制。它直接采用语言型控制规则,出发点是现场操作人员的控制经验或相关专家的知识,在设计中不需要建立被控对象的精确数学模型,因而使得控制机理和策略易于接受与理解,设计简单,便于应用。 由工业过程的定性认识出发,比较容易建立语言控制规则,因而模糊控制对那些数学模型难以获取、动态特性不易掌握或变化非常显著的对象非常适用。  模糊控制系统的基本结构如图1.1所示: 图1.1 模糊控制系统框图 其中 s为系统的设定值,y为系统输出,e和ec分别是系统偏差和偏差的微分信号,也就是模糊控制器的输入,u为控制器输出的控制信号,E、C、U为相应的模糊量。 第2章  硬件电路总体设计 2.1 总体方案 电热水器水温自动调节器是以PIC16C74B单片机为核心,由键盘,显示,PWM电路,检测变送电路等组成,结构框图如图2.1所示 图2.1 硬件原理框图 2.2 各单元电路设计 2.2.1 PIC16C7B 简介 1 高性能RISC结构CPU · 精简指令集,仅35条单字节指令,易学易用 · 除地址分支跳转指令(GOTO,CALL)为双周期指令,其余皆为单周期指令 · 八级硬件堆栈 · 多种硬件中断 · 直接,间接,相对三种寻址方式 2 功能部件特性 · 带8位AD转换输入 · 高驱动电流,I/O引脚可直接驱动数码管(LED)显示 · 每个I/O引脚最大拉电流25MA · 每个I/O引脚最大灌电流20MA · 双向可独立编程设置I/O引脚 · 8位定时器/计数器TMR0,带8位预分频 · 有1-2路捕获输入/比较输出/PWM输出(CCP) · 16位定时器/计数器TMR1,睡眠中还可计数 · 8位定时器/计数器TMR2,带有8位的周期寄存器及预分频和后分频 · 并行口操作 · 同步串行口I2C/SPI总线操作 3 微控制器特性 · 内设置上电复位电路(POR) · 上电定时器,保障振荡的稳定建立 · 断电复位锁定 · 内设置自振式看门狗 · 程序保密位,可防程序代码的非法拷贝 · 四种可选振荡方式 · 低成本阻容:RC · 标准晶体/陶瓷:XT · 高速晶体/陶瓷:HS · 低频晶体:LP 4 CMOS 工艺 钢结构制作工艺流程车尿素生产工艺流程自动玻璃钢生产工艺2工艺纪律检查制度q345焊接工艺规程 特性 · 低功耗 <2MA    @5V,4MHZ <15UA  @3V,32KHZ <1UA    低功耗SLEEP模式下 · 宽工作电压:2V-6V · 宽工作温度范围: · 工业级:-40- +85 · 汽车级:-40- +125 5 引脚介绍 图2.2  PIC16C74引脚图 表2.1  PIC16C74B引脚意义 引脚名 I/O特性 电平 功能 OSC1/CLKIN 输入 CMOS 振荡输入脚 OSC2/CLKOUT 输出 - 振荡输出脚 MCLR 输入 斯密特输入 复位输入脚,低电平有效 RA0/AN0 RA1/AN1 RA2/AN2 RA3/AN3/VREF RA4/T0CKI RA5/AN4/SS I/O I/O I/O I/O I/O I/O TTL TTL TTL TTL斯密特输入 TTL A/D输入通道0 A/D输入通道1 A/D输入通道2 A/D输入通道3 可作为TMR0外部时钟输入 可做A/D输入通道4,或同步串行口的从属器选择输入 RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 I/O I/O I/O I/O I/O I/O I/O I/O TTL/斯密特 TTL TTL TTL TTL TTL TTL TTL 也可作为外部中断信号输入 具电平变化中断功能 具电平变化中断功能 具电平变化中断功能 具电平变化中断功能 RC0/T1OSI/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL I/O I/O I/O I/O 斯密特输入 斯密特输入 斯密特输入 斯密特输入 可作TIMER1振荡输入/TIMER1时钟输入 可作TIMER1振荡输入/CCP2输入输出 可作CCP1输入输出 可作同步串行通讯时钟 RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT I/O I/O I/O I/O 斯密特输入 斯密特输入 斯密特输入 斯密特输入 可作SPI通讯数据输入线或I2C数据线 可作SPI通讯数据输出线 可作异步发送或SCI同步传输时钟线 可作异步接收或SCI同步传输数据线 RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 I/O I/O I/O I/O I/O I/O I/O I/O 斯密特/TTL 斯密特/TTL 斯密特/TTL 斯密特/TTL 斯密特/TTL 斯密特/TTL 斯密特/TTL 斯密特/TTL PORTD I/O口,双向可编程,可作并行口,作为并行口时为TTL输入,作为一般I/O口时为斯密特输入 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 I/O I/O I/O 斯密特/TTL 斯密特/TTL 斯密特/TTL RD:并行口读信号线或AD输入通道5 WR:并行口写信号线或AD输入通道6 CS:并行口片选线或AD输入通道7 VSS - - 地 VDD - - 电源         2.2.2 复位电路设计 由于需要对芯片的供电电压VDD随时进行检测,一旦发现VDD电压下降到一个门槛值时就使芯片复位以免系统失控,采样如图2.3所示的复位电路。其门槛值计算如下: (2.1) 图2.3复位电路 2.2.3 数据显示 由于本控制器需要显示当前时间,给定温度,实际温度,显示的数据较多,所以采用液晶显示,本控制器采用的液晶型号为OCM4×20,它是字符点阵系列模块,专用显示字母,符号等,分4位和8位数据传输方式,提供5×7点阵+光标和5×10点阵+光标的显示模式,提供显示数据缓冲区DDRAM,字符发生器CGROM和字符发生器CGRAM,可以使用CGRAM来存储自己定义的最多8个5×8点阵的图形字符的字模数据,提供了丰富的指令设置:清显示;光标回原点;显示开/关;光标开/关;显示字符闪烁;光标移位;显示移位等。提供内部上电自动复位电路,当外加电源电压超过+4.5V时,自动对模块进行初始化操作,将模块设置为默认的显示工作状态。 OCM4×20液晶显示模块与PIC16C74接口如图2.4所示 图2.4 OCM4×20与PIC16C74连接图 表2.2 OCM4×20引脚说明如下表所示 引脚 名称 方向 说明 1 VDD - 电源电压(+5V) 2 VSS - 电源地(0V) 3 V0 - LCD驱动电压(可调) 4 RS I RS=0,当MPU进行读模块操作,指向地址计数器 当MPU进行写模块操作,指向指令计数器 RS=1,无论MPU读操作还是写操作,均指向数据寄存器 5 R/W I R/W=0 写操作;R/W=1 读操作 6 E I 读操作时,信号下降沿有效;写操作时,高电平有效 7~14 DB0~DB7 I/O MPU与模块之间的数据传送通道,4位总线模式D0-D3断开 15 LED+ - 背光电源正(+5V) 16 LED- - 背光电源负(0V)         2.2.4 键盘设计 由于PIC16C74的PORTB每个管脚都有可编程之弱上拉,通过设置寄存器OPTION的第7位(即RBPu位),可以打开/关闭这些弱上拉。当I/O管脚被设置成输出时,则其弱上拉自动关闭。当芯片上电复位后,RBPu=1,所有弱上拉被关闭,可由用户程序将它们打开(设置RBPu=0)。 另外PORTB还有一个重要特性,即B口的第4个管脚到第7个管脚具有“电平变化中断”功能,就是当B口的第4个管脚到第7个管脚中的任意一个管脚上的电平发生变化,就可以引起CPU中断,但仅当I/O脚定义为输入时这个功能才有效。这种中断可以把CPU从“睡眠”状态中唤醒。 PORTB的“电平变化中断”以及可编程弱上拉特性使之可以非常方便的构成一个键盘矩阵,特别是对于那些希望以键盘按动来唤醒CPU工作的设计,最理想不过,如手持式仪器,遥控器,计算器等,在不用的时候,CPU处于睡眠状态,而当一旦有按键按下,即可唤醒CPU进行工作。 本控制器利用PIC16C74的PORTB口设计了四个按键,如图2.5,它们分别为总开关键,设置键,加数键,减数键。总开关键用于是否开机,设置键用于需要设置哪组数据,例如第一次按下该键,当前时间的小时闪烁,表示现在允许改变小时的值,加数键和减数键用于改变各种参数。 图2.5 按键电路 2.2.5 温度检测电路设计 本控制器考虑到降低成本,温度检测采用由热敏电阻组成的桥式电路来实现,电路如图2.6。它是由负温度系数电阻特性的热敏电阻(NTC元件)Rt为一臂组成测温电桥, 其输出经测量放大器放大后送给单片机的RA0管脚,它是AD转换通道0。 1 测温电桥 由R16、R25、R18、R13及Rt2组成测温电桥,其中Rt2是热敏电阻。其呈现出的阻值与温度成线性变化关系且具有负温度系数,而温度系数又与流过它的工作电流有关。为了稳定Rt2的工作电流,达到稳定其温度系数的目的,设置了稳压管LM3。R13可决定测温电桥的平衡,则电桥输出电压(UB-UA)如式2.2。 (2.2) 2 差动放大电路 由UA741及外围电路组成的差动放大电路,将测温电桥输出电压(UB-UA)按比例放大。其差动放大电路输出电压U0如式2.3所示。 (2.3) 当R30=R31=10K,(R35+R36)=R32 =50K时 (2.4) R14用于差动放大器调零。 可见差动放大电路的输出电压U0仅取决于二个输入电压之差和外部电阻的比值。 图2.6 桥式测温电路 2.2.6 PWM输出电路设计 本方法的基本思想就是利用单片机具有的PWM端口,在不改变PWM方波周期的前提下,通过软件的方法调整单片机的PWM控制寄存器来调整PWM的占空比,从而控制热水器加热装置的电流。本方法所要求的单片机必须具有ADC端口和PWM端口这两个必须条件,另外ADC的位数尽量高,单片机的工作速度尽量快,而PIC16C74恰好具有这些功能。在调整热水器加热装置的电流前,单片机先快速读取热水器输出口的温度的大小,然后把设定的温度与实际读取到的温度进行比较,若实际温度偏小则向增加热水器加热装置的电流的方向调整PWM的占空比;若实际温度偏大则向减小热水器加热装置的电流的方向调整PWM的占空比。在软件PWM的调整过程中要注意ADC的读数偏差和电源工作电压等引入的纹波干扰,合理采用算术平均法等数字滤波技术。 本控制器的PWM输出的硬件连接图如图2.7所示。 图2.7  PWM输出电路 2.2.7 整流和稳压电路设计 本控制器中使用了三种电源,它们分别是系统电源+5V,测温放大电路中UA741的供电电源和PWM输出电源±12V。 用如图2.8所示的稳压电路。 图2.8 整流和稳压电路 2.2.8 同步信号检测电路 为了检测交流电压过零点,使单片机输出的触发控制脉冲与整流电路同步工作,系统设计了如图2.9所示的同步信号检测电路。 图2.9 同步信号检测电路 同步脉冲的产生过程是:当Uin的输入由负半周向正半周跳变时(即正弦信号过零时刻),比较器LM339的输出端将产生一个上升沿。经过非门整形后变成下降沿输入到单片机的外部中断引脚INT。此信号在单片机的内部是作为PWM程序运行的触发信号。 第3章  系统软件设计 3.1 软件总体方案 在软件设计中,既综合了系统的功能,性能要求及硬件电路,又考虑了软件的易维护性。采用模块化结构,并尽量做到模块的独立性,减少模块之间的交叠。整个软件设计由主程序,各个功能子程序,中断服务程序组成。其整体框图如图3.1所示。 图3.1 软件整体框图 3.1.1 温度检测部分 本控制器使用了热敏电阻作为检测元件,由于它的电阻与温度的关系式是一个非线性函数,为了减少单片机的执行时间,采用插值法来逼近如下关系式。 (3.1) 在本设计中使用了拉格朗日(Lagrange)插值法.其基本原理如下: 先从最简单的线性插值(n=1)开始。这时插值问题就是求一次多项式 P1(x)=a0+a1x  使它满足条件 P1(x0)=y0 ,    P1(x1)=y1 , 令P1(x)=l0(x)y0+l1(x)y1 ,由于 l0(x0)=1,            l0(x1)=0, l0(x0)=0,            l1(x1)=1. 这样l0(x)含有因子x-x1, 令  l0(x)=λ(x-x1), 再利用 l0(x0)=1确定其中的系数,结果得到 (3.2) 类似的可得到      (3.3) 这样                          (3.4) l0(x), l1(x)称为以x0 , x1 为节点的插值基函数。 线性插值仅仅用两个节点以上的信息,精确度较差。为了提高精确度,我们进一步考察以下三点的插值问题: 作二次多项式    (3.5) 使其满足条件 P2(x0)=y0 ,      P2(x1)=y1 ,        P2(x2)=y2 令P2(x)=l0(x)y0 + l1(x)y1 + l2(x)y2 。由 l0(x0)=1 ,  l0(x1)=0 ,    l0(x2)=0 , l1(x0)=0 ,  l1(x1)=1 ,    l1(x2)=0 , l2(x0)=0 ,  l2(x1)=0 ,    l2(x2)=1 . 这样 l0(x)含有 x-x1 , x-x2 两个因子,令 l0(x)=λ(x-x1)(x-x2) ,利用 l0(x0)=1 确定其中的系数λ,得 (3.6) 类似的可以得出  l1(x) , l2(x) : ,                  (3.7) 于是  (3.8) l0(x) , l1(x) , l2(x) 称为以 x0 , x1 , x2为节点的插值基函数,式3.7即为插值函数。 3.1.2 模糊算法部分 1 整体方案 如图3.2。考虑系统控制情况,选热水器出口温度偏差e、偏差变化率ec为输入变量,热水器加热装置的控制电压增量uc为输出变量, 构成二维模糊。偏差e(n)和偏差变化率ec(n)按下面公式求取 (3.9) (3.10) (3.11) 式中,n为采样次数;I(n)为温度给定值;Y(n)为检测得到的温度;K1、K2为量化因子,K3为比例因子。 图3.2 模糊控制原理框图 2 确定模糊控制器的结构 对温度的误差E,误差的变化EC及控制量U的模糊集及其论域定义如下: EC和U的模糊集为:{NB,NM,NS,O,PS,PM,PB}; E的模糊集为:{NB,NM,NS,NO,PO,PS,PM,PB}; E和EC的论域均为:{-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6}; U的论域为:{-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7}; 上述的误差模糊集选取八个元素,区分了NO和PO,主要是着眼于提高稳态精度。 3 建立模糊控制规则 表3.1 模糊控制规则表 U E EC NB NM NS O PS PM PB NB PB PB PB PB PM O O NM PB PB PB PB PM O O NS PM PM PM PM O NS NS NO PM PM PS O NS NM NM PO PM PM PS O NS NM NM PS PS PS O NM NM NM NM PM O O NM NB NB NB NB PB O O NM NB NB NB NB                 由表3.1所描述的控制规则,这是一类根据系统输入的误差及误差的变化趋势来消除误差的模糊控制规则。这个控制规则可以用以下21条模糊条件语句来描述: (1) if E=NB or NM and EC=NB or NM then U=PB (2) if E=NB or NM and EC=NS or O then U=PB (3) if E=NB or NM and EC=PS then U=PM (4) if E=NB or NM and EC=PM or PB then U=O (5) if E=NS and EC=NB or NM then U=PM (6) if E=NS and EC=NS or O then U=PM (7) if E=NS and EC=PS then U=O (8) if E=NS and EC=PM or PB then U=NS (9) if E=NO or PO and EC=NB or NM then U=PM (10) if E=NO or PO and EC=NS then U=PS (11) if E=NO or PO and EC=NO then U=O (12) if E=NO or PO and EC=PS then U=NS (13) if E=NO or PO and EC=PM or PB then U=NM (14) if E=PS and EC=NB or NM then U=PS (15) if E=PS and EC=NS then U=O (16) if E=PS and EC=O or PS then U=NM (17) if E=PS and EC=PM or PB then U=NM (18) if E=PM or PM and EC=NB or NM then U=O (19) if E=PB or PM and EC=NS then U=NM (20) if E=PM or PB and EC=O or PS then U=NB (21) if E=PM or PB and EC=PB or PM then U=NB 4 确定模糊变量的赋值表 模糊变量误差E,误差变化EC及控制量U的模糊集和论域确定后,需要对模糊语言变量确定隶属函数,即所谓对模糊变量赋值,就是确定论域内元素对模糊语言变量的隶属度,如 模糊变量E,EC及U的隶属度赋值分别如表3.2,表3.3,表3.4所示。 表3.2 模糊变量E的隶属度赋值表 e E μ -6 -5 -4 -3 -2 -1 0 0 1 2 3 4 5 6 PB 0 0 0 0 0 0 0 0 0 0 0.1 0.4 0.8 1 PM 0 0 0 0 0 0 0 0 0 0.2 0.7 1 0.7 0.2 PS 0 0 0 0 0 0 0 0.3 0.8 1 0.5 0.1 0 0 PO 0 0 0 0 0 0 0 1 0.6 0.1 0 0 0 0 NO 0 0 0 0 0.1 0.6 1 0 0 0 0 0 0 0 NS 0 0 0.1 0.5 1 0.8 0.3 0 0 0 0 0 0 0 NM 0.2 0.7 1 0.7 0.2 0 0 0 0 0 0 0 0 0 NB 1 0.8 0.4 0.1 0 0 0 0 0 0 0 0 0 0                               表3.3 模糊变量EC的隶属度赋值表 ec EC μ -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 PB 0 0 0 0 0 0 0 0 0 0.1 0.4 0.8 1 PM 0 0 0 0 0 0 0 0 0.2 0.7 1 0.7 0.2 PS 0 0 0 0 0 0 0 0.9 1 0.7 0.2 0 0 O 0 0 0 0 0 0.5 1 0.5 0 0 0 0 0 NS 0 0 0.2 0.7 1 0.9 0 0 0 0 0 0 0 NM 0.2 0.7 1 0.7 0.2 0 0 0 0 0 0 0 0 NB 1 0.8 0.4 0.1 0 0 0 0 0 0 0 0 0                             表3.4 模糊变量U的隶属度赋值表 u U μ -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 PB 0 0 0 0 0 0 0 0 0 0 0 0.1 0.4 0.8 1 PM 0 0 0 0 0 0 0 0 0 0.2 0.7 1 0.7 0.2 0 PS 0 0 0 0 0 0 0 0.4 1 0.8 0.4 0.1 0 0 0 O 0 0 0 0 0 0 0.5 1 0.5 0 0 0 0 0 0 NS 0 0 0 0.1 0.4 0.8 1 0.4 0 0 0 0 0 0 0 NM 0 0.2 0.7 1 0.7 0.2 0 0 0 0 0 0 0 0 0 NB 1 0.8 0.4 0.1 0 0 0 0 0 0 0 0 0 0 0                                 5 建立模糊规则表 上述描写模糊控制器的21条模糊条件语句之间是或的关系,由第1条语句确定的控制规则可以计算出u1. 由第1条语句所确定的模糊关系可用式3.12写出,即: (3.12) 如果令此刻采样所得到的实际误差量为e且误差的变化为ec,由式 可以算出控制量为: (3.13) 对于e及ec的隶属函数值对应于所量化的等级上取1,其余均取零,这样式3.13可以简化为: (3.14) 式中 , 是模糊集合NBE和NME第i个元素的隶属度,而 , 是模糊集合NBEC和NMEC第j个元素的隶属度。 同理,可以由其余各条语句分别求出控制量 ,控制量为模糊集合u,表示为: (3.15) 由式3.15计算出的模糊控制量可以选用一种判决方法,如最大隶属度法,将控制量由模糊量变为精确量。 下面举一个例子,当采样的温度的误差E=-6,温度的误差的变化率EC=-6时, 式3.14可知。 根据最大隶属度法可知控制量u为: 同理,可以得出表3.5所示的模糊控制规则表。 表3.5 模糊控制规则表 EC U E -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 -6 7 6 7 6 7 7 7 4 4 2 0 0 0 -5 6 6 6 6 6 6 6 4 4 2 0 0 0 -4 7 6 7 6 7 7 7 4 4 2 0 0 0 -3 7 6 6 6 6 6 6 3 2 0 -1 -1 -1 -2 4 4 4 5 4 4 4 1 0 0 -1 -1 -1 -1 4 4 4 5 4 4 1 0 0 0 -3 -2 -1 0 4 4 4 5 1 1 0 -1 -1 -1 -4 -4 -4 0 4 4 4 5 1 1 0 -1 -1 -1 -4 -4 -4 1 2 2 2 2 0 0 -1 -4 -4 -3 -4 -4 -4 2 1 2 1 2 0 -3 -4 -4 -4 -3 -4 -4 -4 3 0 0 0 0 -3 -3 -6 -6 -6 -6 -6 -6 -6 4 0 0 0 -2 -4 -4 -7 -7 -7 -6 -7 -6 -7 5 0 0 0 -2 -4 -4 -6 -6 -6 -6 -6 -6 -6 6 0 0 0 -2 -4 -4 -7 -7 -7 -6 -7 -6 -7                             6 量化因子和比例因子的选择 合理的确定量化因子和比例因子要考虑所采用的计算机的字长,还要考虑到计算机的输入输出接口中D/A和A/D转换的精度及其变化范围。即,选择量化因子和比例因子要充分考虑与D/A和A/D转换精度相协调,使接口板的转换精度充分发挥,并使其变换范围充分被利用。量化因子Ke和Kec的大小对控制系统的动态性能影响很大。Ke选得较大时,系统的超调也较大,过渡过程较长。这一点不难理解,因为从理论上讲,Ke增大,相当于缩小了误差的基本论域,增大了误差变量的控制作用,虽然能使上升时间变短,但由于超调过大,使得系统的过渡过程变长。Kec选择越大系统超调越小,但系统的响应速度变慢,量化因子Ke,Kec的大小意味着对输入变量误差和误差变化的不同加权程度。输出比例因子Ku作为模糊控制器的总的增益,它的大小影响着控制器的输出,也影响这模糊控制系统的特性。Ku选择过小会使系统动态响应过程变长,而Ku选择过大会导致系统振荡加剧,通过调整Ku可以改变对被控对象输入的大小。 选择误差的变化范围为[-0.5,0.5],误差变化的变化范围为[-0.3,0.3],被控对象实际要求的变化范围为[-14,14],则 7 模糊算法流程图 模糊控制器的控制算法是由计算机的程序实现的。这种程序一般包括两个部分,一个是计算机离线计算查询表的程序,属于模糊矩阵运算。另一个是计算机在模糊控制过程中在线计算输入变量,并将它们模糊化处理,查找查询表后再作输出处理的程序。 该控制器的模糊算法流程图如图3.3所示。 图3.3 模糊算法流程图 3.1.3 脉宽调制(PWM)部分 当CCP1工作在PWM模式下,RC2/CCP1可输出高达10位的脉宽调制波形,这时RC2/CCP1必须设置为输出态(通过置C口方向寄存器TRISC的第2位)。在PWM输出模式下,用户把8位的频宽(duty cycle)置入CCPR1寄存器的低8位,即CCPR1L寄存器。CCPR1的高8位寄存器CCPR1H则作为CCPR1L    的从属寄存器,即8位频宽数据从CCPR1L再载入CCPR1H然后再和时基寄存器TMR2进行比较,PWM输出的周期则由TMR2的周期寄存器PR2决定。 1 PWM周期 PWM输出周期由PR2寄存器值决定,如下列公式所示: (3.16) (3.17) 当TMR2=PR2,则会发生如下事件: (1) TMR2清零; (2) RC2/CCP1脚置1; (3) PWM之频宽(duty cycle)从CCPR1L载入CCPR1H 2 PWM频宽 PWM频宽由CCPR1L和CCP1CON<5:4>(即CCP1CON的第5位和第4位)组成,所示最大可达10位,其计算公式如下: (3.18) CCPR1L和CCP1CON<5:4>的值可以随时写入,但只有当PR2=TMR2时,它的值才会载入到CCPR1H中。在PWM模式下,CCPR1H是只读寄存器。 例:设需PWM频率为0.25KHZ Fosc=4MHZ TMR2预分频数=16 求PR2的值 3 PWM分辩率 (3.19) 对于上例来说,最大分辩率计算如下: 所以可以取设最大PWM分辩率为10位,如果要取得更高的分辩率,则必须降低PWM的频率;反之如果要取得更高的PWM频率,则需降低分辩率。 PWM程序流程图如图3.4所示。 图3.4  PWM程序流程图 3.2 各子模块程序设计 3.2.1 主程序设计 为了减少系统的功耗,让系统尽可能的进入休眠模式,主程序主要包括系统的初始化,相关数据的初始化,然后检测是否有中断产生,若有则执行相应的中断服务程序,并将部分功能函数放在中断服务程序中,这样只有有相应中断产生时,系统才会去执行其它程序,从而减少系统的运行时间。 主程序框图如图3.5所示。 图3.5 主程序流程图 3.2.2 总中断服务程序设计 PIC16C74有12个中断源,代表了有12种不同的时间可以产生插入主程序中做优先的处理,每一个中断都有一个中断标志和一个中断使能位,中断标志位表示中断源是否产生这个中断,是提供让使用者检查是哪个中断发出的信号,中断使能位则决定了要不要使用这个中断,使用者可以在主程序中关掉不用的中断源,避免影响程序的流程。 这十二个中断有九个中断是属于外围模块的中断,由一个外围中断使能位PEIE来统一控制所有与外围有关的中断的使用与否,另外还有三个中断加上这个外围中断再由一个全局中断允许位GIE来控制。当有使能的中断发生时,程序的执行会被中断,PC值会被存到堆栈中,然后PC会指到程序存储器0004H的地址,这个地址就是中断矢量的地址。 PICC可以实现C语言的中断服务程序。中断服务程序有一个特殊的定义方法: void interrupt ISR(void); 其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词”interrupt”。 中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC在最后进行代码连接时会自动将其定位到0x0004中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令”retfie“。本控制器中使用的中断服务程序结构如下: void interrupt name_isr() {  if(T0IE&T0IF)                    //定时器0中断 { T0IF=0;                      //清中断标志位 …                            //加入其它代码 } if(TMR1IE&TMR1IF)                //定时器1中断 {  TMR1IF=0;                    //清中断标志 …                                //加入其它代码 } if(ADIE&ADIF)                    //AD中断 { ADIF=0;                      //清中断标志 …                                    //加入其它代码 } if(RBIE&RBIF)                      //PB口电平变化中断 { RBIF=0;                        //清中断标志 …                                    //加入其它代码 }                } 3.2.3 定时器1中断服务程序设计 定时器1的主要用于实时时钟,每500ms中断一次。其中断服务程序框图如图3.6所示。 图3.6 定时器1服务程序流程图 3.2.4 定时器0中断服务程序设计 定时器0 主要用于在设置状态时是否需要快调数据以及判断15秒内是否有按键操作,若无则自动退出设置状态。程序流程图如图3.7所示。 图3.7  定时器0服务程序流程图 3.2.5 AD转换中断服务程序设计 AD转换程序主要用于完成温度的采样,计算温差和温差的变化率,利用模糊算法求出对应的输出,从而达到控制热水器水温的恒定的目的。 AD转换程序流程图如图3.8所示。 图3.8  AD转换程序流程图 3.2.6 B口电平变化中断程序设计 按键程序主要是利用了PIC16C74的RB4~RB7口具有电平变化中断这一特性,设计了四个按键,它们分别为总开关按键,设置键,加数键,减数键。功能分别为:总开关按键用于是否开机,当系统上电时,热水器不工作,当按下该键时,热水器工作,总开关指示灯亮;设置键主要用于设置各种参数,如时间,水温;加数键在设置状态下,增加所设数据;减数键主要是用于在设置状态下,减少所设数据。其流程图如图3.9所示。 图3.9按键程序流程图 3.2.7 液晶显示程序设计 液晶显示程序流程图如图3.10所示。指令功能介绍如下: 1 Clear display 清显示 指令码: 清显示指令将空位字符码20H 送入全部DDRAM地址中,使DDRAM 中的内容全部清除,显示消失;地址计数器AC=0,自动增1 模式;显示归位,光标或者闪烁回到原点(显示屏左上角);但并不改变移位设置模式。 2 Return home 归位 指令码: 归位指令置地址计数器AC=0;将光标及光标所在位的字符回原点;但DDRAM 中的内容并不改变。 3 Entry mode set 设置输入模式 指令码: I/D:字符码写入或者读出DDRAM 后DDRAM地址指针AC变化方向标志:I/D=1,完成一个字符码传送后,光标右移,AC自动加1;I/D=0,完成一个字符码传送后,光标左移,AC自动减1; S:显示移位标志:S=1,将全部显示向右(I/D=0)或者向左(I/D=1)移位;S=0,显示不发生移位;S=1 时,显示移位时,光标似乎并不移位;此外,读DDRAM 操作以及对CGRAM 的访问,不发生显示移位。 4 Display on/off control 显示开/关控制 指令码: D:显示开/关控制标志:D=1,开显示;D=0,关显示;关显示后,显示数据仍保持在DDRAM 中,立即开显示可以再现; C:光标显示控制标志:C=1,光标显示;C=0,光标不显示;不显示光标并不影响模块其它显示功能;显示5X8 点阵字符时,光标在第八行显示,显示5X10点阵字符时,光标在第十一行显示; B:闪烁显示控制标志:B=1,光标所指位置上,交替显示全黑点阵和显示字符,产生闪烁效果,Fosc=250kHz时,闪烁频率为0.4ms左右;通过设置,光标可以与其所指位置的字符一起闪烁。 图3.10 液晶显示程序流程图 3.3  仿真结果 首先运行模糊控制器程序(见附录B),并将模糊推理系统保存在a2中,然后运行模糊控制的SIMULINK仿真程序,其中K1=12,K2=20,K3=2,如图3.11所示,则仿真曲线如图3.12所示。 图3.11  simulink仿真图 图3.12 仿真曲线 由图3.13可知,本模糊控制器具有良好的动、静态性能。模糊控制在强时变、大时滞、非线性系统中的控制效果有着明显的优势。将模糊控制技术与单片机结合起来,可使控制器的性能指标达到最优的目的。基于模糊控制技术的单片机控制的电热水器,具有达到设定温度的时间短、稳态温度波动小、反应灵敏等优点。 结束语 ji结束语 大学四年时光转瞬即逝,在做这次毕业设计的过程中,我体会很多,理论应该联系实践,两者相辅相承,理论是实践的基础,实践是理论的应用,我们只有好好的掌握以前所学的理论知识,才能在这次实践中得心应手,才能让自己所学的知识得到充分的应用,而且只有这样,我们才算真正学到了知识。 在这次毕业设计中我学会了怎样查阅资料,怎样解决遇到的问题,网络和书籍是我们一生中都不可少学习工具,当我们遇到问题,千万不能浮躁,要静下心来,认真的思考问题的解决办法,当我们想到一个解决办法时,就应该动手试试,其实失败也是一种学习方式。 我在这次毕业设计中体会到,当我们学会了一种单片机,我们就应该学会使用其他的单片机,不同的单片机仅仅是硬件结构和编程语言不同,它们的编程思路其实都是一样的,所以当我们接触一种新的单片机时,就应该想到我们以前是怎样学习其他的单片机,这样才能提高我们的学习效率。 参考文献 [1] 刘曙光,魏俊明,竺志超. 模糊控制技术[M]. 北京: 纺织工业出版社,2001,56-80 [2] 黄崇福. 模糊理论与工程系列丛书--模糊集理论与近似推理[M]. 武汉大学出版社, 2004.07,80-93 [3] 廉小亲. 模糊控制技术. 中国电力出版社[M], 2003.08,74-100 [4] 王立军. 模糊系统与模糊控制教程[M]. 清华大学出版, 2003.06 [5] 何信龙. PIC16C7X入门与应用范例[M]. 清华大学出版, 2001.09 [6] 李佩禹. 家用热水器的原理、使用与维修[M]. 北京: 机械工业出版社, 2001.04 [7] 杨绪东. 家用电器与工业控制实用电路精选[M]. 化学工业出版社, 2003.05 [8] 姜宝港. 智能家用电器原理与维修[M]. 北京: 机械工业出版社, 2002.05 [9] KEVIN M. PASSINO&STEPHEN YURKOVICH  模糊控制(英文影印版)Fuzzy Control[M]. 清华大学出版社, 2001.11,50-63 [10] GRAHAM C. GOODWIN&STEFAN F.GRAEBE&MARIO E.SALGADO  控制系统设计(英文影印版)Control System Design[M]. 清华大学出版社, 2002.01 [11] 王迎旭. 单片机原理与应用[M]. 北京: 机械工业出饭社, 2004.7,81-92 [12] 何为民. 低功耗单片微机系统设计[M]. 北京: 北京航天航空大学出版社, 1994 [13] 周航慈. 单片机应用程序设计技术[M]. 北京: 北京航天航空大学出版社, 1991 [14] 李兰友. 单片机开发应用十例[M]. 北京: 电子工业出版社, 1994 [15] 赵纯. 便携式多功能测温仪的设计[J]. 电子与仪表, 1997.5,56-75 [16] 罗本成. 渠系自动化运行监测系统的研究与开发[M]. 武汉水利电力大学硕士学位论文, 2000.2,23-42 [17] 庄楚强. 应用数理统计基础[M]. 广州: 华南理工大学出版社, 1993 [18] Lotfi A. Zadeh. 模糊集与模糊信息粒理论(Fuzzy Sets and Fuzzy Granulation Theory) [M]. 北京:北京师范大学出版社(Beijing: Beijing Normal University Press), 2000,56-82 [19] 李士勇. 模糊控制和智能控制理论与应用[M]. 哈尔滨工业大学出版社,1990 [20] 王尔智, 祖莉, 马少华. 模糊控制理论在电动机恒流软启动中的应用(Fuzzy Control and Intelligent Control Theory and Applications)[M]. 沈阳工业大学学报, 2001(1) [21] 王兆安,黄俊. 电力电子技术[M]. 北京: 机械工业出版社,2000,42-50 致谢 本研究及学位论文是在我的导师肖锋老师的亲切关怀和悉心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。在此谨向肖锋老师致以诚挚的谢意和崇高的敬意。我还要感谢在一起愉快的度过毕业论文小组的同学们,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。 在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!    最后,再次对关心、帮助我的老师和同学表示衷心地感谢! 附录A  模糊控制器源程序 1 main.c //XTAL=4MHZ #include #include"hot_water.h" unsigned char ledbuff[]={1,1,2,3,4,5,0,2,0,0,2,0,0,0,0,0,0,0,0,2,0}; unsigned char sample_voltage[8];              //相邻8次采样的数据 unsigned char second_ok;                    //一秒钟到标志 unsigned char adc_ok;                        //AD转换结束标志 unsigned char time0_ok;                      //定时器溢出标志 unsigned int return_back;                    //15秒无按键自动返回 extern unsigned char key_realse;                //键被按下标志 extern unsigned char pb_ok;                  //PB口电平变化中断标志 extern unsigned char chanel;                  //AD转换通道选择 extern unsigned char set_mode;                //设置模式状态 void main(void) { lcd_init();                                //lcd initial display();                                //show data chanel=0;                                    adc_init();                                //adc  initial time0_init();                              //time0 initial time1_init();                              //time1 initial PORTBINT();                            //RBUP initial pwm_init();                              //PWM初始化 TRISC=0x00;                              //指示灯全灭 PORTC=0xff; GIE=1;                                  //开全局中断          PEIE=1;          while(1) {      if(second_ok==1)                      //一秒钟时间到 { second_ok=0;                          //清零标志 time1_interrupt();                    //执行时间调整程序 display();                          //显示时间 } if(adc_ok==1)                          //AD转换结束标志 { adc_ok=0;                            //清零AD转换结束标志 adc_interrupt();                        //执行AD处理程序 display();                            //显示更新数据 } if(pb_ok==1)                            //PB口电平变化中断标志 { pb_ok=0;                            //清零标志 pb_interrupt();                        //执行按键处理程序 if(set_mode==0)                      //在非设置状态下,清零键按下标志 key_realse=0;            } if(time0_ok==1)                            //定时器0中断标志 { time0_ok=0;                            //清零标志 if(key_realse==1)                //检测按键是否按下两秒未释放,则执行快调 key_realse1(); return_back++;                          //15秒计数器 if(return_back>1500)    //判断15秒是否无任何操作,若无返回初始状态 { set_mode=0;                        //清零设置标志 PIE1|=0x01;                        //定时器1允许中断 TMR1ON=1;                        //开启定时器1 ADON=1;                          //开启AD转换 T0IE=0;                            //禁止定时器0 return_back=0;                      //清零15秒标志 }      } } } 2 interrupt_isr.c #include #include"hot_water.h" unsigned char pb_ok;                        //PB口电平变化中断标志 unsigned char portb_data;                        //键值暂存器 unsigned char time_flag;                      //两秒允许计数标志 unsigned int time_count;                      //两秒计数器 unsigned char time1_flag;                    //0.3秒允许计数标志 unsigned int time1_count;                    //0.3秒计数器 unsigned char set_mode;                      //模式设置 unsigned char up_down;                      //向上还是向下调整数据              unsigned char  key_realse;                  //键释放标志 bank1 unsigned char adc_temp; bank1 bit power;                            //热水器允许工作标志 extern unsigned char chanel;                  //AD转换通道选择 extern unsigned char ledbuff[21];              //显示缓冲区 extern unsigned int return_back;                //15秒有无按键计数器 extern unsigned char sample_voltage[8];        //水温AD采样值缓冲区 void adc_interrupt(void)                      //AD转换处理程序 { unsigned char adc_result=0;                //AD结果暂存器 float vout;                              //采样电压值 adc_result=ADRES;                      //暂存AD结果 adc_result=filter_sample_voltage(sample_voltage,adc_result);  //得出采样电压 vout=(float)((adc_result/256.0)*5);          //标度变换 cal_temprature(vout);                    //采样电压转换成电阻,, //再转换成温度,并显示 } /**********************************************************/ void time1_interrupt(void)                  //定时器1中断处理程序,调整显示时间 {      if((PORTB&0xf0)==0xf0)              //未键按下,置相应标志 key_realse=0; ledbuff[5]++;                        //以下是时间调整部分 if(ledbuff[5]>9) { ledbuff[5]=0; ledbuff[4]++; if(ledbuff[4]>5) { ledbuff[4]=0; ledbuff[3]++; if(ledbuff[3]>9) { ledbuff[3]=0; ledbuff[2]++; if(ledbuff[2]>5) { ledbuff[2]=0; ledbuff[1]++; if(ledbuff[1]>9) { ledbuff[1]=0; ledbuff[0]++; } if(ledbuff[0]==2) if(ledbuff[1]>4) { ledbuff[0]=0; ledbuff[1]=0; } } } } } } /**************************************************************/ void pb_interrupt(void)                            //PB口电平变化中断处理程序 { if(key_realse==0)                              //第一次按下该键 { portb_data=PORTB&0xf0;                  //暂存键值 if(portb_data!=0xf0)                        //是否干扰 { return_back=0;                        //有键按下,清零15秒计数标志 key_realse=1;                        //置有键按下标志 switch(portb_data)                    //判断是哪个键按下 { case 0xe0:                        //上调键 { if(set_mode!=0)                //在设置状态下            { up_down=0;                //置上调标志 change_data();              //数据处理 display();                  //实时显示更新的数据 } } break;//+ case 0xd0:                        //下调键    { if(set_mode!=0) { up_down=1;                  //设置下调标志 change_data();                  //数据处理 display();                      //实时显示更新的数据 } } break;//- case 0xb0:                        //设置键 { if(power==0)        //在非开机状态下,设置键才有效 { PIE1&=0xfe;              //禁止定时器1中断 TMR1ON=0;              //关闭定时器1 T0IE=1;                  //使能定时器0中断 ADON=0;                //关闭AD转换 CCP1CON=0xf0;          //关闭PWM  TMR2ON=0;              //关闭定时器2 set_mode++;              //模式切换 if(set_mode>4)          //设置完毕 { PIE1|=0x01;      //允许定时器1中断 ADON=1;        //开AD转换 TMR1ON=1;      //开定时器1 T0IE=0;          //关定时器0 set_mode=0;    } display();            //显示程序 } } break;//set case 0x70: power=!power;              //热水器总开关 if(power==1)                //开热水器 { ADON=1;          //开AD转换 display();            //显示数据 display_char();        //显示字符 CCP1CON=0xff;      //打开PWM TMR2ON=1;        //开定时器2 RC5=0;              //开机指示灯亮  } else                    //关热水器 {        set_mode=0;          //清零模式设置 CCP1CON=0xf0;      //关闭PWM          TMR2ON=0;          //关闭定时器2                    RC5=1;              //开机指示灯灭 T0IE=0;            //禁止定时器0中断 display_char();        //显示字符 display();            //显示数据 TMR1ON=1;        //开启定时器1 TMR1IE=1;          //允许定时器1中断 } break;//ok default:break; }          } } } /**************************************************************/ void key_realse1(void)                        //判断按下是否两秒钟未释放 { if((PORTB&0xf0)==0xf0)                    //按键释放则清零相关标志 { key_realse=0;                    //key realse time_flag=0;                    time1_flag=0; time_count=0; time1_count=0; display(); } else                                    //键未释放,则判断时间到否 { return_back=0;                      time_flag=1; if(time_count>=200)                  //两秒时间计数器 { time1_flag=1;                      //两秒到,则0.3秒改变数据 time_count=0; }                            if(time1_count>=1)                      //0.3秒时间计数器 { time_count=0; time1_count=0; if(RB4==0)                      //判断是否长按加数键 { up_down=0; change_data();              //向上快调数据 } if(RB5==0)                      //判断是否长按减数键 { up_down=1; change_data();                //向下快调数据 } display();                            //显示改变的数据 }  } } 3 adjust_ms.c /***********up adjust minite and second *********************/ extern unsigned char up_down; void adjust_ms(unsigned char *pledbuff) { if(up_down)                              //下调秒钟和分钟 { *pledbuff=*pledbuff-1; if(*pledbuff>10) { *pledbuff=9; *(pledbuff-1)=*(pledbuff-1)-1; if(*(pledbuff-1)>10) { *(pledbuff-1)=5; } } } else                                      //上调秒钟和分钟 { *pledbuff=*pledbuff+1; if(*pledbuff>9) { *pledbuff=0; *(pledbuff-1)=*(pledbuff-1)+1; if(*(pledbuff-1)>5) { *(pledbuff-1)=0; } } } } /*********up adjust hour*************************************/ void adjust_hour(unsigned char *pledbuff) { if(up_down)                                //下调小时 { *pledbuff=*pledbuff-1; if(*(pledbuff-1)==0) if(*pledbuff>10) { *pledbuff=3; *(pledbuff-1)=2; } if(*pledbuff>10) { *pledbuff=9; *(pledbuff-1)=*(pledbuff-1)-1; } } else                                      //上调小时 { *pledbuff=*pledbuff+1; if(*pledbuff>9) { *pledbuff=0; *(pledbuff-1)=*(pledbuff-1)+1; } if(*(pledbuff-1)>1) if(*pledbuff>3) { *pledbuff=0; *(pledbuff-1)=0; } } } /********up adjust temperature and hight of water**************/ void adjust_tw(unsigned char *pledbuff) { if(up_down)                                    //下调给定水温 { *pledbuff=*pledbuff-1; if(*pledbuff>10) { *pledbuff=9; *(pledbuff-1)=*(pledbuff-1)-1; if(*(pledbuff-1)>10) { *(pledbuff-1)=9; *(pledbuff-2)=*(pledbuff-2)-1; if(*(pledbuff-2)>10) *(pledbuff-2)=1; } } } else                                              //上调给定水温 { *pledbuff=*pledbuff+1; if(*pledbuff>9) { *pledbuff=0; *(pledbuff-1)=*(pledbuff-1)+1; if(*(pledbuff-1)>9) { *(pledbuff-1)=0; *(pledbuff-2)=*(pledbuff-2)+1; if(*(pledbuff-2)>1) *(pledbuff-2)=0; } } } } 4 change_data.c #include"hot_water.h" extern unsigned char set_mode; extern unsigned char ledbuff[21]; /**********set which group data**********/ void change_data(void) { switch(set_mode) { case 1:adjust_hour(&ledbuff[1]); break;          //调整当前时间小时 case 2:adjust_ms(&ledbuff[3]);  break;          //调整当前时间分钟 case 3:adjust_ms(&ledbuff[5]);  break;          //调整当前时间秒钟 case 4:adjust_tw(&ledbuff[8]);  break;          //调整给定水温 default:break; } } 5 filter.c #include"hot_water.h" #include unsigned char buff_count=0; extern unsigned char sample_voltage[8]; extern unsigned char ledbuff[21]; unsigned char filter_sample_voltage(unsigned char *sample_voltage1,unsigned char cur_voltage) { unsigned int insert=0;                                  //数据滤波函数 unsigned char i; *(sample_voltage1+buff_count)=cur_voltage; buff_count++; if(buff_count>7) buff_count=0; for(i=0;i<8;i++) { insert=insert+*(sample_voltage1+i); } return (insert/8); } 6 pic_lcd.c #include             #define LCD_E  (1 << 1)                          //LCD端口配置 #define LCD_RS (1 << 2) #define LCD_RW (1 << 0) #define lcd_set_e()  (PORTE |= LCD_E) #define lcd_set_rs() (PORTE |= LCD_RS) #define lcd_set_rw() (PORTE |= LCD_RW) #define lcd_clear_e()  (PORTE &= ~LCD_E) #define lcd_clear_rs() (PORTE &= ~LCD_RS) #define lcd_clear_rw() (PORTE &= ~LCD_RW) #define lcd_data PORTD extern unsigned char set_mode;                      //模式设置 extern unsigned char time1_flag;                    //0.3秒计数标志 extern unsigned char ledbuff[21];                    //显示缓冲区 extern bank1 bit power; bank1 unsigned char line; const unsigned char set_cursor[]={40,1,4,7,11,21,24,27}; void delay_us(unsigned int time)                    //延时程序 { do { time--; } while(time>1); } /************************************************************/ void delay(int ticks) { while(ticks--); } /***********************************************************/ void delay_ms(unsigned int time) { while(time!=0) { delay_us(1000); time--; } } /***************** lcd strobe****************************/ void lcd_pulse(void)          { lcd_set_e(); delay(8); lcd_clear_e(); delay(8); } /** medium delay (long for lcd, but much less than a second)***/ void lcd_wait(void) { delay(1000); } /************* send byte to lcd*********************************/ void lcd_send(unsigned char data)              //LCD数据发送程序 { lcd_wait(); lcd_data = data;  lcd_pulse(); } /****************** clear screen ***************************/    void clrscr(void)                              //LCD清屏程序          {      lcd_clear_rs(); lcd_clear_rw(); lcd_send(0x01); lcd_wait(); } /************** init display*******************************/ void initgraph(void)                        //LCD上电初始化程序 { clrscr(); lcd_clear_rs(); lcd_clear_rw(); lcd_send(0x3C); lcd_send(0x3C); lcd_send(0x3C); lcd_send(0x06); lcd_send(0x0c); }    /************** goto lcd memory address********************/ void gotoz(unsigned char z)                  //改变光标位置程序 { lcd_clear_rs(); lcd_clear_rw(); lcd_send(z | 0x80); } #define gotoxy(x,y) gotoz((x)|((y)<<5)) /************* output single character*******************/ void putchar(char c)                        //发送数据 { lcd_clear_rw(); lcd_set_rs(); lcd_send(c); } /***************** output string**************************/ void outtext(char* text) { unsigned char i; for(i = 0; text[i] && i < 16; i++) putchar(text[i]); } /***********************************************************/  void display(void)                      //显示数据程序 { lcd_send(0x0c); gotoxy(0,2); putchar('0'+ledbuff[0]);              //实时时间小时 putchar('0'+ledbuff[1]); putchar(':'); putchar('0'+ledbuff[2]);              //实时时间分钟 putchar('0'+ledbuff[3]); putchar(':'); putchar('0'+ledbuff[4]);              //实时时间秒种 putchar('0'+ledbuff[5]); putchar(0x7c); putchar('0'+ledbuff[6]);            //给定水温 putchar('0'+ledbuff[7]); putchar('0'+ledbuff[8]); putchar(0xdf); putchar('C'); putchar(0x7c); putchar('0'+ledbuff[18]);          //实际水温 putchar('0'+ledbuff[19]); putchar('0'+ledbuff[20]); putchar(0xdf); putchar('C'); if(time1_flag==0)              //快调模式下不显示光标闪烁 { gotoz(0x40+set_cursor[set_mode]); lcd_send(0x0d); } } /*****************************************************************/ void display_char(void)              //显示字符程序 { lcd_send(0x0c); gotoxy(0,0); putchar(0x20); putchar('C');                      //实时时间指示 putchar('U'); putchar('R'); putchar('T'); putchar('I'); putchar('M'); putchar(0x20); putchar(0x7c); putchar(0x20); putchar('G');                        //给定水温指示 putchar('E'); putchar('T'); putchar(0x20);                putchar(0x7c); putchar(0x20); putchar('S');                        //当前水温指示 putchar('A'); putchar('T'); putchar(0x20); } /***************************************************************/ //call this routine to initialize all peripherals void init_devices(void)          //LCD端口初始化 { TRISD=0x00; PORTD=0xff; TRISE=0x00; PORTE=0x0f; ADCON1=0x07;              //注意PORTE口配置为I/O功能时,要将ADCON1=0X07 } /*****************************************************/ void lcd_init(void)              //显示字符初始化 { init_devices(); initgraph(); display_char(); } 7 pwm.c #include void pwm_init(void) { TMR2IF=0;              //clear interrupt flag TMR2IE=0;              //disable interrupt TMR2=0; PR2=0xff;              //period=4ms CCPR1L=0x7f;          //duty cycle CCPR1H=0x7f; CCP1CON=0xf0;          //duty cycle TRISC=0x00;            //enable RC2 output RC2=0; T2CON=0x07;            //16 prescale  enable timer2 TMR2ON=0; } 8 time0.c #include #include"hot_water.h" extern unsigned char time_flag;      //2秒      extern unsigned int time_count; extern unsigned char time1_flag;    //0.3秒 extern unsigned int time1_count; extern unsigned char second_ok;      //一秒到  extern unsigned char adc_ok;        //AD转换结束 extern unsigned char pb_ok;          //PB口中断 extern unsigned char time0_ok;      //定时器0中断 extern bank1 bit power;            //热水器允许工作 unsigned char second;              //一秒计数 unsigned char chanel;              //AD转换通道选择 /***********************************************************/ void time0_init(void)                { INTCON=0b11100000;                //开全局中断,允许定时器0溢出中断,清T0IF OPTION=0b00000111;                //分频比分配给T0,分频率为256 TMR0=0xD8;                        //定时10ms T0IE=0;                              //关定时器0 } /*************************************************************/ void time1_init(void)                //定时器1初始化 { INTCON|=0xc0; PIR1&=0xfe; PIE1|=0x01;                      //500ms TMR1H=0x0B; TMR1L=0xDB; T1CON=0x31;                      //分频比为8 } /*********************************************************/ void adc_init(void)                  //AD转换初始化 { ADGO=0;                        //禁止AD转换 TRISA=0x0b; PORTA=0xf4; ADCON1=0x05; ADCON0=(0b11000001)|(chanel<<3);  //选择转换通道 ADIF=0; ADIE=1; delay_us(100); ADON=0;                          //关AD转换 if(power==1) ADON=1; } /********************************************************/ void PORTBINT()                    //PB口电平变化中断初始化 {    TRISB=0xfF;                    //PB口全部输入 OPTION&=0x7f;                  //开中断 PORTB=0x00;        RBIE=1;                          //中断使能 PORTB=PORTB;        } /********************************************************/ void interrupt time0_isr() {  if(T0IE&T0IF)                    //定时器0中断 { T0IF=0;                        //清中断标志位 TMR0=0xb1; if(time_flag==1)                //两秒键未释放计数 time_count++; if(time1_flag==1)                //0.3秒数据快调计数 time1_count++; time0_ok=1; } if(TMR1IE&TMR1IF)                //定时器1中断 { PIR1&=0xfe;                    //清中断标志 ADGO=1; TMR1H=0xC2;                TMR1L=0x88; second++; if(second>=2)                    //一秒种计数 { second=0; second_ok=1;                //一秒钟到标志 } } if(ADIE&ADIF)                    //AD中断 { ADIF=0;                      //清中断标志 ADGO=0;                      //关闭AD adc_ok=1;                      //置转换结束标志 } if(RBIE&RBIF)                  //PB口电平变化中断 { RBIF=0;                        //清中断标志 pb_ok=1;                    //置PB口发生中断标志 PORTB=0x00;              PORTB=PORTB;                //读取PB口,为下次中断做准备    RBIF=0;    }                } 9 vol_temp.c //input :采样的电压 0---5v //ouput:热敏电阻阻值 #include #include"hot_water.h" #define MAX_RES  25897 #define VCC 1.25 #define MAX 100 bank1  float a0,a1,a2,a3,a4,a5,a6,a7,a8; bank1  float p1,p2,p3; bank1  int p; bank1  int y0,y1,y2; bank1  int x,x1,x2,x0; extern unsigned char ledbuff[21]; const unsigned int resistance_temprature[]={ 24589, 2, 23363, 4, 22212, 6, 21131, 8, 20115, 10, 19160, 12, 18260, 14, 17414, 16, 16616, 18, 15863, 20, 15153, 22, 14483, 24, 13849, 26, 13251, 28, 12685, 30, 12149, 32, 11642, 34, 11161, 36, 10705, 38, 10273, 40, 9863, 42, 9473, 44, 9103, 46, 8752, 48, 8417, 50, 8099, 52, 7797, 54, 7508, 56, 7234, 58, 6972, 60, 6722, 62, 6484, 64, 6256, 66, 6039, 68, 5832, 70, 5633, 72, 5444, 74, 5262, 76, 5089, 78, 4923, 80, 4764, 82, 4611, 84, 4465, 86, 4325, 88, 4191, 90, 4062, 92, 3939, 94, 3820, 96, 3706, 98, 3596, 100 }; /*********************************************************/ int cal_res(float vout)        //该程序由采样的电压转换成热敏电阻相对应的电阻 { int resistance; vout=vout/5.0; resistance=( int)((MAX_RES*VCC-vout*MAX_RES)/(vout+VCC)); return resistance; } /******************************************************/ void cal_temprature(float vout) { float p1,p2,p3; unsigned char p; unsigned int y0,y1,y2; unsigned int x,x1,x2,x0; unsigned char i; x= cal_res(vout);                        //由电压转换成电阻 for(i=0;i=resistance_temprature[i+2])) { x0=resistance_temprature[i]; y0=resistance_temprature[i+1]; x1=resistance_temprature[i+2]; y1=resistance_temprature[i+3]; x2=resistance_temprature[i+4]; y2=resistance_temprature[i+5]; break; } } a0=x-x1;                          //利用抛物线插值法,计算当前温度 a1=x-x2; a2=x0-x1; a3=x0-x2; a4=x-x0; a5=x1-x0; a6=x1-x2; a7=-a3; a8=-a6; p1=(a0*a1)/(a2*a3); p2=(a4*a1)/(a5*a6); p3=(a4*a0)/(a7*a8); p=p1*y0+p2*y1+p3*y2; if(p>100)RC3=0; else RC3=1; if(power==1) fuzzy_control(p);          //采样当前温度,利用模糊控制算法计算PWM的占空比 ledbuff[20]=p%10;                  //显示当前温度 ledbuff[19]=(p/10)%10; ledbuff[18]=(p/100)%10; } 10 fuzzy.c #include //input:    sample temprature //output:    output temprature //以知温度的误差和误差的变化率,利用模糊控制 //规则,得出输出温度的控制量 #define Ke  12 #define Kc  20 #define Ku  2 #define BASE_TIME 14 bank1 uint pwm_duty; bank1 float ek; bank1 float ek_1; bank1 float eck; const char fuzzy_table[14][13]={                        //line=ek,colum=eck ,place=ek*13+eck                                                                                                                                        7,6,7,6,7,7,7,4,4,2,0,0,0, 6,6,6,6,6,6,6,4,4,2,0,0,0, 7,6,7,6,7,7,7,4,4,2,0,0,0, 7,6,6,6,6,6,6,3,2,0,-1,-1,-1, 4,4,4,5,4,4,4,1,0,0,-1,-1,-1, 4,4,4,5,4,4,1,0,0,0,-3,-2,-1, 4,4,4,5,1,1,0,-1,-1,-1,-4,-4,-4, 4,4,4,5,1,1,0,-1,-1,-1,-4,-4,-4, 2,2,2,2,0,0,-1,-4,-4,-3,-4,-4,-4, 1,2,1,2,0,-3,-4,-4,-4,-3,-4,-4,-4, 0,0,0,0,-3,-3,-6,-6,-6,-6,-6,-6,-6, 0,0,0,-2,-4,-4,-7,-7,-7,-6,-7,-6,-7, 0,0,0,-2,-4,-4,-6,-6,-6,-6,-6,-6,-6, 0,0,0,-2,-4,-4,-7,-7,-7,-6,-7,-6,-7 }; void fuzzy_control(int cur_temp) { give_temp=ledbuff[8]+ledbuff[7]*10+ledbuff[6]*100;      //给定温度 ek= cur_temp - give_temp;          //求出给定温度与实际温度的误差 eck=ek-ek_1;                    //求出温度误差的变化率 ek_1=ek; ek=ek*Ke+6; if(ek>13)ek=13; if(ek<0)ek=0; eck=eck*Kc+6; if(eck>12)eck=12; if(eck<0)eck=0; output_temp=Ku*fuzzy_table[ek][eck]+7;  //求出输出温度 pwm_duty=(output_temp/BASE_TIME)*0x3ff; if(pwm_duty>0x3ff)pwm_duty=0x3ff; CCPR1L=(pwm_duty&0x3fc)>>2;          //duty cycle CCP1CON|=(pwm_duty&0x03)<<4;          //duty cycle } 11 hot_water.h void lcd_init(void);                          //LCD初始化 void display(void);                          //显示数据 void time0_init(void);                        //定时器0初始化 void delay_us(unsigned int time);              //延时 void delay(int ticks); void delay_ms(unsigned int time); void quick_keypad(void);                      //快调程序 void lcd_send(unsigned char data);              //LCD发送数据程序 void gotoz(unsigned char z);                    //置光标位置程序 void time1_init(void);                        //定时器1初始化 void adjust_ms(unsigned char *pledbuff);        //调整秒种和分钟 void adjust_hour(unsigned char *pledbuff);      //调整小时 void adjust_tw(unsigned char *pledbuff);        //调整给定温度 void change_data(void);                      //设置相应数据 void adc_init(void);                          //AD初始化 void adc_interrupt(void);                      //AD服务程序 void time1_interrupt(void);                    //定时器1服务程序 void PORTBINT();                          //PB口初始化 void pb_interrupt(void);                      //PB口服务程序 void key_realse1(void);                        //检查按键是否释放程序 unsigned char filter_sample_voltage(unsigned char *sample_voltage,unsigned char cur_voltage);                                //数据滤波程序 int cal_res(float vout) ;                        //由电压计算电阻 void cal_temprature(float vout);                //由电阻计算温度 void pwm_init(void);                        //PWM初始化 void display_char(void) ;                      //显示字符程序 附录B  模糊控制仿真程序 clear all; clear all; a=newfis('fuzzf'); a=addvar(a,'input','e',[-6,-6]); a=addmf(a,'input',1,'NB','zmf',[-6,-2.6]); a=addmf(a,'input',1,'NM','trimf',[-6.8,-4,-1.4]); a=addmf(a,'input',1,'NS','trimf',[-4.2,-2,1]); a=addmf(a,'input',1,'NO','trimf',[-2.2,0,0]); a=addmf(a,'input',1,'PO','trimf',[0,0,2.2]); a=addmf(a,'input',1,'PS','trimf',[-1,2,4.2]); a=addmf(a,'input',1,'PM','trimf',[1.4,4,6.8]); a=addmf(a,'input',1,'PB','smf',[2.6,6]); a=addvar(a,'input','ec', [-6,-6]); a=addmf(a,'input',2,'NB','zmf', [-6,-2.6]); a=addmf(a,'input',2,'NM','trimf', [-6.8,-4,-1.4]); a=addmf(a,'input',2,'NS','trimf',[-5,-2,0]); a=addmf(a,'input',2,'O','trimf',[-2,0,2]); a=addmf(a,'input',2,'PS','trimf',[0,2,5]); a=addmf(a,'input',2,'PM','trimf', [1.4,4,6.8]); a=addmf(a,'input',2,'PB','smf', [2.6,6]); a=addvar(a,'output','u',[-7,7]); a=addmf(a,'output',1,'NB','zmf',[-7,-3.6]); a=addmf(a,'output',1,'NM','trimf', [-6.8,-4,-1.4]); a=addmf(a,'output',1,'NS','trimf',[-5-1,1]); a=addmf(a,'output',1,'O','trimf', [-2,0,2]); a=addmf(a,'output',1,'PS','trimf',[-1,1,5]); a=addmf(a,'output',1,'PM','trimf', [1.4,4,6.8]); a=addmf(a,'output',1,'PB','smf',[3.6,7]); rulelist=[1 1 7 1 1; 1 2 7 1 1; 1 3 7 1 1; 1 4 7 1 1; 1 5 6 1 1; 1 6 4 1 1; 1 7 4 1 1; 2 1 7 1 1; 2 2 7 1 1; 2 3 7 1 1; 2 4 7 1 1; 2 5 6 1 1; 2 6 4 1 1; 2 7 4 1 1; 3 1 6 1 1; 3 2 6 1 1; 3 3 6 1 1; 3 4 6 1 1; 3 5 4 1 1; 3 6 5 1 1; 3 7 5 1 1; 4 1 6 1 1; 4 2 6 1 1; 4 3 5 1 1; 4 4 4 1 1; 4 5 3 1 1; 4 6 2 1 1; 4 7 2 1 1; 5 1 6 1 1; 5 2 6 1 1; 5 3 5 1 1; 5 4 4 1 1; 5 5 3 1 1; 5 6 2 1 1; 5 7 2 1 1; 6 1 5 1 1; 6 2 5 1 1; 6 3 4 1 1; 6 4 2 1 1; 6 5 2 1 1; 6 6 2 1 1; 6 7 2 1 1; 7 1 4 1 1; 7 2 4 1 1; 7 3 2 1 1; 7 4 1 1 1; 7 5 1 1 1; 7 6 1 1 1; 7 7 1 1 1; 8 1 4 1 1; 8 2 4 1 1; 8 3 2 1 1; 8 4 1 1 1; 8 5 1 1 1; 8 6 1 1 1; 8 7 1 1 1]; a=addrule(a,rulelist); showrule(a); a1=setfis(a,'DefuzzMethod','mom'); writefis(a1,'fuzzf'); a2=readfis('fuzzf'); Ulist=zeros(14,13); for i=1:14 for j=1:13 e(i)=-7+i; ec(j)=-7+j; Ulist(i,j)=evalfis([e(i),ec(j)],a2); end end Ulist=ceil(Ulist); figure(1); plotfis(a2); figure(2); plotmf(a,'input',1); figure(3); plotmf(a,'input',2); figure(4); plotmf(a,'output',1); 附录C  控制器原理图 附录D  控制器PCB图
本文档为【即热式电热水器模糊控制器的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_650122
暂无简介~
格式:doc
大小:429KB
软件:Word
页数:108
分类:建筑/施工
上传时间:2019-02-25
浏览量:66