FPGA温控风扇设计_第1页
FPGA温控风扇设计_第2页
FPGA温控风扇设计_第3页
FPGA温控风扇设计_第4页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

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

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

7、th Modulation 的缩写,它是按一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式, 在 PWM驱动控制的调节系统中, 最常用的是矩形波 PWM信号,在控制时需要调节 PWM波得占空比。占空比是指高电平持续时间在一个周期时间内的百分比。 在控制电机的转速时, 占空比越大, 2 。 100% 转速就越快,若全为高电平,占空比为时,转速达到最大对于方案一,该方案能够实现对直流风扇电机的无级调速, 速度变化灵敏, 但是 D/A 转换芯片的价格较高,与其温控状态下无级调速功能相比性价比不高。对于方案二,相对于其他用硬件或者软硬件相结合的方法实现对电机进行调速而言,采用 PWM

8、用纯软件的方法来实现调速过程,具有更大的灵活性,并可大大降低成本,能够充分发挥 FPGA的功能,对于简单速度控制系统的实现提供了一种有效的途径。综合考虑选用方案二。各单元模块的硬件设计第二章系统主要器件包括热释电红外传感器、DS18B20温度传感器、 XILINX FPGA、 LED共阴数码管、风扇直流电机。2.1 系统器件简介单线数字温度传感器简介DS18B20数字温度传感器,是采用美国 DALLAS半导体公司生产的 DS18B20可组网数字温度传感器芯片封装而成,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。适用于各种狭小空间设

9、备数字测温和控制领域。DS18B20的主要特征:测量的结果直接以数字信号的形式输出,以“一线总线”方式串行传送给 CPU,同时可传送 CRC校验码,具有极强的抗干扰纠错能力;温度测量范围在 -55 +125之间,在-10 +85时精度为± 0.5 ;可检测 温度分辨率为 912位,对应的可分辨温度分别为 0.5 ,0.25 ,0.125 和 0.0625 ,可实现高精度测温; 它单线接口的独特性, 使它与微处理器连接时仅需一条端口线即可实现与微处理器的双向通信; 支持多点组网功能, 即多个 DS18B20可以并联在唯一的三线上,实现组网多点测温的功能;工作电压范围宽, 3 。3.05

10、.5V其范围在DS18B20内部结构主要有四部分:64 位 ROM、温度传感器、非挥发的温度报警触发器 TH和 TL、配置寄存器。 其管脚有三个,其中 DQ为数字信号端, GND为电源地, VDD为电源输入端。(电原理图如右图)热释电红外线传感器原理简介人体辐射的红外线中心波长为910um,而探测元件的波长灵敏度在0.220um 范围内几乎稳定不变。 在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长范围为 710um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收, 这样便形成了一种专门用作探测人体辐射的红外线传感器。实质上热释电传感器是对温度敏感的传感器

11、。 它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,如图 2 所示。在环境温度有 T 的变化时,由于有热释电效应,在两个电极上会产生电荷Q,即在两电极之间产生一微弱的电压 V。风扇电机控制模块电路图:蜂鸣器以及按键模块电路图如下:软件设计第三章 程序设置程序设计部分主要包括主程序、DS18B20模块、风扇电机控制模块、热释电红外线传感器模块以及蜂鸣器模块。DS18B20模块完成对 DS18B20的初始化,对环境温度的实时采集、主机对温度传感器数据的读取及数据换算以及包含了温度对数码管的输出;风扇电机控制函数则根据按键值以及温度的数值完成对电机转速及启停的控制;热释电红外线传感器模块完

12、成对人体是否存在进行检测,并将信号送到电机模块使能端入口;蜂鸣器模块对按键进行提醒。主程序流程图如图:顶层模块:module top(clk,rst,icdata,dclk,dlk,dain,drst,key,moto,led,sc2);inputclk;inouticdata;inputrst;input1: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(cl

13、k),.rst(rst),.icdata(icdata),.dclk(dclk),.dlk(dlk),.drst(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);endmoduleDS18B20模块:这里我们采用 12 位分辨率 ,DS18

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

15、cdata);/nReset是复位端 ;data 是输出温度数据 ;icdata 是总线 input nReset,clk;output 15:0 data;inout icdata;wire a,b;yuu3(.temperature(data),.one_wire(icdata),.rst_n(nReset),.clk(clk);endmodulemodule yu(inputclk,/ 50MHz 时钟inputrst_n,/ 异步复位inoutone_wire,/ One -Wire 总线output 15:0 temperature/ 输出温度值);/+/ 分频器 50MHz -&g

16、t;1MHz开始/+reg 5:0 cnt;/ 计数子always (posedge clk, negedge rst_n)if (!rst_n)cnt <= 0;elseif (cnt = 49)cnt <= 0;elsecnt <= cnt + 1'b1;reg clk_1us;/ 1MHz 时钟always (posedge clk, negedge rst_n)if (!rst_n)clk_1us <= 0;elseif (cnt <= 24)/ 24 = 50/2 - 1clk_1us <= 0;elseclk_1us <= 1;/-

17、/ 分频器 50MHz ->1MHz结束/-/+/ 延时模块 开始/+reg 19:0 cnt_1us;/ 1us 延时计数子reg cnt_1us_clear;/ 请 1us 延时计数子always (posedge clk_1us)if (cnt_1us_clear)cnt_1us <= 0;elsecnt_1us <= cnt_1us + 1'b1;/-/ 延时模块 结束/-/+/ DS18B20 状态机 开始/+/+/ 格雷码parameter S00= 5'h00;parameter S0= 5'h01;parameter S1= 5'

18、;h03;parameter S2= 5'h02;parameter S3= 5'h06;parameter S4= 5'h07;parameter S5= 5'h05;parameter S6= 5'h04;parameter S7= 5'h0C;parameter WRITE0= 5'h0D;parameter WRITE1= 5'h0F;parameter WRITE00 = 5'h0E;parameter WRITE01 = 5'h0A;parameter READ0= 5'h0B;paramete

19、r READ1= 5'h09;parameter READ2= 5'h08;parameter READ3= 5'h18;reg 4:0 state;/ 状态寄存器/-reg one_wire_buf;/ One -Wire 总线 缓存寄存器reg 15:0 temperature_buf;/ 采集到的温度值缓存器(未处理)reg 5:0 step;有效位 / 子状态寄存器 reg 3:0 bit_valid;050always (posedge clk_1us, negedge rst_n)beginif (!rst_n)beginone_wire_buf <=

20、 1'bZ;step<= 0;state<= S00;endelsebegincase (state)S00 : begintemperature_buf <= 16'h001F;state<= S0;endS0 :begin/ 初始化cnt_1us_clear <= 1;one_wire_buf<= 0;state<= S1;endS1 :begincnt_1us_clear <= 0;if (cnt_1us = 500)/ 延时 500usbegincnt_1us_clear <= 1;one_wire_buf<=

21、 1'bZ;/ 释放总线state<= S2;endendS2 :begincnt_1us_clear <= 0;if (cnt_1us = 100)/ 等待 100usbegincnt_1us_clear <= 1;state<= S3;endendS3 :if (one_wire)/ 若 18b20 拉低总线 ,初始化成功state <= S4;else if (one_wire)/ 否则,初始化不成功 ,返回 S0state <= S0;S4 :begincnt_1us_clear <= 0;S5 :if (cnt_1us = 400)/

22、 再延时 400usbegincnt_1us_clear <= 1;state<= S5;endendbegin/ 写数据if(step = 0)/ 0xCCbeginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 1)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 2)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;en

23、delse if (step = 3)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 4)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 5)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 6)beginone_wire_buf <= 0;step<= step + 1

24、9;b1;<= WRITE01;stateendelse if (step = 7)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 8)/ 0x44beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 9)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 10)beginone_wire_

25、buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 11)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 12)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 13)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 14)begin

26、one_wire_buf <= 0;step<= step + 1'b1;<= WRITE01;stateendelse if (step = 15)beginstep<= step + 1'b1;state <= WRITE0;end/ 第一次写完 ,750ms 后,跳回 S0 else if (step = 16)beginone_wire_buf <= 1'bZ;step<= step + 1'b1;state<= S6;end/ 再次置数 0xCC 和 0xBEelse if (step = 17)/ 0x

27、CCbeginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 18)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 19)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 20)beginstep<= step + 1'b1;state <= WRITE01;one_wire_b

28、uf <= 0;endelse if (step = 21)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 22)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 23)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 24)beginone_wire_buf <= 0;step

29、<= step + 1'b1;state<= WRITE01;endelse if (step = 25)/ 0xBEbeginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 26)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 27)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRI

30、TE01;endelse if (step = 28)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 29)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step = 30)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;endelse if (step

31、 = 31)beginstep<= step + 1'b1;state <= WRITE0;endelse if (step = 32)beginone_wire_buf <= 0;step<= step + 1'b1;state<= WRITE01;end/ 第二次写完 ,跳到 S7,直接开始读数据S6 :else if (step = 33)beginstep<= step + 1'b1;state <= S7;endendbegincnt_1us_clear <= 0;if (cnt_1us = 750000 | o

32、ne_wire)/ 延时 750ms!begincnt_1us_clear <= 1;state<= S0;/ 跳回 S0,再次初始化endendS7 :begin/ 读数据if(step = 34)beginbit_valid<= 0;one_wire_buf <= 0;step<= step + 1'b1;<= READ0;stateendelse if (step = 35)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b

33、1;state<= READ0;endelse if (step = 36)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 37)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 38)begin

34、bit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 39)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 40)beginbit_valid<= bit_valid + 1'b1;one_wire_b

35、uf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 41)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 42)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<

36、= READ0;endelse if (step = 43)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 44)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 45)beginbit_valid&l

37、t;= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 46)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 47)begin<= bit_valid + 1'b1;bit_validone_wire_buf <= 0;

38、step<= step + 1'b1;state<= READ0;endelse if (step = 48)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;endelse if (step = 49)beginbit_valid<= bit_valid + 1'b1;one_wire_buf <= 0;step<= step + 1'b1;state<= READ0;end

39、else if (step = 50)beginstep<= 0;state <= S0;endend/+/ 写状态机/+WRITE0 :begincnt_1us_clear <= 0;one_wire_buf<= 0;/ 输出 0if (cnt_1us = 80)/ 延时 80usbegincnt_1us_clear <= 1;one_wire_buf<= 1'bZ;/ 释放总线,自动拉高state<= WRITE00;endendWRITE00 :/ 空状态state <= S5;WRITE01 :/ 空状态state <= W

40、RITE1;WRITE1 :begincnt_1us_clear <= 0;one_wire_buf<= 1'bZ;/ 输出1释放总线,自动拉高if (cnt_1us = 80)/ 延时 80usbegincnt_1us_clear <= 1;state<= S5;endend/-/ 写状态机/-/+/ 读状态机/+READ0 : state <= READ1;/ 空延时状态READ1 :begincnt_1us_clear <= 0;one_wire_buf<= 1'bZ;/ 释放总线if (cnt_1us = 10)/ 再延时 10

41、usbegincnt_1us_clear <= 1;state<= READ2;endendREAD2 :/ 读取数据begintemperature_bufbit_valid <= one_wire;state<= READ3;endREAD3 :begincnt_1us_clear <= 0;if (cnt_1us = 55)/ 再延时 55usbegincnt_1us_clear <= 1;state<= S7;endend/-/ 读状态机/-default : state <= S00;endcaseendendassign one_wi

42、re = one_wire_buf;/ 注意双向口的使用/-/ DS18B20 状态机 结束/-/+/ 对采集到的温度进行处理 开始/+wire 15:0 t_buf = temperature_buf & 16'h07FF;assign temperature3:0= (t_buf3:0 * 10) >> 4;/ 小数点后一位assign temperature7:4= (t_buf7:4 >= 10) ? (t_buf7:4- 10) : t_buf7:4;/ 个位assign temperature11:8= (t_buf7:4 >= 10) ?

43、(t_buf11:8 + 1) : t_buf11:8; /十位assign temperature15:12 = temperature_buf12 ? 1 : 0;/ 正负位, 0 正 1 负/-/ 对采集到的温度进行处理 结束/-endmodulemodule chuli(data,jieguo);input 15:0 data;output 2:0 jieguo;wire 7:0 temp;reg 2:0 jieguo;assign temp7:0 = data11:4;always(temp)begincase (temp)15: jieguo<=0;16: jieguo<

44、;=0;17: jieguo<=0;18: jieguo<=1;19: jieguo<=1;20: jieguo<=1;21: jieguo<=2;22: jieguo<=2;23: jieguo<=2;24: jieguo<=3;25: jieguo<=3;26: jieguo<=3;27: jieguo<=4;28: jieguo<=4;29: jieguo<=4;30: jieguo<=5;31: jieguo<=5;32: jieguo<=5;33: jieguo<=6;34: jie

45、guo<=6;35: jieguo<=6;36: jieguo<=7;37: jieguo<=7;38: jieguo<=7;endcaseendEndmodulemodule DPY4(clk,rst,dclk,dlk,drst,dain,dpy0,dpy1,dpy2,dpy3);input clk;input rst;output dclk;output dlk;output drst;output dain;input3:0dpy0;input3:0dpy1;input3:0dpy2;input3:0dpy3;parameterzero = 8'b1100_0000,one= 8'b1111_1001,two= 8'b1010_0100,three= 8'b1011_0000,four = 8'b1001_1001,five = 8'b1001_0010,six= 8'b1000_0010,seven= 8'b1111_1000,eight=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论