智能风扇设计文档.docx
《智能风扇设计文档.docx》由会员分享,可在线阅读,更多相关《智能风扇设计文档.docx(54页珍藏版)》请在冰豆网上搜索。
智能风扇设计文档
《智能风扇控制》
课程设计说明书
题目:
智能风扇设计
院系:
理工学院
班级:
电子
智能风扇的设计
摘要
本设计为一种温控风扇系统,以80C52单片机作为智能电风扇控制系统的测量和控制核心。
具有灵敏的温度感测和显示功能,系统AT89C5单片机作为控制平台对风扇转速进行控制。
可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇,控制状态随外界温度而定。
所设高低温值保存在温度传感器DS18B20内部E2ROM中,利用PWM脉宽调制技术控制电机的转速,用DS18B20温度传感器来完成温度的采集,用液晶12864LCD显示来室温及风扇的的挡。
通过数字温度传感器对外界环境温度进行数据采集,从而建立一个控制系统,使电风扇随温度的变化而自动调节档位,实现“温度高、风力大、温度低、风力弱”的性能本设计。
一系统方案论证与选择
1.核心控制模块的选择
本系统实现风扇的温度控制,需要有较高的温度变化分辨率和稳定可靠的换档停机控制部件。
2温度传感器的选用
温度传感器可由以下几种方案可供选择:
方案一:
选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入单片机处理。
方案二:
采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转换电路,将温度变化信号送入单片机处理。
方案三:
采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。
对于方案一,采用热敏电阻有价格便宜、元件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。
故该方案不适合本系统。
对于方案二,采用热电偶和桥式测量电路相对于热敏电阻其对温度的敏感性和器件的非线性误差都有较大提高,其测温范围也非常宽,从-50摄氏度到1600摄氏度均可测量。
但是依然存在电路复杂,对温度敏感性达不到本系统要求的标
准,故不采用该方案。
对于方案三,由于数
字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述两种方案的原理有着本质的不同,使得其温度分辨力极高。
温度值在器件内部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术(1-WRIE),与单片机的接口变的非常简洁,抗干扰能力强。
关于DS18B20的详细参数参看下面“硬件设计”中的器件介绍。
3控制核心的选择
方案一:
采用电压比较电路作为控制部件。
温度传感器采用热敏电阻或热电偶等,温度信号转为电信号并放大,由集成运放组成的比较电路判决控制风扇转速,当高于或低于某值时将风扇切换到相应档位。
方案二:
采用单片机作为控制核心。
以软件编程的方法进行温度判断,并在端口输出控制信号。
对于方案一,采用电压比较电路具有电路简单、易于实现,以及无需编写软件程序的特点,但控制方式过于单一,不能自由设置上下限动作温度,无法满足不同用户以及不同环境下的多种动作温度要求,故不在本系统中采用。
对于方案二,以单片机作为控制器,通过编写程序不但能将传感器感测到的温度通过显示电路显示出来,而且用户能通过键盘接口,自由设置上下限动作温度值,满足全方位的需求。
并且通过程序判断温度具有极高的精准度,能精确把握环境温度的微小变化。
故本系统采用方案二。
4显示电路
方案一:
采用八共阴数码管显示温度,动态扫描显示方式。
方案二:
采用液晶显示屏LCD显示温度
对于方案一,该方案成本低廉,显示温度明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。
不足的地方是扫描显示方式是使五个LED逐个点亮,因此会有闪烁,但是人眼的视觉暂留时间为20MS,当数码管扫描周期小于这个时间时人眼将感觉不到闪烁,因此可以通过增大扫描频率来消除闪烁感。
对于方案二,液晶体显示屏具有显示字符优美,不但能显示数字还能显示字符甚至图形的优点,这是LED数码管无法比拟的。
用因为液晶的显示美观大方,给人以视觉美。
所以选择此方案,用12864led来显示室内温度和挡位。
5调速方式
方案一:
采用变压器调节方式,运用电磁感应原理将220V电压通过线圈降压到不同的电压,控制风扇电机接到不同电压值的线圈上可控制电机的转速,从而控制风扇风力大小。
方案二:
采用电机驱动模块来调速。
对于方案一,由于采用变压器改变电压调节,有风速级别限制,不能适应人性化要求。
且在变压过程中会有损耗发热,效率不高,发热有不安全因素。
对于方案二,以L985电机驱动模块,之前没用过,所以可以学习新知识。
操作方便简单。
所以选择方案二。
6控制执行部件
方案一:
采用数模转换芯片AD0832控制,由单片机根据当前温度值送出相应数字量到AD0832,由AD0832产生模拟信号控制晶闸管的导通角,从而配合无
级调速电路实现温控时的自动无级风力调节。
方案二:
ds18b20为数字式的,所以可直接将数据通过程序转换在液晶上可直接显示当前室温。
对于方案一,该方案能够实现在风扇处于温控状态时也能无级调速,但是D/A转换芯片价格较高,与其温控状态下无级调速功能相比性价比不高。
对于方案二,省去了其他芯片的控制可以使程序简单化。
所以选择方案二。
二系统理论分析与计算
1.系统的总体设计
本设计以STC89C52单片机为核心部件结合ds18b20温度传感器、LCD显示、直流电机驱动模块驱动风扇转及显示等部分组成。
系统框图如图所示:
2.单元模块的设计及实现
2.1单片机模块
22DS18B20模块
2.3LCD12864液晶显示模块
2.4电机驱动模块
2.5电源模块
2.6USB电路图
2.7智能风扇原理图
3各模块的实物图
3.1电机驱动模块
3.2DS18B20
3.3LCD2864
3.4单片机
3.5直流电机
4.资料说明
4.1单片机的选择由于较熟悉52单片机,所以选择现用的单片机。
4.2DS18B20资料说明
4.3LCD12864资料说明
(1)模块引脚说明
128X64引脚说明
引脚号
引脚名称
方向
功能说明
1
VSS
-
模块的电源地
2
VDD
-
模块的电源正端
3
V0
-
LCD驱动电压输入端
4
RS(CS)
H/L
并行的指令/数据选择信号;串行的片选信号
5
R/W(SID)
H/L
并行的读写选择信号;串行的数据口
6
E(CLK)
H/L
并行的使能信号;串行的同步时钟
7
DB0
H/L
数据0
8
DB1
H/L
数据1
9
DB2
H/L
数据2
10
DB3
H/L
数据3
11
DB4
H/L
数据4
12
DB5
H/L
数据5
13
DB6
H/L
数据6
14
DB7
H/L
数据7
15
PSB
H/L
并/串行接口选择:
H-并行;L-串行
16
NC
空脚
17
/RET
H/L
复位低电平有效
18
NC
空脚
19
LED_A
-
背光源正极(LED+5V)
20
LED_K
-
背光源负极(LED-OV)
逻辑工作电压(VDD):
4.5~5.5V
电源地(GND):
0V
工作温度(Ta):
0~60℃(常温)/-20~75℃(宽温)
(2)接口时序
模块有并行和串行两种连接方法(时序如下):
8位并行连接时序图
MPU写资料到模块
MPU从模块读出资料
2、串行连接时序图
串行数据传送共分三个字节完成:
第一字节:
串口控制—格式11111ABC
A为数据传送方向控制:
H表示数据从LCD到MCU,L表示数据从MCU到LCD
B为数据类型选择:
H表示数据是显示数据,L表示数据是控制指令
C固定为0
第二字节:
(并行)8位数据的高4位—格式DDDD0000
第三字节:
(并行)8位数据的低4位—格式0000DDDD
串行接口时序参数:
(测试条件:
T=25℃VDD=4.5V)
(3)用户指令集
1、指令表1:
(RE=0:
基本指令集)
指令
指令码
说明
执行时间(540KHZ)
RS
RW
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
清除显示
0
0
0
0
0
0
0
0
0
1
将DDRAM填满“20H”,并且设定DDRAM的地址计数器(AC)到“00H”
4.6ms
地址归位
0
0
0
0
0
0
0
0
1
X
设定DDRAM的地址计数器(AC)到“00H”,并且将游标移到开头原点位置;这个指令并不改变DDRAM的内容
4.6ms
进入点
设定
0
0
0
0
0
0
0
1
I/D
S
指定在资料的读取与写入时,设定游标移动方向及指定显示的移位
72us
显示状态
开/关
0
0
0
0
0
0
1
D
C
B
D=1:
整体显示ON
C=1:
游标ON
B=1:
游标位置ON
72us
游标或显示移位控制
0
0
0
0
0
1
S/C
R/L
X
X
设定游标的移动与显示的移位控制位元;这个指令并不改变DDRAM的内容
72us
功能设定
0
0
0
0
1
DL
X
0
RE
X
X
DL=1(必须设为1)
RE=1:
扩充指令集动作
RE=0:
基本指令集动作
72us
设定CGRAM地址
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
设定CGRAM地址到地址计数器(AC)
72us
设定DDRAM
地址
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
设定DDRAM地址到地址计数器(AC)
72us
读取忙碌标志(BF)和地址
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
读取忙碌标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
0us
写资料到RAM
1
0
D7
D6
D5
D4
D3
D2
D1
D0
写入资料到内部的RAM(DDRAM/CGRAM/IRAM/GDRAM)
72us
读出RAM的值
1
1
D7
D6
D5
D4
D3
D2
D1
D0
从内部RAM读取资料(DDRAM/CGRAM/IRAM/GDRAM)
72us
指令表—2:
(RE=1:
扩充指令集)
指令
指令码
说明
执行时间(540KHZ)
RS
RW
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
待命模式
0
0
0
0
0
0
0
0
0
1
将DDRAM填满“20H”,并且设定DDRAM的地址计数器(AC)到“00H”
72us
卷动地址或IRAM地址选择
0
0
0
0
0
0
0
0
1
SR
SR=1:
允许输入垂直卷动地址
SR=0:
允许输入IRAM地址
72us
反白选择
0
0
0
0
0
0
0
1
R1
R0
选择4行中的任一行作反白显示,并可决定反白与否
72us
睡眠模式
0
0
0
0
0
0
1
SL
X
X
SL=1:
脱离睡眠模式
SL=0:
进入睡眠模式
72us
扩充功能设定
0
0
0
0
1
1
X
1
RE
G
0
RE=1:
扩充指令集动作
RE=0:
基本指令集动作
G=1:
绘图显示ON
G=0:
绘图显示OFF
72us
设定IRAM地址或卷动地址
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
SR=1:
AC5—AC0为垂直卷动地址
SR=0:
AC3—AC0为ICONIRAM地址
72us
设定绘图RAM地址
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
设定CGRAM地址到地址计数器(AC)
72us
备注:
1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。
(4)具体指令介绍:
1、清除显示
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
L
H
功能:
清除显示屏幕,把DDRAM位址计数器调整为“00H”
2、位址归位
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
H
X
功能:
把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM
3、位址归位
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
H
I/D
S
功能:
把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能:
执行该命令后,所设置的行将显示在屏幕的第一行。
显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。
Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。
4、显示状态开/关
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
H
D
C
B
功能:
D=1;整体显示ONC=1;游标ONB=1;游标位置ON
(5)、游标或显示移位控制
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
H
S/C
R/L
X
X
功能:
设定游标的移动与显示的移位控制位:
这个指令并不改变DDRAM的内容
(6)功能设定
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
H
DL
X
0RE
X
X
功能:
DL=1(必须设为1)RE=1;扩充指令集动作RE=0:
基本指令集动作
(7)设定CGRAM位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
H
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定CGRAM位址到位址计数器(AC)
(8)设定DDRAM位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
H
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定DDRAM位址到位址计数器(AC)
(9)读取忙碌状态(BF)和位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
H
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值
(10)写资料到RAM
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
L
D7
D6
D5
D4
D3
D2
D1
D0
功能:
写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)
(11)读出RAM的值
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
H
D7
D6
D5
D4
D3
D2
D1
D0
功能:
从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)
4.5电机驱动模块资料说明
主要采用L298N,通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,输入引脚与输出引脚的逻辑关系图为
统原理图如下:
产品参数:
1.驱动芯片:
L298N双H桥直流电机驱动芯片
2.驱动部分端子供电范围Vs:
+5V~+35V;如需要板内取电,则供电范围Vs:
+7V~+35V
3.驱动部分峰值电流Io:
2A
4.逻辑部分端子供电范围Vss:
+5V~+7V(可板内取电+5V)
5.逻辑部分工作电流范围:
0~36mA
6.控制信号输入电压范围:
低电平:
-0.3V≤Vin≤1.5V
高电平:
2.3V≤Vin≤Vss
7.使能信号输入电压范围:
低电平:
-0.3≤Vin≤1.5V(控制信号无效)
高电平:
2.3V≤Vin≤Vss(控制信号有效)
8.最大功耗:
20W(温度T=75℃时)
9.存储温度:
-25℃~+130℃
10.驱动板尺寸:
55mm*49mm*33mm(带固定铜柱和散热片高度)
11.驱动板重量:
33g
12.其他扩展:
控制方向指示灯、逻辑部分板内取电接口。
使用说明:
步进电机的驱动:
板上的ENA与ENB为高电平时有效,这里的电平指的是TTL电平。
ENA为A1和A2的使能端,ENB为B1和IB2的使能端。
BJ接步进电机公共端。
步进电机控制逻辑如下所示,其中A、B、C、D为步进电机的四个线圈,为1表示有电流通过,为0表示没有电流流过。
线圈连线图如下图所示(以四相步进电机为例)。
直流电机的驱动:
4.6外部供电电压范围资料说明
由于个芯片的耐压范围限制,本实验参考电压为5v,电流不得超过2A.
三总体方案及主程序
1总体方案
做此项目用到的只是有LCD12864,DS18B20温度传感器。
电机驱动模块等。
实现的结果是让风扇随着温度的变化显示不同的档位。
所以在设计思路是先实现温度的变化在液晶上显示,然后由温度在一定的范围设置一个转速,又因为转速是由PWM来控制的,所以用PWM的占空比的大小来设定转速,本语句的实现使用case语句,为方便显示我们用num来表示了在一定温度范围内执行case里的哪一个num,同时又让num充当的档位。
所以在一定的范围内,在液晶上又显示了档位,至于显示只要会使用LCD12864,和DS18B20温度传感器都不是问题。
下图为温度范围档位及占空比之间的关系
挡位大小
温度范围
占空比
0
[>340]
10/12
1
[330340]
8/12
2
[320330]
6/12
3
[310320]
4/12
4
[<310]
0/12
2源程序
//并行连接,PSB引脚接电源正
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P3^5;//数据\指令选择
sbitrw=P3^6;//读\写选择
sbite=P3^4;//读\写使能;
sbitds=P2^2;//18B20脚;
sbitpsb=P3^7;
sbitin1=P1^6;
sbitin2=P1^7;
sbiten=P2^5;
sbitdula=P2^6;
sbitwela=P2^7;
//uintwendu1=270;
//uintwendu2=290;
//uintwendu3=310;
//uintwendu4=330;
uinttemp,num,show;
floatftemp;
uinta,b,c,d;
uchargao=10,di=2;
ucharcodehang1[]={"当前温度:
"};
ucharcodetable[]="0123456789.c";
ucharcodehang2[]={"当前档位:
"};
ucharcodetable1[]="0123";
voidwritecom(ucharcom);
voidwritedat(uchardat);
voidinitinal(void);
voiddelay(uintk)//把你的延时函数改为以毫秒计时的一个延时函数,但是一个“非标准的”毫秒
{
inti,j;
for(i=k;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voiddsreset()//ds18b20初始化函数
{
uinti;
ds=0;//拉低总线开始复位
i=103;
while(i>0)i--;
ds=1;//释放总线
i=4;
while(i>0)i--;//省去了等待芯片返回应答的过程;
}
bitreadbit(void)//ds18b20读取一个二进制位,参照时序图
{
uinti;
bitdat;