版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 温控风扇的设计摘 要: 温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能cpu风扇等。本文设计了基于altera fpga温控风扇系统,采用fpga作为控制器,利用温度传感器ds18b20作为温度采集元件,并根据采集到的温度,通过放大电路驱动风扇电机。采用热释电红外传感器,并根据检测到的温度与系统设定的温度的比较实现风扇电机的自动启动和停止,并能根温度的变化自动改变风扇电机的转速,同时在lcd1602显示检测到的温度与设定的温度。【关键词】altera cyclone iv;按键模块;lcd1602显示模块;
2、人体模块;目 录第1章 前言1第2章 整体方案设计22.1系统整体设计.42.2 方案论证.5 2.2.1 温度传感器的选择.5 2.2.2 调速方式的选择.6第3章 各单元模块的硬件设计.7 3.1系统主要件.7 3.2系统器件介.7 3.2.1 ds18b20单线数字温度传感器简介.7 3.2.2 dac0832芯片的简介.7第4章 软件设计.8 4.1程序设置.8第5章 时序分析和综合.95.1 rtl viewer.95.2 technology map viewer.95.3 时序仿真.10第6章 硬件实物.10第7章 结论.14参考文献.15附录 程序代码.15 第1章 前言随着人
3、们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。过去的电器不断的显露出其不足之处。电风扇作为家用电器的一种,同样存在类似的问题。现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。之所以会产生这些隐患的根本原因是:缺乏对环境的检测。如果能使电风扇具有对环境进行检测的功能,当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。 第2章 整体方案设计2.1系统整体设计本设计的整体思路是:以alte
4、ra fpga作为控制中心,通过提取热释电红外传感器感应到的人体红外线信息,并利用温度传感器ds18b20检测环境温度并直接输出数字温度信号给fpga进行处理,在lcd1602上显示当前环境温度值以及预设温度值。通过独立键盘输入预设温度值,其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。同时采用ocl放大电路方式来改变直流风扇电机的转速。并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。系统结构框图如下: 人体红外传感器模块 altera fpga 按键输入 lcd1602显示模块温度传感(ds18b20)d/.a转换(或pwm驱动) 放大电路 直流
5、电机2.2 方案论证 本设计要实现风扇直流电机的温度控制,使风扇电机能根据环境温度的变化自动启停及改变转速,需要比较高的温度变化分辨率以及稳定可靠的换挡停机控制部件。2.2.1 温度传感器的选择在本设计中,温度传感器的选择有以下两种方案:方案一:采用热敏电阻作为检测温度的核心元件,并通过运算放大器放大,由于热敏电阻会随温度变化而变化,进而产生输出电压变化的微弱电压变化信号,再经模数转换芯片dac0832将微弱电压变化信号转化为数字信号输入fpga处理。方案二:采用数字式的集成温度传感器ds18b20作为温度检测的核心元件,由其检测并直接输出数字温度信号给fpga进行处理。对于方案一,采用热敏电
6、阻作为温度检测元件,有价格便宜,元件易购的优点,但热敏电阻对温度的细微变化不太敏感,在信号采集、放大以及转换的过程中还会产生失真和误差,并且由于热敏电阻的r-t关系的非线性,其自身电阻对温度的变化存在较大误差,虽然可以通过一定电路来修正,但这不仅将使电路变得更加复杂,而且在人体所处环境温度变化过程中难以检测到小的温度变化。故该方案不适合本系统。对于方案二,由于数字式集成温度传感器ds18b20的高度集成化,大大降低了外接放大转化等电路的误差因数,温度误差变得很小,并且由于其检测温度的原理与热敏电阻检测的原理有着本质的不同,使得其温度分辨力极高。温度值在器件内部转化成数字量直接输出,简化了系统程
7、序设计,又由于该温度传感器采用先进的单总线技术,与fpga的接口变得非常简洁,抗干扰能力强,因此该方案适用于本系统。 2.2.2 调速方式的选择 方案一:采用数模转换芯片dac0832来控制,由fpga根据当前环境温度值输出相应数字量到dac0832中,再由dac0832产生相应模拟信号控制晶闸管的导通角,从而通过无级调速电路实现风扇电机转速的自动调节。方案二:采用其他串行口数转换芯片,或fpga软件编程实现pwm(脉冲宽度调制)调速的方法。pwm是按一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在pwm驱动控制的调节系统中,最常用的是矩形波pwm信号,在控制时需要调节p
8、wm波得占空比。 对于方案一,该方案能够实现对直流风扇电机的无级调速,速度变化灵。 对于方案二,相对于其他用硬件或者软硬件相结合的方法实现对电机进行调速而言,采用pwm 用纯软件的方法来实现调速过程,具有更大的灵活性能够充分发挥fpga的功能,对于简单速度控制系统的实现提供了一种有效的途径。 第3章 各单元模块的硬件设计3.1系统主要器件 ds18b20温度传感器、altera fpga、lcd1602、风扇直流电机。3.2系统器件简介3.2.1 ds18b20单线数字温度传感器简介 单线数字温度传感器ds18b20简介新的一线器件体积更小、适用电压更宽、更经济 dallas 半导体公司的数字
9、化温度传感器ds1820是世界上第一片支持 一线总线接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为丈量系统的构建引进全新概念。ds18b20、 ds1822 一线总线数字化温度传感器 同ds1820一样,ds18b20也 支持一线总线接口,丈量温度范围为 -55c+125c,在-10+85c范围内,精度为0.5c。ds1822的精度较差为 2c 。现场温度直接以一线总线的数字方式传输,大大进步了系统的抗干扰性。 ds18b20内部结构主要有四部分:64位rom、温度传感器、非挥发的温度报警触发器th和tl、配置寄存器。其管脚有三个,其中dq为数字信号端,gnd为
10、电源地,vdd为电源输入端。3.2.2 dac0832芯片的简介 dac0832是8分辨率的d/a转换集成芯片。与微处理器完全兼容。这个da芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。d/a转换器由8位输入锁存器、8位dac寄存器、8位d/a转换电路及转换控制电路构成。 根据对dac0832的数据锁存器和dac寄存器的不同的控制方式,dac0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。 dac0832引脚功能电路应用原理图dac0832是采样频率为八位的d/a转换芯片,集成电路内有两级输入寄存器,使dac0832芯片具备双缓冲、单缓冲和直通三种
11、输入方式,以便适于各种电路的需要(如要求多路d/a异步输入、同步转换等)。所以这个芯片的应用很广泛,关于dac0832应用的一些重要资料见下图: d/a转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。运放的反馈电阻可通过rfb端引用片内固有电阻,也可外接。dac0832逻辑输入满足ttl电平,可直接与ttl电路或微机电路连接。 第4章 软件设计4.1程序设置程序设计部分主要包括主程序、ds18b20初始化函数、ds18b20温度转换函数、温度读取函数、键盘扫描函数、lcd1602显示函数、温度处理函数以及dac0832转换。ds18b20初始化函数
12、完成对ds18b20的初始化;ds18b20温度转换函数完成对环境温度的实时采集;温度读取函数完成主机对温度传感器数据的读取及数据换算,键盘扫描函数则根据需要完成初值的加减设定;温度处理函数对采集到的温度进行分析出理,为dac0832的转换提供条件;风扇电机控制函数则根据温度的数值,再经过功率放大电路对电机转速及启停的控制。d/a转换模块人体红外检测模块键盘模块lcd1602显示模块温度测量模块顶层文件开始 第5章时序分析和综合5.1 rtl viewer5.2 technology map viewer5.3 时序仿真 第6章 硬件实物 1.以上两图为上电后检测的室温2. 为温度自动控制风扇
13、档位3.为手动调风扇档位 第7章 结论本课题设计是基于fpga的温控风扇,作为一个入门简易的课题。现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。 存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。之所以会产生这些隐患的根本原因是:缺乏对环境的检测。如果能使电风扇具有对环境进行检测的功能,当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。在整个设计过程中,充分发挥了组员们的主观能动性。程序编写中,由于思路不清晰,开始时遇到了很多的问题,后经和同学讨论,向老师请教,最终完成对程序的编写。通过实际程序设
14、计和调试,逐步掌握模块化程序设计方法和调试技术,提高软件设计、调试能。最终较好的完成了设计,达到了预期的目的。但是由于个人能力的原因,整个系统看起来还是显得较为简单,只实现了一些最基本的功能,还有许多可以扩展的地方,当然,也存在许多不足之处。 参考文献1verilog hdl入门(第3版)j.bhasker 著 北京航空航天大学出版社2altera fpga_cpld应用_基础篇 王诚、薛小刚等著 人民邮电出版社3altera fpga_cpld设计_高级篇 eda先锋工作室 王诚、吴继华等著 人民邮电出版社附录程序代码/*顶层模块*/module da18(clk,rs, rw, en,da
15、t,one_wire,button,buttona,men,data);input clk;input men,button,buttona;inout one_wire;output dat;output rs,rw,en; output 7:0 data; /output 15:0 tem;/output 3:0 dig;/output 7:0 seg;wire 15:0 temperature;wire 7:0 dat,data;wire rs,rw,en,men,button,buttona;temperature temperature(.clk(clk),.one_wire(one
16、_wire),.temperature(temperature); /ds1820程序元件例化/scan scan(.clk(clk),.dig(dig),.seg(seg),.temperature(temperature);lcd lcd(.clk(clk),.temperature(temperature),.rs(rs),.rw(rw),.en(en),.dat(dat); /lcd1602程序元件例化da0832 da0832 (.clk(clk),.temperature(temperature),.button(button), /da0832程序元件例化 .buttona(bu
17、ttona),.men(men),.data(data); endmodule/*lcd1602显示温度模块*/module lcd(clk, rs, rw, en,dat,temperature); input clk; input 15:0 temperature; output 7:0 dat; output rs,rw,en; /tri en; reg e; reg 7:0 dat; reg rs; reg 15:0 counter; reg 4:0 current,next; reg clkr; reg 1:0 cnt; wire 3:0 a,b,c,d; assign a = te
18、mperature3:0; assign b = temperature7:4; assign c = temperature11:8; assign d = temperature15:12; parameter set0=4h0; parameter set1=4h1; parameter set2=4h2; parameter set3=4h3; parameter dat0=4h4; parameter dat1=4h5; parameter dat2=4h6; parameter dat3=4h7; parameter dat4=4h8; parameter dat5=4h9; pa
19、rameter dat6=4ha; parameter dat7=4hb; parameter dat8=4hc; parameter dat9=4hd; parameter dat10=4he; parameter dat11=5h10; always (posedge clk) / 10mhz begin counter=counter+1; if(counter=16h0005) clkr=clkr; end always (posedge clkr ) begin current=next; case(current) set0: begin rs=0; dat=8h30; next=
20、set1; end set1: begin rs=0; dat=8h0c; next=set2; end set2: begin rs=0; dat=8h6; next=set3; end set3: begin rs=0; dat=8h1; next=dat0; end dat0: begin rs=1; dat=t; next=dat1; end dat1: begin rs=1; dat=e; next=dat2; end dat2: begin rs=1; dat=m; next=dat3; end dat3: begin rs=1; dat=:; next=dat4; end dat
21、4: begin if(c=4b0000) begin rs=1; dat=0; next=dat5; end else if (c=4b0001) begin rs=1; dat=1; next=dat5; end else if (c=4b0010) begin rs=1; dat=2; next=dat5; end else if (c=4b0011) begin rs=1; dat=3; next=dat5; end else if (c=4b0100) begin rs=1; dat=4; next=dat5; end else if (c=4b0101) begin rs=1; d
22、at=5; next=dat5; end else if (c=4b0110) begin rs=1; dat=6; next=dat5; end else if (c=4b0111) begin rs=1; dat=7; next=dat5; end else if (c=4b1000) begin rs=1; dat=8; next=dat5; end else if (c=4b1001) begin rs=1; dat=9; next=dat5; endend dat5: begin if(b=4b0000) begin rs=1; dat=0; next=dat6; end else
23、if (b=4b0001) begin rs=1; dat=1; next=dat6; end else if (b=4b0010) begin rs=1; dat=2; next=dat6; end else if (b=4b0011) begin rs=1; dat=3; next=dat6; end else if (b=4b0100) begin rs=1; dat=4; next=dat6; end else if (b=4b0101) begin rs=1; dat=5; next=dat6; end else if (b=4b0110) begin rs=1; dat=6; ne
24、xt=dat6; end else if (b=4b0111) begin rs=1; dat=7; next=dat6; end else if (b=4b1000) begin rs=1; dat=8; next=dat6; end else if (b=4b1001) begin rs=1; dat=9; next=dat6; endend dat6: begin rs=1; dat=.; next=dat7; end dat7: begin if(a=4b0000) begin rs=1; dat=0; next=dat8; end else if (a=4b0001) begin r
25、s=1; dat=1; next=dat8; end else if (a=4b0010) begin rs=1; dat=2; next=dat8; end else if (a=4b0011) begin rs=1; dat=3; next=dat8; end else if (a=4b0100) begin rs=1; dat=4; next=dat8; end else if (a=4b0101) begin rs=1; dat=5; next=dat8; end else if (a=4b0110) begin rs=1; dat=6; next=dat8; end else if
26、(a=4b0111) begin rs=1; dat=7; next=dat8; end else if (a=4b1000) begin rs=1; dat=8; next=dat8; end else if (a=4b1001) begin rs=1; dat=9; next=dat8; endend dat8: begin rs=1; dat=8hdf; next=dat9; end dat9: begin rs=1; dat=c; next=set0; end endcase end /assign en=clkr|e; assign en=clkr; assign rw=0; end
27、module /*温控模块*/module temperature( input clk, / 50mhz时钟 /input rst_n, / 异步复位 inout one_wire, / one-wire总线 output 15:0 temperature / 输出温度值); reg rst_n; reg 19:0count; always(posedge clk) begin if(count20h80000) /? begin rst_n=1; count=count+1; end else if(count20h8ffff) /? begin rst_n=0; count=count+
28、1; end else rst_n1mhz 开始/+reg 5:0 cnt; / 计数子always (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 结
29、束/-/延时模块的使用/+/ 延时模块 开始/+reg 19:0 cnt_1us; / 1us延时计数子reg cnt_1us_clear; / 请1us延时计数子always (posedge clk_1us) /可设定时n ns if (cnt_1us_clear) cnt_1us = 0; else cnt_1us = cnt_1us + 1b1; /加一次1us/-/ 延时模块 结束/-/+/ ds18b20状态机 开始/+/+/ 格雷码parameter s00 = 5h00; /步数parameter s0 = 5h01;parameter s1 = 5h03;parameter
30、s2 = 5h02;parameter s3 = 5h06;parameter s4 = 5h07;parameter 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;
31、reg 4:0 state; / 状态寄存器/-reg one_wire_buf; / one-wire总线 缓存寄存器reg 15:0 temperature_buf; / 采集到的温度值缓存器(未处理)reg 5:0 step; / 子状态寄存器 050reg 3:0 bit_valid; / 有效位 always (posedge clk_1us, negedge rst_n) /clk_1us即每1us执行一次begin if (!rst_n) begin one_wire_buf = 1bz; step = 0; state = s00; /s00为变量名 end else begi
32、n case (state) s00 : begin temperature_buf = 16h001f; state = s0; 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;
33、 /cnt_1us_clear有效时cnt_1us清零 if (cnt_1us = 100) / 等待100us begin cnt_1us_clear = 1; state = s3; end end s3 : if (one_wire) / 若18b20拉低总线,初始化成功 one_wire输入 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; stat
34、e = s5; end end s5 : begin / 写数据 if (step = 0) / 0xcc 跳过rom begin step = step + 1b1; state = write0; end else 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; / ste
35、p = step + 1b1; state = write01; end else if (step = 4) begin step = step + 1b1; state = write0; end else if (step = 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 = st
36、ep + 1b1; state = write01; end else if (step = 8) / 0x44 启动转换 begin step = step + 1b1; state = write0; end else if (step = 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) beg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年情绪病的测试题及答案
- 2026年last weekend 测试题及答案
- 2026年计量经济期末测试题及答案
- 2026年青钢葵花测试题及答案
- 2026年关于诚实的测试题及答案
- 2026年关于轴对称测试题及答案
- 2026年手机指令测试题及答案
- 2026年斗地主智力测试题及答案
- 2026年南充市中考道德与法治试卷(含答案及解析)
- 麻纺厂员工职业发展规划细则
- 酒品采购协议范例
- MOOC 探秘移动通信-重庆电子工程职业学院 中国大学慕课答案
- JJG 365-2008电化学氧测定仪
- 三年级下语文(部编版)古诗默写
- 高考英语高频词汇汇总清单(共1801个)
- 2014年高考作文(北京卷)“老规矩”作文公式全解
- T-GDWCA 0037-2018 高柔性多芯拖链控制电缆
- 农药销售技巧培训
- 团体心理治疗实践
- 肌电图科内讲座课件
- 校园规划课件
评论
0/150
提交评论