简易电动窗帘
学号:61010102
姓名:倪春花
1、申请题目:简易电动窗帘
n 现实生活中在不同的场合、不同的时间,对外部光线环境会有有不同的需求。简易电动窗帘正是根据实际需求应运而生的。根据具体需求选择不同的窗帘工作模式,可以定时,可以手动,可以光控,可以根据场景设定特殊模式,充满人性的智能化设计让生活更加方便舒适。
2、课题背景:
n 目前市场上的窗帘一般不具有自动控制功能,某些需要玻璃窗(墙)的大型场合需要配备专门人员负责窗帘升降管理,浪费人力资源。我想设计一种具有人控、光控、定时控制和场景控制四种模式的简易电动窗帘。可以根据具体需要来设置。省时省力,成本低廉,使用方便。可以广泛应用在图书馆、商务大楼、商场、家庭等场合。
3、项目规划:
n 功能、指标、规模
v 系统的功能比较丰富,主要有以下功能:
① 可以在系统工作的任何时候强制退出,这在实际应用中是很必要的,以防有特殊情况需要紧急退出。
② 在选择具体工作模式前进行转速选择,满足不同的需求。
③ 通过键盘选择不同的工作模式,智能而又人性化。具体而言,
A、定时模式下,可以设置时间,倒计时结束窗帘运动。现实生活中,有时需要在某个时间窗帘自动拉开不需要人去操作就可以用到这个功能;
B、手动模式下,通过按键5,6,7分别代表上升停止下降。现实生活中就和普通窗帘一样,满足最基本的需求。当然,如果加上信号采集和接收模块,即可做成更方便的遥控控制。
C、光控模式下,可以根据周围环境的光线强度,判断窗帘的运动。当光强较强时,经过判断窗帘自动下降,光强较弱时,窗帘自动上升。
D、场景模式下,通过设定具体模式(比如,家庭影院模式:窗帘在设定的电影时间内保持关闭,营造良好的影院氛围;睡眠早叫模式:窗帘自动关闭,到了预定时间打开,起到叫醒作用),通过设定时间,到时自动上升。
④ 为了系统的稳健性,还有模式选择返回功能,设定时间清除功能。
v 指标:
窗帘的运动用步进电机的转动模拟;计时模式下,有数码管显示倒计时;人控模式下,通过键盘控制窗帘运动方式;用键盘进行模式的选择和整个系统的运行过程;用LED灯详细显示状态的跳转、输出的变化、选择的速度、选择的模式、选择的场景
v 不做出实物的窗帘,采用步进电机的正转反转来模拟窗帘的上升下降,电机的转速来模拟窗帘运动速度。通过光强弱变化改变光敏电阻阻值,从而改变输出电压。人为的控制主要通过4*4键盘实现。
n 面板(显示)、操作、规则
按键部分:
⑴按D键,全局复位;按E键确认;按F键开始;
⑵按A,2,3,4键分别选择模式1(定时),模式2(手动),模式3(光控),模式4(场景)
⑶手动模式下,按5,6,7键分别代表上升,停止,下降
⑷场景模式下,按A,B键分别选择家庭影院模式或者睡眠早叫模式
⑸设置时间时,若发现输错,可以按C键清除,在选择模式过程中,按C键可以重新选择模式。
显示部分:
用四个数码管显示设定的时间和倒计时过程。
用四个LED灯显示当前状态,用四个LED灯显示输出的控制步进电机的四个脉冲序列,用一个LED灯显示倒计时结束电机开始运动的timeover信号用两个LED灯显示所选择的速度模式,用两个LED灯显示选择的场景模式,用四个LED灯显示窗帘工作的模式。(显示所用到的灯比较多,可能不熟悉我的操作流程的会看的眼花缭乱,所以用小纸片都标出来了)
n 输入、输出接口
输入通过键盘和光感模块,输出接至步进电机(四相)控制电机运动。
4、实现方案:
n 核心问题
1、步进电机的控制:
首先,步进电机的速度需要可调
其次,步进电机转动需要实时控制,用来保证窗帘的安全(转到头了就强制停止)
2、显示问题:
通过点阵或者数码管将系统的工作过程,输入输出显示清楚;
通过数码管显示倒计时时间。
3.光电信号转换
根据光强的大小利用光敏电阻将光信号转变为电信号,输出控制信号,控制步进电机的转动。
n 解决方案
1、查阅资料后发现步进电机的运动很有特点,是用脉冲控制的,所以我想办法找出了老师所借给我的步进电机的运动特点。当输出信号在“0001”和“0100”之间循环时,电机以每步36°的步进角顺时针旋转,当输出信号在“1000”和“0010”之间循环时,电机以同样的步进角逆时针旋转。所以我通过VHDL语言编写了电机控制模块,让输出的步进电机控制信号根据前面所选的方向,在速度模式选择选出来的速度作为时钟控制下进行正常的运动。这样,速度可变的问题也可以解决了。
2、由于要显示的东西太多,在16*16点阵板上也不能很好的展示,所以索性用了最简洁明了的LED灯,虽然简单,但是各个状态所要显示的信号都能一目了然。
3、光电信号的转换部分我最后使用了光感模块,它的功能是当没有光时,输出高电平,有光时,输出低电平。这已经满足了我设计的需求。因为在我的系统中,主要是模拟这个光感的效果,并不一定要将发生跳变的光强点设定得非常精确,如果要将光强设定的很精确,那么整个系统受环境的影响太大了,温度、湿度、气压等可能都会影响。
5、系统结构:
n 系统框图
状态机
|
键盘输入
|
转速选择
|
电机运动
|
模式选择
|
n 模块功能描述
我的总体模块有:
键盘模块,用于正确的进行输入输出,控制状态机的跳转和系统的运行过程;
状态机模块,用于控制系统整个流程的进行和变化;
速度选择模块,根据键盘的输入选择不同的速度模式,从而控制总分频模式输出相应频率的脉冲;
时间模块,用于设定时间并进行倒计时,倒计时结束产生timeover信号控制电机运动;
电机控制模块,根据所选择的工作模式,选择的速度模式和方向,控制电机进行相应的转动
键盘:
输入:clk:100KHZ
Col_scan[3..0]:键盘行扫描信号
输出:row_scan[3..0]:键盘列扫描信号
Key_output[3..0]:键盘输出值
Keydown:键盘有键按下
状态机:
输入:keyinput:键盘输出值(key_output)输入到状态机中
Clk:状态机工作时钟(系统最高时钟——2MHZ)
输出:state[3..0]:状态输出
Mode_display:窗帘工作模式输出
Fx:定时模式中的方向信号
Scene_disp1,2:场景模式A和B显示
时间模块:
输入:Clk1HZ:倒计时时钟
State[3..0]:状态机输出的状态值
Keyinput[3..0]:键盘的输出值
Keydown:键盘有键按下的信号
输出:Min_H[3..0],Min_L[3..0],Sec_H[3..0],Sec_L[3..0]分别是分钟的高位、低位和秒钟的高位和低位(后接四个4—8译码器后接至数码管显示)
Time_over:倒计时结束时产生的结束信号,计时模式下控制电机转动的使能信号
速度选择:
输入:state[3..0]:从状态机输出的状态值
Key_output[3..0]:从键盘输出的键值
输出:speed_set:显示速度正在设置,速度设置结束输出为0。
Speed_mode:按A键选择第一档速度,speed_mode为0,按B键选择第二档速度,speed_mode为1。将Speed_mode输入到g_fp中将输入的clkin分频成所选速度模式对应的clkout;
电机控制模块
输入:clk:这个模块的工作时钟,从前面的G_fp模块的clkout接过来,也就是说根据所选的速度模式所对应的时钟频率输入;
Fx:定时模式下的方向信号(按D键紧急退出时默认值为1);
Light:光感模块的输出信号,当有光时,输出低电平即light=’0’.当没有光时,输出高电平即light=’1’;
Timeover:时间模块的倒计时结束时产生的结束信号;
Keyinput:键盘的输出值keyoutput接过来;
State[3..0]:状态机的输出值接过来;
Stop:使窗帘紧急停止的手动信号,接到拨码开关;
n 模块接口标注(参数、协议)
EP1C6Q240C8实验箱的输入输出的实际连线与管脚表
引脚分配表:
6、状态流程图:
n 系统工作状态流程
0000
|
按下D键
|
0001
|
0010
|
按下F键
|
设置转速,按A或B键
|
0011
|
按下E键
|
按下’A’
|
按下’2’
|
按下’3’
|
按下’4’
|
0100
|
0110
|
|
1000
|
设置时间
|
按下E键
|
0101
|
开始倒计时
|
按’5’
|
按’6’
|
按’7’
|
上升
|
停止
|
下降
|
有光
|
无光
|
下降
|
上升
|
按A
|
按B
|
1001
|
1010
|
7、各主要模块仿真结果波形
n 各模块的仿真波形(输入输出端口在上面的具体模块那边已经详细的说明过,此处省略)
速度模式选择:
从波形图可以看到,在状态0010下,按下A键,speed_set为高电平,speed_mode为低电平;按下B键,speed_set为高电平,speed_mode为高电平。
分频模块:
输入为系统工作时钟,前面的速度模式选择模块的speed_mode输出
由仿真图可以清楚地看到,当speed_mode为高电平时,进行100分频;当speed_mode为低电平时,进行十分频。
电机控制模块:
在定时模式下(state=0101)
输入Fx为高电平,当timeover信号为高时,输出abcd_out在“1000”和“0010”之间循环,可以控制电机某个方向运动。这里面的clk输入为上面的分频模块分出来的时钟。
在手动模式下(state=0110)
键盘输入为“0101”时,输出abcd_out在“1000”和“0010”之间循环,键盘输入为“0110”时,输出abcd_out为“0000”,键盘输入为“0111”时,输出abcd_out为“0001”和“0100”之间循环
在光控模式下(state=0111)
当光感模块输出信号为高电平时(环境没有光),输出abcd_out在“1000”和“0010”之间循环;当光感模块输出信号为低电平时(环境有光),输出abcd_out为“0001”和“0100”之间循环
状态机:(仿真时没有完全把所有情况全部一一仿,在编写完状态机后,直接在FPGA上单独把状态机模块烧进去,单独调试,直至全部功能实现)
从仿真图可以清楚的看到,当键盘输入为(1101——D键)时,输出state[3..0]=”0001”,fx回复默认值高电平;输入“1111”,状态跳到“0010”,按下“1110”后,跳到“0011”,在状态“0011”下,分别按键A,键2,键3,键4选择窗帘模式,状态分辨跳到0100,0110,0111,1000。在状态0100下按下E键确认跳到状太0101,在状态1000下,按下A键或者B键选择场景模式,分别跳到状态1001和1010,按下C键确认后跳到状态0100,。(流程图将状态机的工作情况完全描述了出来)
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
① 原来打算用电脑屏幕或者用点阵板显示窗帘的具体工作状态,但是在具体编写调试过程中发现需要显示的工作状态的中间量比较多,用LED灯虽然简单,但是使窗帘的工作过程更清楚明了。
② 原来打算窗帘的速度可变,在设计过程中的确也进行了速度选择模块和总分频模块的设置,仿真也都OK,具体电路调试时,也都能够实现,可是在验收时,可能出于某些非人为原因出现了bug,导致速度可变功能没有实现。仿真正确,硬件也曾经很稳定的实现过,最后出了bug,真的觉得很遗憾。
n 可以进一步发挥提高的部分
①我觉得要具体运用到实际中的话,可能光控模式需要做一个真实的A/D转换,通过实际测定,设定最强的弱光和最弱的强光,并保证前者低于后者一定程度(容限,提高系统稳健性,防止出现光强临界处的误操作)
②显示其实可以做的更好一点,将微机课所学到的有关知识运用上来,将窗帘的状态实时显示在电脑屏上并通过计算机智能控制。
n 课程设计体会
开学伊始,就接到了数字系统课程设计的“噩耗”,开学时心情一度很急躁很担心。找灵感、立项、写项目申请书、通过答辩正式立项、上交具体方案设计……这些都是在纠结中一步步走过来的,当然这些都在第六周左右纠结结束。然后忙了两星期期中考试,以及上学期的大系统的语言验收,平时又忙理论课和模电实验。直到12周才正式开始编写程序。时间很紧,任务很重,觉得很迷茫。每天背着电脑,拖线板,书包的日子真的不好过。终于,在一个多星期的努力后,基本程序编完了,编译通过了。为此还高兴了很久!可是第二天下午再实验室八个小时调试状态机模块未果的现实让我又回到了现实,开始担心着急。接下来的一个礼拜(利用我开门的便利有了自己在实验室的固定据点)十三周周四周五的晚上,周六周日整整两天,完全泡在实验室,没有出去吃一顿饭!总算功夫不负有心人,每个模块的硬件调试都成功了(我是把每一个主要模块分别建立工程,烧进FPGA进行硬件调试的,可能这样比较繁琐,因为每一个模块要分配不同的引脚,观察不同的输入输出)。接下来的周一周二就是把所有的模块拼接起来,局部都正确不代表整合起来很容易成功,又一次把我打回了现实,内心又一次失望和着急!自己实在觉得没有错误,不知道该如何改进了,就去和同学讨论,讨论过后有了思路再修改终于对了。
回顾这次数字系统设计,真的觉得学到了很多。首先不敢说学会了VHDL语言,但是至少基本理解了VHDL语言的编程思想和程序结构,以后应该也可以看懂VHDL语言编写的代码。其次,心理上我也长大了很多。我一开始真的一直在怕,一直觉得自己不可能完成这样的任务,觉得不知道期末验收的时候该怎么过。但是其实在自己全身心投入,努力过,真的做出来一点东西后,哪怕在别人看来简单的不行,哪怕最后的实现形式没有预期的那么高端,但是我可以大声的说,这是我自己做出来的系统,每一个字符,每一串逻辑,每一个模块每一条连线每一次编译每一次改错都有我自己的努力和汗水,好久没有过这样子美好的感受了!这一次的系统设计让我明白了很多事情不是不可能,是我自以为不可能。还有我觉得当自己遇到超出自己理解范围的问题时主动地去和别人交流讨论是很有帮助的。总之,很感谢这一次课让我学到了很多!
9、参考文献
1、《VHDL编程实例》,(美) Douglas L. Perry著 杨承恩, 谭克俊, 颜德文译,电子工业出版社
2、《VHDL数字系统设计》,李欣, 张海燕编著,科学出版社
注:程序清单不要放在报告中,将最后能下载的正确的程序打包上传(程序中请写明注释)。