智能电风扇模拟控制系统设计Word格式文档下载.docx
《智能电风扇模拟控制系统设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能电风扇模拟控制系统设计Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
方案三:
采用外转子无刷电机作为风扇驱动,外转子无刷电机转速的可控性强,从每分钟几转到每分钟几万转都可以很容易实现,而且变速平稳、转速稳定、转速的线性度好。
外转子无刷电机的转动可以通过软件编程调整它的转速,而且外转子无刷电机带动风扇转动的风力大,实验过程中,发现它的风量较为合适,稳定度也比较高。
故选择采用这种方案,来完成风扇控制系统。
2、单片机最小系统MCU选择:
方案一:
采用STM32微控制器,STM32是一款功能强大32位的单片机,但由于本次设计要实现的功能较少,STM32的代码操作比较繁琐,对于简单的设计用STM32会性能过剩,也由于stm32价格比较贵,所以放弃该方案。
方案二:
采用ATMEGAl6单片机,它是一款低功耗8位单片机,虽然它的性能比较好,并且也能完成实验要求,但他的价格比较贵,性价比不高。
经综合考虑,放弃该方案。
方案三:
采用80C52单片机,它是一款八位单片机,具有32个I/O引脚,2个定时、计数器,5个中断源等等优点,对于本次设计来说,使用80C52系列单片机,节约成本并且电路结构简单,最终选择该方案。
3、蓝牙模块选择
采用全模式蓝牙模块,这种蓝牙需要软件方面进行设置,设置主从模式传输速率和连接密码,模块功能较为强大,但由于本次设计用到的功能单一,所以放弃该方案。
采用单模式蓝牙模块,这种蓝牙模块功能较为单一,但是操作起来方便,使用简单,价格便宜,考虑到种种因素最终选择该方案。
4、温度检测模块选择
采用温湿度传感器,这种模块可以传回温湿度,满足了产品所需的要求,但是由于该温湿度传感器体积较大,价格稍贵所以放弃该方案。
采用DS18b20,该款温度传感器口碑较好,精确度高,集成度高,且价格低廉,考虑到整体设计,代码的简洁程度,最终选择该方案。
三、系统硬件电路与程序设计
(1)温度检测部分
通过DS18B20来读取空气中温度的值,并且实时返回该数据,单片机根据得到的数据有效地进行精准的控制和显示,极大地满足了用户对于温度的要求。
(2)温度、电机转速和定时显示部分
通过风速按键来改变单片机I/O口所输出的PWM信号,驱动电机调速,通过定时按键实现定时关机功能,通过自动模式按键实现对温度的实时操作,当温度大于25度时切换到自然风,当温度在20度和25度之间时切换到常风,当温度在20度以下时切换到睡眠风。
(3)按键循环读取键值部分
每隔一段时间扫描一次按键,这样可以定时得到所需的键值。
然后通过单片机实时对电机进行操作。
(4)蓝牙手机客户端部分
如图所示,这是我们自己制作的客户端,界面简单大方,简洁明了,画面友好,功能丰富强大,可以随时远距离进行对电风扇的风速的操作,并且可以随时打开关闭摇头功能,还有定时功能,可以设定任意时间的数值,可以设定模式选择,设定自动模式下可以使风扇根据温度的大小而改变风速。
我们还设定了总开关,可以随时关机和开机。
五、软件设计
本系统中单片机起到检测输入和控制输出等显示作用,所以软件设计比较复杂,启动后进入输入扫描,通过按键和安卓客户端来控制单片机给外转子无刷电机驱动力的大小,最后通过单片机控制液晶显示出来,整个软件设计形成一个循环的控制系统。
(软件流程图见附录三,软件主要代码见附录四)
6、测试方法与过程
打开电源,模拟电风扇处于关机状态,在这个状态下按下按键1,开机。
发现电机自动到了自然风状态开始转动,温度也开始实时显示,说明按键和电机还有温度传感器功能良好。
然后按下摇头按键,摇头功能也正常,满足本次题目的要求。
然后测试定时功能,按下定时按键,液晶显示从10秒递减,当递减到0时关机,此时摇头和电机功能均失效,所有按键都失效。
再次开机,选择自动模式,此时用手触摸ds18b20,当温度升高时,会自动改变风速。
最后测试蓝牙客户端的功能,打开蓝牙客户端,依次按下各个按键,发现电机能按照本次设计要求进行转动,说明各项功能完好,本次设计圆满成功。
七、总结
综合上述的测试结果,本设计不仅圆满地完成了题目的基本要求,还完美的完成了发挥部分的要求。
经过几天的艰苦奋斗和不懈努力,我和我的队友成功的调试出了各个模块并且联调成功,期间我们学到了很多也收获了很多,最重要的是我们锻炼出了坚持不懈的品格和在遇到困难时永不服输的精神,感谢学校给我们这次锻炼的机会。
八、附录
附录一:
硬件实物图
附录二:
电路原理图
附录三:
程序流程图
附录四:
voidmain(void)//主程序
{
inttemp;
floattemperature;
chardisplaytemp[16];
//定义显示区域临时存储数组
chardisplaytime[4]="
000"
;
//定义显示定时时间的存储数组
charkey;
DCOUT=1;
LCD_Init();
//初始化液晶
DelayMs(20);
//延时有助于稳定
yaotoutingzhi();
LCD_Clear();
//清屏
Init_Timer();
Lcd_User_Chr();
//写入自定义字符
LCD_Write_String(0,0,"
speed:
"
);
LCD_Write_String(8,0,"
time:
xianshiguanji();
LCD_Write_Char(13,1,0x01);
//写入温度右上角点
LCD_Write_Char(14,1,'
C'
//写入字符C
DCOUT=0;
while
(1)//主循环
{
//循环调用按键扫描
key=KeyScan();
if(key==3&
&
yunxingmoshi==0)//第一个按键,速度等级增加
{
//if(PWM_ON==10||PWM_ON==0)
//{
//PWM_ON=20;
//xianshiziranfen();
//}
//elseif(PWM_ON==20)
//PWM_ON=5;
//xianshishuimianfen();
//elseif(PWM_ON==5)
//PWM_ON=10;
////PWM_ON=58;
//xianshichangfen();
if(PWM_ON==0)
{
PWM_ON=20;
zongkaiguan=1;
xianshiziranfen();
}
elseif(PWM_ON==20)
{
PWM_ON=10;
zongkaiguan=1;
xianshichangfen();
}
elseif(PWM_ON==10)
PWM_ON=5;
xianshishuimianfen();
elseif(PWM_ON==5)
PWM_ON=0;
//PWM_ON=58;
zongkaiguan=0;
xianshiguanji();
yaotoumoshi=0;
yaotoutingzhi();
}
if(key==4&
zongkaiguan)//
{
dingshimoshi=1;
shijian+=10;
if(shijian>
990)
shijian==990;
if(key==5&
zongkaiguan)//3
if(yaotoumoshi==0)
yaotoumoshi=1;
zhenzhuanfanzhuan=1;
yaotouzhengzhuan();
else
{
yaotoumoshi=0;
yaotoutingzhi();
//yaotou1=1;
//yaotou2=1;
}
if(key==6&
zongkaiguan)//4
if(yunxingmoshi==0)
yunxingmoshi=1;
yunxingmoshi=0;
if(readtimeflag==1)
{
readtimeflag=0;
if(shijian>
0)
shijian--;
if(shijian==0&
zongkaiguan&
dingshimoshi)
{
zongkaiguan=0;
dingshimoshi=0;
sprintf(displaytime,"
%d"
shijian);
//打印时间值
=100)
LCD_Write_String(13,0,displaytime);
//
else
=10)
LCD_Write_Char(13,0,'
0'
LCD_Write_String(14,0,displaytime);
//
else
LCD_Write_Char(13,0,'
LCD_Write_Char(14,0,'
LCD_Write_String(15,0,displaytime);
}
if(flag_REC==1)//
flag_REC=0;
if(bufff[0]=='
O'
bufff[1]=='
N'
)//第一个字节为O,第二个字节为N,第三个字节为控制码
switch(bufff[2])
case'
A'
:
//自然风
if(zongkaiguan)
{
PWM_ON=20;
xianshiziranfen();
}
break;
B'
:
if(zongkaiguan)
{//常风
PWM_ON=10;
xianshichangfen();
}break;
//睡眠风
{PWM_ON=5;
xianshishuimianfen();
}
case'
D'
//打开摇头
if(zongkaiguan)
{
yaotoumoshi=1;
zhenzhuanfanzhuan=1;
yaotouzhengzhuan();
}
E'
yaotoumoshi=0;
yaotoutingzhi();
//yaotou1=1;
//yaotou2=1;
F'
//自动
yunxingmoshi=1;
G'
yunxingmoshi=0;
//右转
//bee=0;
J'
if(zongkaiguan)
{
dingshimoshi=1;
shijian=(int)(bufff[3]-'
)*(int)100+(int)(bufff[4]-'
)*(int)10+(int)(bufff[5]-'
if(shijian>
shijian=999;
}
H'
zongkaiguan=1;
I'
PWM_ON=0;
zongkaiguan=0;
dingshimoshi=0;
xianshiguanji();
if(ReadTempFlag==1)
ReadTempFlag=0;
temp=ReadTemperature();
temperature=(float)temp*0.0625;
sprintf(displaytemp,"
Temp%7.3f"
temperature);
//打印温度值
if(temperature>
10.0&
temperature<
40.0)
LCD_Write_String(0,1,displaytemp);
//显示第二行
if(yunxingmoshi==1&
zongkaiguan)
if(temperature<
20.0)
PWM_ON=5;
}
elseif(temperature<
=25.0)
elseif(temperature>
25.0)
PWM_ON=20;
xianshiziranfen();
//SendStr(displaytemp);
}
}