数电实验 洗衣机.docx
- 文档编号:8627431
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:191.59KB
数电实验 洗衣机.docx
《数电实验 洗衣机.docx》由会员分享,可在线阅读,更多相关《数电实验 洗衣机.docx(14页珍藏版)》请在冰豆网上搜索。
数电实验洗衣机
数电实验报告
——简易全自动洗衣机控制器
03111班09号
迟帅
简易全自动洗衣机控制器实验报告
摘要:
我们制作的系统可以模拟全自动洗衣机控制器。
分为4个按键,分别为模式选择、暂停、开始和复位。
有五个指示灯来显示当前工作模式,分别为单洗涤、单漂洗、单脱水、漂洗和脱水以及洗涤漂洗脱水。
有三个指示灯显示当前工作状态,红灯是正在工作中,黄灯是暂停中,绿灯是停止中。
通过数码管显示当前操作的剩余时间,当操作完成时蜂鸣器会报警提示完成。
通过两个指示灯显示剩余操作数。
Abstract:
Wemadeasystemthatcontrolwashingmachine.Ithas4buttons:
modechoosing,pause,start,reset.Weuse5greenlightstoshowworkingmodeandithas5modes.Ithasoneredlighttoshowitisworking,oneyellowlighttoshowitispausingandonegreenlighttoshowitisstopping.Thesystemcanshowleaving-timeandgiveanalarmwhenithasfinished.Itshowshowmanyactsleftbytwolight.
设计任务要求:
制作一个简易全自动洗衣机控制器:
1、洗衣机的动作有洗涤、漂洗和脱水,每个动作持续的时间分别为20秒、15秒和10秒;
2、用一个按键实现洗衣程序的手动选择:
A、单洗涤B、单漂洗C、单脱水D、漂洗和脱水E、洗涤、漂洗和脱水全过程
3、无论选择何种洗衣服的程序,在所选择的程序完成之后,控制器应处于暂停状态;
4、用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前的状态;
5、用发光二极管指示当前状态;
6、用数码管以倒计时的方式显示当前状态的剩余时间。
设计过程:
总体思路:
通过模式选择、暂停、开始、复位四个按键来控制该系统。
但按键只是产生脉冲,所以先需要将脉冲转化为控制用的高低电平。
用转换完的控制信号来控制工作模式灯、工作状态灯、数码管选择信号和数码管控制初值部分。
数码管控制初值部分送给数码转换部分状态初值,数码转换部分送出当工作完成时的标志信号和数码管显示信号,数码管显示信号通过译码部分送给数码管数据端口。
总体框图:
状态转移:
脉冲转换:
mode共有六个状态,当来了复位信号的时候mode变为“000”。
当来了一个模式选择脉冲的时候mode加一,当mode加到大于“101”的时候mode归“000”。
而start和pause在收到复位信号的时候归0,当来一个相应的脉冲时取反。
数码管数据转换:
shumagao和shumadi各自有十种状态。
根据mode的输入来判定shumagao和shumadi的初始值,再用1S的时间信号作触发来把shumadi减1,shumadi为0时把shumagao减1,然后把shumadi变为“1001”。
当shumagao和shumadi都为0时输出结束标志信号。
Shumadi:
Shumagao:
电路块说明:
键盘扫描:
用20ms的时钟作触发,用了防抖功能,在对应按键按下时产生一个相应的一个时钟信号宽度的脉冲。
process(clk20ms)
begin
if(clk20ms'eventandclk20ms='0')then
setmodemp2<=setmodemp1;
setmodemp1<=setmode;
setpausemp2<=setpausemp1;
setpausemp1<=setpause;
setstartmp2<=setstartmp1;
setstartmp1<=setstart;
setresetmp2<=setresetmp1;
setresetmp1<=setreset;
endif;
endprocess;
outmodekey<=clk20msandsetmodemp1and(notsetmodemp2);
outpausekey<=clk20msandsetpausemp1and(notsetpausemp2);
outstartkey<=clk20msandsetstartmp1and(notsetstartmp2);
outresetkey<=clk20msandsetresetmp1and(notsetresetmp2);
脉冲转换:
通过对四个按键脉冲的判断转化为控制信号。
如模式控制信号就是来一个脉冲就加一。
而开始控制和暂停控制则是来一个脉冲就取反。
而来一个复位信号就都复位。
开始我想用各个上升沿作触发,但这样信号在不同进程中就不能重复负值,不能达到复位的效果。
process(inmodekey,inresetkey)
begin
if(inresetkey='1')then
mode<="000";
else
if(inmodekey'eventandinmodekey='1')then
if(mode="101"ormode>"101")then
mode<="000";
else
mode<=mode+1;
endif;
endif;
endif;
endprocess;
process(inpausekey,inresetkey)
begin
if(inresetkey='1')then
pause<='0';
else
if(inpausekey'eventandinpausekey='1')then
pause<=notpause;
endif;
endif;
endprocess;
process(instartkey,inresetkey)
begin
if(inresetkey='1')then
start<='0';
else
if(instartkey'eventandinstartkey='1')then
start<=notstart;
endif;
endif;
endprocess;
产生模式初始值:
用这个给下一个数码转换模块附初始值。
process
begin
caseinmodeis
when"000"=>outshumagaochushi<="1001";outshumadichushi<="1001";outzhuangtai<="00";
when"001"=>outshumagaochushi<="0010";outshumadichushi<="0000";outzhuangtai<="00";
when"010"=>outshumagaochushi<="0001";outshumadichushi<="0101";outzhuangtai<="00";
when"011"=>outshumagaochushi<="0001";outshumadichushi<="0000";outzhuangtai<="00";
when"100"=>outshumagaochushi<="0001";outshumadichushi<="0101";outzhuangtai<="01";
when"101"=>outshumagaochushi<="0010";outshumadichushi<="0000";outzhuangtai<="10";
whenothers=>outshumagaochushi<="1001";outshumadichushi<="1001";
endcase;
endprocess;
灯控制:
通过输入的控制信号来控制灯的亮灭。
只是一个判断负值的过程。
判断模式控制信号的值来控制模式灯怎样亮。
判断开始和暂停的控制信号来控制工作状态灯的亮法。
process
begin
caseinmodeis
when"000"=>modelight<="00000";
when"001"=>modelight<="00001";
when"010"=>modelight<="00010";
when"011"=>modelight<="00100";
when"100"=>modelight<="01000";
when"101"=>modelight<="10000";
whenothers=>modelight<="00000";
endcase;
if(instart='1'andinpause='0')then
worklight<="100";
elsif(instart='1'andinpause='1')then
worklight<="010";
else
worklight<="001";
endif;
endprocess;
数码管扫描:
这部分就是用一个10ms的时钟作触发,判断开始和暂停控制信号的状态来使两个输出端口不断分别变换高低电平。
process(clk20ms)
begin
if(clk20ms'eventandclk20ms='1')then
if(instart='1')then
if(sell2="00"orsell2>"01")then
sell2<="01";
else
sell2<="10";
endif;
else
sell2<="00";
endif;
endif;
endprocess;
数码管数据变换:
之前用了一小块产生一个10ms宽的开始脉冲,因为涉及到复初始值的问题,觉得有这么一个脉冲比较好。
把模式控制信号的值设为初始值,通过判断开始和暂停控制信号的状态来使数码管显示的时间递减,低位减到0的时候判断高位是否为0,不为0就把高位减1,低位付9,否则判断剩余操作,若已经都操作完了就输出停止标志信号。
通过sell信号把数码管的高位和低位的数值合成一个信号作为输出。
输出一个信号控制剩余操作灯。
process(clk1s,instart10ms)
begin
if(instart10ms='1')then
shumagao<=inshumagaochushi;
shumadi<=inshumadichushi;
zhuangtai<=inzhuangtai;
else
if(clk1s'eventandclk1s='1')then
if(instart='1'andinpause='0')then
if(shumadi>"0000")then
shumadi<=shumadi-1;
finish<='0';
else
if(shumagao>"0000")then
shumagao<=shumagao-1;
shumadi<="1001";
finish<='0';
else
casezhuangtaiis
when"10"=>zhuangtai<=zhuangtai-1;shumagao<="0001";shumadi<="0101";finish<='0';
when"01"=>zhuangtai<=zhuangtai-1;shumagao<="0001";shumadi<="0000";finish<='0';
whenothers=>finish<='1';
endcase;
endif;
endif;
else
finish<='0';
endif;
endif;
endif;
endprocess;
outshuma(3)<=(insell(0)andshumagao(3))or(insell
(1)andshumadi(3));
outshuma
(2)<=(insell(0)andshumagao
(2))or(insell
(1)andshumadi
(2));
outshuma
(1)<=(insell(0)andshumagao
(1))or(insell
(1)andshumadi
(1));
outshuma(0)<=(insell(0)andshumagao(0))or(insell
(1)andshumadi(0));
outshengyu<=zhuangtai;
译码部分:
把数码数据控制部分发来的信号作一个译码,形成数码管显示的相应的7位二进制数送给数码管的数据端口
process
begin
caseinshumais
when"0000"=>outshumashuju<="0111111";
when"0001"=>outshumashuju<="0000110";
when"0010"=>outshumashuju<="1011011";
when"0011"=>outshumashuju<="1001111";
when"0100"=>outshumashuju<="1100110";
when"0101"=>outshumashuju<="1101101";
when"0110"=>outshumashuju<="1111101";
when"0111"=>outshumashuju<="0000111";
when"1000"=>outshumashuju<="1111111";
when"1001"=>outshumashuju<="1101111";
whenothers=>outshumashuju<="0000000";
endcase;
endprocess;
分频部分:
就是计数器,根据所需要的时间做相应的计数。
总电路:
功能实现:
我做的自动洗衣机控制器实现了要求的所有功能,通过一个键来进行模式选择,通过一个键作确认,通过一个键作暂停,暂停后继续暂停前的状态,还有一个复位键,恢复到初始状态。
防止电流过大数码管用扫描的方式显示,并且是倒计时的方式显示。
我添加了蜂鸣器来作动作完成时的报警。
经过我手动自己优化,资源占用了68%。
未经过优化之前占到了80%多,我重新看程序把不合理的地方都改进了,最后占68%。
又用自带的自动优化优化发现资源占用没有任何变化。
最后就是68%。
仿真图:
相关测试:
用万用表测直流稳压电源输出是否为7.5伏。
用示波器测分得的频率是否为我要的频率。
用万用表监测电流是否过大。
实际电路:
故障及问题分析:
初值问题:
开始我想在单个进程中做,但发现行不通。
因为如果不给一个专门做初始化标志用的信号,就不能达到目的。
而多个进程中又不能对同一个信号附值,单个进程中又只能有一个时钟沿起作用。
最后我是做了一个很短的初始化标志脉冲,然后输入相应的模块,当这个信号为1的时候执行初始化操作。
时钟沿延时问题:
开始我没有考虑信号的延时问题,所以从理论上编完了程序。
但仿真的时候发现由于短时间的延时根本达不到目的。
我于是用短时钟判断长信号,仿真了一下。
成功了!
我以为完成了,可后来当我作稍微长一点的仿真的时候发现BUG出现了:
中间有时按键不管作用。
我意识到是时钟信号的问题。
最后我想办法尽量少用时钟信号,除了分频,只在需要“延时”的地方用时钟信号。
最后我的BUG问题解决了。
扫描频率:
我的数码管开始工作的时候闪的特别厉害,因为我用了50Hz的频率控制数码管的扫描。
一看到这个问题,我立刻意识到是扫描频率的问题,我把频率提高到100Hz以上,闪的问题就消失了。
硬件问题:
下载完成之后我连好电路,发现有两个问题:
一个是数码管对应的e管一直不亮,另一个是9直接到7,7直接到5。
我反复检查我的程序,感觉没有问题。
我后来意识到8少了e管就是9,6少了e管是5。
我的问题就是e管不亮。
我用导线把高电平引到e管对应的管口,e管不亮。
引到e管的管脚,亮了!
我立刻意识到数码板的e管口有问题。
我找同学借了数码板,重新连接电路。
工作正常了!
喇叭问题:
我开始做的程序在按开始键开始执行程序的时候,喇叭总会先响一下。
我看程序是由于我的程序问题,我的主要部分的时钟信号是1S的,但按键扫描是20ms。
而我是拿开始键按下做为后面部分的工作开始标志,所以喇叭会BUG似的先响一下,因为我的喇叭开始是写在倒计时的主要部分里。
我发现这个问题后我为喇叭单独作了一个控制模块,抛弃了时钟信号,用开始信号,暂停信号和完成标志信号来控制喇叭。
再看仿真和实际电路检查,原来的BUG没有了。
实验总结:
刚开始上实验课的时候听到这几个题目,感觉应该不难,因为我们小学期做的是单片机的实验,跟这个有一点点相通之处。
之后看完几个题目之后决定做洗衣机控制,我开始还想做上液晶显示功能,因为对液晶的显示原理已经清楚。
在器件还没有发现来之前我就早已经开始了程序的编写。
但发器件的时候没有给我液晶,我之前编的液晶模块也就只能算练习了。
我编写程序的时候的想法是能模块化就模块化,一个模块就做一件事,多不要紧,因为这样感觉起来条理清楚一些,出现问题时也好查找。
当我编程的时候发现经过一个假期VHDL的很多东西都忘了,而且VHDL的程序要求比汇编和C以及JAVA要求要多,比这些语言严禁,所以人理性上认为可以的东西很多时候都不能通过编译。
我编写的时候经常出现不同进程对同一个信号附值的错误,一个进程用两个时钟沿的错误等等。
后来经过这几天的自学,对VHDL也有了一定真正的了解。
我开始下载到电路的时候真是问题百出,为什么呢?
我仿真没有问题啊!
可能是我仿真的时候用短时间代替长时间仿真有很多问题都看不出来。
一开始,我的数码管虽然亮但根本没有工作。
后来发现是数码管模块的模式初始化根本没达到目的,根本没有起作用。
因为我没有考虑到时钟延时的问题。
我又单独做了一个控制初始化的模块抛弃了时钟才解决了问题。
还有喇叭的问题、闪烁的问题和硬件的问题上面已经说过了。
在布置管脚的时候,我开始是把7128的内部管脚设整齐了,再按照我设置的连接电路,发现还是很乱。
我意识到不应该这样设置管脚,我第二次是先把电路查整齐了,再按照电路设置管脚,然后再把与7128的连线拔出,下载,再插好电路,这回电路整齐了。
看着自己手中的劳动成果心中喜悦万分,在实验室自己还反复摆弄劳动成果,呵呵。
通过这次实验让我进一步了解了硬件制作,让我对VHDL有了进一步的掌握,再一次磨练了我的研究精神。
研究就得耐得住性子,就得安下心来!
所用元器件及仪表:
数码管:
2
发光二极管:
10电阻(300):
10
按键:
4电阻(2K):
4
蜂鸣器:
1
导线:
若干
直流稳压电源
万用表
示波器
源程序
参考文献:
《数字逻辑设计实验技术与EDA工具》————北京邮电大学
迟帅
03111班09号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数电实验 洗衣机 实验