FPGA温控风扇设计.docx
- 文档编号:7197600
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:50
- 大小:504.29KB
FPGA温控风扇设计.docx
《FPGA温控风扇设计.docx》由会员分享,可在线阅读,更多相关《FPGA温控风扇设计.docx(50页珍藏版)》请在冰豆网上搜索。
FPGA温控风扇设计
温控风扇的设计
摘要
温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。
本文设计了基于XILINXFPGA温控风扇系统,采用FPGA作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据采集到的温度,通过继电器驱动风扇电机。
采用热释电红外传感器,并根据检测到的温度与系统设定的温度的比较实现风扇电机的自动启动和停止,并能根据温度的变化自动改变风扇电机的转速,同时在LED数码管显示检测到的温度、设定的温度和转速。
第1章整体方案设计
1.1前言
随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。
过去的电器不断的显露出其不足之处。
电风扇作为家用电器的一种,同样存在类似的问题。
现在电风扇的现状:
大部分只有手动调速,再加上一个定时器,功能单一。
存在的隐患或不足:
比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。
再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。
之所以会产生这些隐患的根本原因是:
缺乏对环境的检测。
如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。
本次设计就是围绕这两点对现有电风扇进行改进。
1.2系统整体设计
本设计的整体思路是:
以XILINXFPGA作为控制中心,通过提取热释电红外传感器感应到的人体红外线信息,并利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给FPGA进行处理,在LED数码管上显示当前环境温度值以及预设温度值。
通过独立键盘输入预设温度值,其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。
同时采用PWM脉宽调制方式来改变直流风扇电机的转速。
并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。
系统结构框图如下:
1.3方案论证
本设计要实现风扇直流电机的温度控制,使风扇电机能根据环境温度的变化自动启停及改变转速,需要比较高的温度变化分辨率以及稳定可靠的换挡停机控制部件。
1.3.1温度传感器的选择
在本设计中,温度传感器的选择有以下两种方案:
方案一:
采用热敏电阻作为检测温度的核心元件,并通过运算放大器放大,由于热敏电阻会随温度变化而变化,进而产生输出电压变化的微弱电压变化信号,再经模数转换芯片ADC0809将微弱电压变化信号转化为数字信号输入FPGA处理。
方案二:
采用数字式的集成温度传感器DS18B20作为温度检测的核心元件,由其检测并直接输出数字温度信号给FPGA进行处理。
对于方案一,采用热敏电阻作为温度检测元件,有价格便宜,元件易购的优点,但热敏电阻对温度的细微变化不太敏感,在信号采集、放大以及转换的过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其自身电阻对温度的变化存在较大误差,虽然可以通过一定电路来修正,但这不仅将使电路变得更加复杂,而且在人体所处环境温度变化过程中难以检测到小的温度变化。
故该方案不适合本系统。
对于方案二,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转化等电路的误差因数,温度误差变得很小,并且由于其检测温度的原理与热敏电阻检测的原理有着本质的不同,使得其温度分辨力极高。
温度值在器件内部转化成数字量直接输出,简化了系统程序设计,又由于该温度传感器采用先进的单总线技术,与FPGA的接口变得非常简洁,抗干扰能力强,因此该方案适用于本系统。
1.3.2调速方式的选择
方案一:
采用数模转换芯片DAC0832来控制,由FPGA根据当前环境温度值输出相应数字量到DAC0832中,再由DAC0832产生相应模拟信号控制晶闸管的导通角,从而通过无级调速电路实现风扇电机转速的自动调节。
方案二:
采用FPGA软件编程实现PWM(脉冲宽度调制)调速的方法。
PWM是英文PulseWidthModulation的缩写,它是按一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的是矩形波PWM信号,在控制时需要调节PWM波得占空比。
占空比是指高电平持续时间在一个周期时间内的百分比。
在控制电机的转速时,占空比越大,转速就越快,若全为高电平,占空比为100%时,转速达到最大[2]。
对于方案一,该方案能够实现对直流风扇电机的无级调速,速度变化灵敏,但是D/A转换芯片的价格较高,与其温控状态下无级调速功能相比性价比不高。
对于方案二,相对于其他用硬件或者软硬件相结合的方法实现对电机进行调速而言,采用PWM用纯软件的方法来实现调速过程,具有更大的灵活性,并可大大降低成本,能够充分发挥FPGA的功能,对于简单速度控制系统的实现提供了一种有效的途径。
综合考虑选用方案二。
第2章各单元模块的硬件设计
系统主要器件包括热释电红外传感器、DS18B20温度传感器、XILINXFPGA、LED共阴数码管、风扇直流电机。
2.1系统器件简介
2.1.1DS18B20单线数字温度传感器简介
DS18B20数字温度传感器,是采用美国DALLAS半导体公司生产的DS18B20可组网数字温度传感器芯片封装而成,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。
适用于各种狭小空间设备数字测温和控制领域。
DS18B20的主要特征:
测量的结果直接以数字信号的形式输出,以“一线总线”方式串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力;温度测量范围在-55℃~+125℃之间,在-10℃~+85℃时精度为±0.5℃;可检测温度分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃,可实现高精度测温;它单线接口的独特性,使它与微处理器连接时仅需一条端口线即可实现与微处理器的双向通信;支持多点组网功能,即多个DS18B20可以并联在唯一的三线上,实现组网多点测温的功能;工作电压范围宽,其范围在3.0~5.5V[3]。
DS18B20内部结构主要有四部分:
64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
其管脚有三个,其中DQ为数字信号端,GND为电源地,VDD为电源输入端。
(电原理图如右图)
2.1.2热释电红外线传感器原理简介
人体辐射的红外线中心波长为9~10um,而探测元件的波长灵敏度在0.2~20um范围内几乎稳定不变。
在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长范围为7~10um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收,这样便形成了一种专门用作探测人体辐射的红外线传感器。
实质上热释电传感器是对温度敏感的传感器。
它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,如图2所示。
在环境温度有ΔT的变化时,由于有热释电效应,在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。
2.1.3风扇电机控制模块
电路图:
2.1.3蜂鸣器以及按键模块
电路图如下:
第3章软件设计
程序设置
程序设计部分主要包括主程序、DS18B20模块、风扇电机控制模块、热释电红外线传感器模块以及蜂鸣器模块。
DS18B20模块完成对DS18B20的初始化,对环境温度的实时采集、主机对温度传感器数据的读取及数据换算以及包含了温度对数码管的输出;风扇电机控制函数则根据按键值以及温度的数值完成对电机转速及启停的控制;热释电红外线传感器模块完成对人体是否存在进行检测,并将信号送到电机模块使能端入口;蜂鸣器模块对按键进行提醒。
主程序流程图如图:
顶层模块:
moduletop(clk,rst,icdata,dclk,dlk,dain,drst,key,moto,led,sc2);
inputclk;
inouticdata;
inputrst;
input[1:
0]key;
outputdclk;
outputdlk;
outputdain;
outputdrst;
outputmoto;
output[2:
0]led;
outputsc2;
wire[1:
0]jieguo;
wire[1:
0]duty_cyc;
countercounter(
.clk(clk),
.rst(rst),
.icdata(icdata),
.dclk(dclk),
.dlk(dlk),
.drst(drst),
.dain(dain),
.jieguo(jieguo),
.duty_cyc(duty_cyc)
);
dianjidianji(
.clk(clk),
.key(key),
.wd(jieguo),
.moto(moto),
.led(led),
.duty_cyc(duty_cyc)
);
fengmingqifengmingqi(
.clk(clk),
.rst(rst),
.key(key),
.sc2(sc2)
);
endmodule
DS18B20模块:
这里我们采用12位分辨率,DS18B20在750ms内把温度值转换为数字,实现高精度测温。
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
流程图如下:
Verilog代码如下:
moduleDS18B20(nReset,clk,data,icdata);//nReset是复位端;data是输出温度数据;icdata是总线
inputnReset,clk;
output[15:
0]data;
inouticdata;
wirea,b;
yuu3(
.temperature(data),
.one_wire(icdata),
.rst_n(nReset),
.clk(clk)
);
endmodule
moduleyu(
inputclk,//50MHz时钟
inputrst_n,//异步复位
inoutone_wire,//One-Wire总线
output[15:
0]temperature//输出温度值
);
//++++++++++++++++++++++++++++++++++++++
//分频器50MHz->1MHz开始
//++++++++++++++++++++++++++++++++++++++
reg[5:
0]cnt;//计数子
always@(posedgeclk,negedgerst_n)
if(!
rst_n)
cnt<=0;
else
if(cnt==49)
cnt<=0;
else
cnt<=cnt+1'b1;
regclk_1us;//1MHz时钟
always@(posedgeclk,negedgerst_n)
if(!
rst_n)
clk_1us<=0;
else
if(cnt<=24)//24=50/2-1
clk_1us<=0;
else
clk_1us<=1;
//--------------------------------------
//分频器50MHz->1MHz结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
//延时模块开始
//++++++++++++++++++++++++++++++++++++++
reg[19:
0]cnt_1us;//1us延时计数子
regcnt_1us_clear;//请1us延时计数子
always@(posedgeclk_1us)
if(cnt_1us_clear)
cnt_1us<=0;
else
cnt_1us<=cnt_1us+1'b1;
//--------------------------------------
//延时模块结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
//DS18B20状态机开始
//++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++
//格雷码
parameterS00=5'h00;
parameterS0=5'h01;
parameterS1=5'h03;
parameterS2=5'h02;
parameterS3=5'h06;
parameterS4=5'h07;
parameterS5=5'h05;
parameterS6=5'h04;
parameterS7=5'h0C;
parameterWRITE0=5'h0D;
parameterWRITE1=5'h0F;
parameterWRITE00=5'h0E;
parameterWRITE01=5'h0A;
parameterREAD0=5'h0B;
parameterREAD1=5'h09;
parameterREAD2=5'h08;
parameterREAD3=5'h18;
reg[4:
0]state;//状态寄存器
//-------------------------------------
regone_wire_buf;//One-Wire总线缓存寄存器
reg[15:
0]temperature_buf;//采集到的温度值缓存器(未处理)
reg[5:
0]step;//子状态寄存器0~50
reg[3:
0]bit_valid;//有效位
always@(posedgeclk_1us,negedgerst_n)
begin
if(!
rst_n)
begin
one_wire_buf<=1'bZ;
step<=0;
state<=S00;
end
else
begin
case(state)
S00:
begin
temperature_buf<=16'h001F;
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<=1'bZ;//释放总线
state<=S2;
end
end
S2:
begin
cnt_1us_clear<=0;
if(cnt_1us==100)//等待100us
begin
cnt_1us_clear<=1;
state<=S3;
end
end
S3:
if(~one_wire)//若18b20拉低总线,初始化成功
state<=S4;
elseif(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+1'b1;
state<=WRITE0;
end
elseif(step==1)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==2)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==3)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==4)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==5)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==6)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==7)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==8)//0x44
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==9)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==10)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==11)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==12)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==13)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==14)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==15)
begin
step<=step+1'b1;
state<=WRITE0;
end
//第一次写完,750ms后,跳回S0
elseif(step==16)
begin
one_wire_buf<=1'bZ;
step<=step+1'b1;
state<=S6;
end
//再次置数0xCC和0xBE
elseif(step==17)//0xCC
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==18)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==19)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==20)
begin
step<=step+1'b1;
state<=WRITE01;
one_wire_buf<=0;
end
elseif(step==21)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==22)
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==23)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==24)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==25)//0xBE
begin
step<=step+1'b1;
state<=WRITE0;
end
elseif(step==26)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==27)
begin
one_wire_buf<=0;
step<=step+1'b1;
state<=WRITE01;
end
elseif(step==28)
begin
one_wire_buf<=0;
ste
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 温控 风扇 设计