FPGA温控风扇的设计(共42页).doc

上传人:飞****2 文档编号:16270800 上传时间:2022-05-16 格式:DOC 页数:42 大小:573.50KB
返回 下载 相关 举报
FPGA温控风扇的设计(共42页).doc_第1页
第1页 / 共42页
FPGA温控风扇的设计(共42页).doc_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《FPGA温控风扇的设计(共42页).doc》由会员分享,可在线阅读,更多相关《FPGA温控风扇的设计(共42页).doc(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上温控风扇的设计摘 要温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于XILINX FPGA温控风扇系统,采用FPGA作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据采集到的温度,通过继电器驱动风扇电机。采用热释电红外传感器,并根据检测到的温度与系统设定的温度的比较实现风扇电机的自动启动和停止,并能根据温度的变化自动改变风扇电机的转速,同时在LED数码管显示检测到的温度、设定的温度和转速。第一章 整体方案设计1.1前言随着人们生活水平及科技水平

2、的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。过去的电器不断的显露出其不足之处。电风扇作为家用电器的一种,同样存在类似的问题。现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。之所以会产生这些隐患的根本原因是:缺乏对环境的检测。如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速

3、甚至关闭风扇,这样一来就避免了上述的不足。本次设计就是围绕这两点对现有电风扇进行改进。1.2系统整体设计本设计的整体思路是:以XILINX FPGA作为控制中心,通过提取热释电红外传感器感应到的人体红外线信息,并利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给FPGA进行处理,在LED数码管上显示当前环境温度值以及预设温度值。通过独立键盘输入预设温度值,其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。同时采用PWM脉宽调制方式来改变直流风扇电机的转速。并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。系统结构框图如下:数码管键盘输入X

4、ILINX FPGA热释电红外传感器蜂鸣器温度传感(DS18B20)PWM驱动电路直流电机1.3方案论证本设计要实现风扇直流电机的温度控制,使风扇电机能根据环境温度的变化自动启停及改变转速,需要比较高的温度变化分辨率以及稳定可靠的换挡停机控制部件。1.3.1 温度传感器的选择在本设计中,温度传感器的选择有以下两种方案:方案一:采用热敏电阻作为检测温度的核心元件,并通过运算放大器放大,由于热敏电阻会随温度变化而变化,进而产生输出电压变化的微弱电压变化信号,再经模数转换芯片ADC0809将微弱电压变化信号转化为数字信号输入FPGA处理。方案二:采用数字式的集成温度传感器DS18B20作为温度检测的

5、核心元件,由其检测并直接输出数字温度信号给FPGA进行处理。对于方案一,采用热敏电阻作为温度检测元件,有价格便宜,元件易购的优点,但热敏电阻对温度的细微变化不太敏感,在信号采集、放大以及转换的过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其自身电阻对温度的变化存在较大误差,虽然可以通过一定电路来修正,但这不仅将使电路变得更加复杂,而且在人体所处环境温度变化过程中难以检测到小的温度变化。故该方案不适合本系统。对于方案二,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转化等电路的误差因数,温度误差变得很小,并且由于其检测温度的原理与热敏电阻检测的原理有着本

6、质的不同,使得其温度分辨力极高。温度值在器件内部转化成数字量直接输出,简化了系统程序设计,又由于该温度传感器采用先进的单总线技术,与FPGA的接口变得非常简洁,抗干扰能力强,因此该方案适用于本系统。1.3.2 调速方式的选择方案一:采用数模转换芯片DAC0832来控制,由FPGA根据当前环境温度值输出相应数字量到DAC0832中,再由DAC0832产生相应模拟信号控制晶闸管的导通角,从而通过无级调速电路实现风扇电机转速的自动调节。方案二:采用FPGA软件编程实现PWM(脉冲宽度调制)调速的方法。PWM是英文Pulse Width Modulation的缩写,它是按一定的规律改变脉冲序列的脉冲宽

7、度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的是矩形波PWM信号,在控制时需要调节PWM波得占空比。占空比是指高电平持续时间在一个周期时间内的百分比。在控制电机的转速时,占空比越大,转速就越快,若全为高电平,占空比为100%时,转速达到最大 。对于方案一,该方案能够实现对直流风扇电机的无级调速,速度变化灵敏,但是D/A转换芯片的价格较高,与其温控状态下无级调速功能相比性价比不高。 对于方案二,相对于其他用硬件或者软硬件相结合的方法实现对电机进行调速而言,采用PWM 用纯软件的方法来实现调速过程,具有更大的灵活性,并可大大降低成本,能够充分发挥FPGA的功能,对于简

8、单速度控制系统的实现提供了一种有效的途径。综合考虑选用方案二。第二章 各单元模块的硬件设计系统主要器件包括热释电红外传感器、DS18B20温度传感器、XILINX FPGA、LED共阴数码管、风扇直流电机。2.1系统器件简介2.1.1 DS18B20单线数字温度传感器简介DS18B20数字温度传感器,是采用美国DALLAS半导体公司生产的DS18B20可组网数字温度传感器芯片封装而成,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。适用于各种狭小空间设备数字测温和控制领域。DS18B20的主要特征:测量的结果直接以数字信号的形式输出,

9、以“一线总线”方式串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力;温度测量范围在-55+125之间,在-10+85时精度为0.5;可检测温度分辨率为912位,对应的可分辨温度分别为0.5,0.25,0.125和0.0625,可实现高精度测温;它单线接口的独特性,使它与微处理器连接时仅需一条端口线即可实现与微处理器的双向通信;支持多点组网功能,即多个DS18B20可以并联在唯一的三线上,实现组网多点测温的功能;工作电压范围宽,其范围在3.05.5V。DS18B20内部结构主要有四部分:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。其管脚有三个,其中D

10、Q为数字信号端,GND为电源地,VDD为电源输入端。 (电原理图如右图)2.1.2 热释电红外线传感器原理简介人体辐射的红外线中心波长为 910um,而探测元件的波长灵敏度在 0.220um 范围内几乎稳定不变。在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长范围为 710um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收,这样便形成了一种专门用作探测人体辐射的红外线传感器。 实质上热释电传感器是对温度敏感的传感器。它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,如图2所示。在环境温度有T的变化时,由于有热释电效应,在两个电极上会产生电荷Q,即

11、在两电极之间产生一微弱的电压V。2.1.3 风扇电机控制模块电路图:2.1.3 蜂鸣器以及按键模块电路图如下: 第三章 软件设计程序设置程序设计部分主要包括主程序、DS18B20模块、风扇电机控制模块、热释电红外线传感器模块以及蜂鸣器模块。DS18B20模块完成对DS18B20的初始化,对环境温度的实时采集、主机对温度传感器数据的读取及数据换算以及包含了温度对数码管的输出;风扇电机控制函数则根据按键值以及温度的数值完成对电机转速及启停的控制;热释电红外线传感器模块完成对人体是否存在进行检测,并将信号送到电机模块使能端入口;蜂鸣器模块对按键进行提醒。主程序流程图如图:顶层模块:module to

12、p(clk,rst,icdata,dclk,dlk,dain,drst,key,moto,led,sc2);input clk;inout icdata;input rst;input 1:0key;output dclk;output dlk;output dain;output drst;output moto;output 2:0led;output sc2;wire 1:0jieguo;wire 1:0duty_cyc;counter counter( .clk(clk), .rst(rst), .icdata(icdata), .dclk(dclk), .dlk(dlk), .drs

13、t(drst), .dain(dain), .jieguo(jieguo), .duty_cyc(duty_cyc) );dianji dianji( .clk(clk), .key(key), .wd(jieguo), .moto(moto), .led(led), .duty_cyc(duty_cyc) );fengmingqi fengmingqi( .clk(clk), .rst(rst), .key(key), .sc2(sc2) );endmodule DS18B20模块:这里我们采用12 位分辨率,DS18B20在 750ms 内把温度值转换为数字,实现高精度测温。根据 DS18

14、B20 的通讯协议,主机控制 DS18B20 完成温度转换必须经过三个步骤:每一次读写之前都要对 DS18B20 进行复位操作,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复位要求主 CPU 将数据线下拉 500 微秒,然后释放,当 DS18B20 收到信号后等待 1660 微秒左右,后发出 60240 微秒的存在低脉冲,主 CPU 收到此信号表示复位成功。流程图如下:Verilog代码如下:module DS18B20(nReset,clk,data,icdata);/nReset是复位端;data是输出温度数据;icdata是总线i

15、nput nReset,clk;output 15:0 data;inout icdata;wire a,b;yu u3(.temperature(data),.one_wire(icdata),.rst_n(nReset),.clk(clk); endmodule module yu( input clk, / 50MHz时钟 input rst_n, / 异步复位 inout one_wire, / One-Wire总线 output 15:0 temperature / 输出温度值 ); /+ / 分频器50MHz-1MHz 开始 /+ reg 5:0 cnt; / 计数子 always

16、 (posedge clk, negedge rst_n) if (!rst_n) cnt = 0; else if (cnt = 49) cnt = 0; else cnt = cnt + 1b1; reg clk_1us; / 1MHz 时钟 always (posedge clk, negedge rst_n) if (!rst_n) clk_1us = 0; else if (cnt = 24) / 24 = 50/2 - 1 clk_1us = 0; else clk_1us 1MHz 结束 /- /+ / 延时模块 开始 /+ reg 19:0 cnt_1us; / 1us延时计数

17、子 reg cnt_1us_clear; / 请1us延时计数子 always (posedge clk_1us) if (cnt_1us_clear) cnt_1us = 0; else cnt_1us = cnt_1us + 1b1; /- / 延时模块 结束 /- /+ / DS18B20状态机 开始 /+ /+ / 格雷码 parameter S00 = 5h00; parameter S0 = 5h01; parameter S1 = 5h03; parameter S2 = 5h02; parameter S3 = 5h06; parameter S4 = 5h07; parame

18、ter S5 = 5h05; parameter S6 = 5h04; parameter S7 = 5h0C; parameter WRITE0 = 5h0D; parameter WRITE1 = 5h0F; parameter WRITE00 = 5h0E; parameter WRITE01 = 5h0A; parameter READ0 = 5h0B; parameter READ1 = 5h09; parameter READ2 = 5h08; parameter READ3 = 5h18; reg 4:0 state; / 状态寄存器 /- reg one_wire_buf; /

19、 One-Wire总线 缓存寄存器 reg 15:0 temperature_buf; / 采集到的温度值缓存器(未处理) reg 5:0 step; / 子状态寄存器 050 reg 3:0 bit_valid; / 有效位 always (posedge clk_1us, negedge rst_n) begin if (!rst_n) begin one_wire_buf = 1bZ; step = 0; state = S00; end else begin case (state) S00 : begin temperature_buf = 16h001F; state = S0;

20、end S0 : begin / 初始化 cnt_1us_clear = 1; one_wire_buf = 0; state = S1; end S1 : begin cnt_1us_clear = 0; if (cnt_1us = 500) / 延时500us begin cnt_1us_clear = 1; one_wire_buf = 1bZ; / 释放总线 state = S2; end end S2 : begin cnt_1us_clear = 0; if (cnt_1us = 100) / 等待100us begin cnt_1us_clear = 1; state = S3;

21、 end end S3 : if (one_wire) / 若18b20拉低总线,初始化成功 state = S4; else if (one_wire) / 否则,初始化不成功,返回S0 state = S0; S4 : begin cnt_1us_clear = 0; if (cnt_1us = 400) / 再延时400us begin cnt_1us_clear = 1; state = S5; end end S5 : begin / 写数据 if (step = 0) / 0xCC begin step = step + 1b1; state = WRITE0; end else

22、if (step = 1) begin step = step + 1b1; state = WRITE0; end else if (step = 2) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 3) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 4) begin step = step + 1b1; state = WRITE0; end else if (st

23、ep = 5) begin step = step + 1b1; state = WRITE0; end else if (step = 6) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 7) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 8) / 0x44 begin step = step + 1b1; state = WRITE0; end else if (s

24、tep = 9) begin step = step + 1b1; state = WRITE0; end else if (step = 10) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 11) begin step = step + 1b1; state = WRITE0; end else if (step = 12) begin step = step + 1b1; state = WRITE0; end else if (step = 13) begin step =

25、 step + 1b1; state = WRITE0; end else if (step = 14) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 15) begin step = step + 1b1; state = WRITE0; end / 第一次写完,750ms后,跳回S0 else if (step = 16) begin one_wire_buf = 1bZ; step = step + 1b1; state = S6; end / 再次置数0xCC和0xBE e

26、lse if (step = 17) / 0xCC begin step = step + 1b1; state = WRITE0; end else if (step = 18) begin step = step + 1b1; state = WRITE0; end else if (step = 19) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 20) begin step = step + 1b1; state = WRITE01; one_wire_buf = 0;

27、end else if (step = 21) begin step = step + 1b1; state = WRITE0; end else if (step = 22) begin step = step + 1b1; state = WRITE0; end else if (step = 23) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 24) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; en

28、d else if (step = 25) / 0xBE begin step = step + 1b1; state = WRITE0; end else if (step = 26) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 27) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 28) begin one_wire_buf = 0; step = step + 1b1; state = WRITE01; end else if (step = 29) begin one_wire_buf = 0; step = step + 1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁