简易电磁炉控制器.docx
- 文档编号:10794001
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:54
- 大小:752.54KB
简易电磁炉控制器.docx
《简易电磁炉控制器.docx》由会员分享,可在线阅读,更多相关《简易电磁炉控制器.docx(54页珍藏版)》请在冰豆网上搜索。
简易电磁炉控制器
数字电路与逻辑设计综合实验
简易电磁炉控制器
学院:
信息与通信工程学院
学生姓名:
班级:
学号:
班内序号:
1、摘要(150左右)与关键字(5个以内)
摘要:
电磁炉的设计中包含11个模块:
模式调节,火力调节,时间模块,倒计时模块,关闭模块,点阵显示,数码管显示,分频器,防抖模块,蜂鸣器模块以及扩展模块的进度条模块,每个模块既可独立编写、仿真测试,又可在VHDL中将模块封装后,通过它们之间的控制关系进行连接,实现基本的电磁炉的功能。
关键字:
模式调节火力调节时间模块倒计时模块状态机
2、设计任务要求
题目一:
简易电磁炉控制器的设计与实现
设计制作一个简易电磁炉控制器。
基本要求:
1、烹饪模式选择:
电磁炉的烹饪模式有火锅、煎炒、爆炒、煲汤和蒸炖五档可选。
用
一个按键(BTN7)实现烹饪档位的选择(按下此键依上述顺序依次变化),用点阵
显示当前的烹调档位(火锅显示H、煎炒显示J、爆炒显示B、煲汤显示T和蒸炖
显示Z),烹调档位的选择按键同时也是加热的开始按键,即烹调档位选定的同时电
磁炉就以最大功率开始加热,没有选择时电磁炉处于停止状态,点阵不显示。
2、火力调节:
电磁炉的火力分5档可调:
1900W-1500W-1100W-600W-100W,用数码管DISP3-DISP0显示当前的火力,用两个按键(BTN6和BTN5)实现火力的增加
或减少,烹调过程中,除爆炒模式外,其它模式均可以随时可以调节火力,爆炒模
式只能以最高功率加热。
3、定时功能:
用一个按键(BTN4)实现定时设置,按下定时键,蜂鸣器响一声,每按一次定时键,定时时间以5-10-30-60秒钟的顺序依次递增,定时设定完毕后,电磁
炉开始倒计时。
用数码管DISP5和DISP4显示定时档位和倒计时的过程,倒计时时
间到后,电磁炉自动停止加热并关机。
4、不进行定时操作时,电磁炉以默认加热时间进行加热。
蒸炖模式的默认时间为20
秒钟;爆炒模式的默认时间是3秒钟,爆炒3秒钟后自动返回煎炒模式;其他模式
的默认时间为90秒。
5、用点亮的发光二极管LD4表示开机加热,熄灭表示关机。
6、设置关闭键,任何时候按下关闭键即可将电磁炉关机。
提高要求:
自拟其它功能。
3、设计思路、总体结构框图
设计思路:
首先确定该实验的功能,经过仔细分析后将该实验分为11个模块:
模式调节,火力调节,时间模块,倒计时模块,关闭模块,点阵显示,数码管显示,分频器,防抖模块,蜂鸣器模块以及扩展模块的进度条模块,各个模块的功能的实现方法以及之间的联系如下:
1.模式调节:
6个状态的状态机,其中5个为循环状态机C->H->J->B->T->Z->H,C状态为启动循环而不参与循环;当有时间模块传来的timecontrol信号,爆炒模式B反向转换为煎炒模式J。
2.火力调节:
5个状态的状态机,1900<->1500<->1100<->600<->100;当有模式调节传来的state[2..0]为爆炒模式B时,则状态机不起作用,输出只能为1900。
3.时间模块:
包含定时和不定时功能。
系统默认为不定时计时,不同模式系统默认时间不同;当接受有外部按键信号BTN4时,通过二选一数据选择更改为定时计时,且不能返回不定时计时,包含5个状态,其中4个为循环状态机s0->s5->s10->s30->s60->s5,C状态为启动循环而不参与循环。
两种计时方法均计时完毕发出close信号关机。
4.倒计时模块:
将时间模块传来的剩余时间显示在数码管上,需要时间模块传来的剩余时间lefttime信号。
5.关闭模块:
当接受有外部按键信号即模式调节按键BTN7,系统则由关闭状态转换为开机状态;当接受到时间模块发出的计数完毕信号close或者外部关闭按键BTN3,则close模块产生复位信号reset,关闭所有模块。
6.点阵显示:
将模式调节的5个字母H、J、B、T、Z进行显示,通过逐行扫描点阵显示字母。
7.数码管显示:
显示火力调节的功率以及倒计时的时间,通过逐个选通CAT0~CAT5来实现。
8.分频器:
将实验板的本振频率50MHz经过多级分频得到1kHz和100kHz。
9.防抖模块:
通过设计代码,将外部按键信号转换为一个标准的脉冲,此模块置于每个包含有外部按键的模块之前。
10.蜂鸣器模块:
当有外部按键BTN4时,即启动定时模块时,启动蜂鸣器,且蜂鸣的时间由一个计数统计上升沿的个数,达到一定个数(10个)蜂鸣结束。
11.进度条模块:
倒计时开始时将8个LED灯均点亮,通过时间模块的剩余时间lefttime计算LED灯点亮的个数。
当所有模块分析清楚后,逐个编写每个部分的代码,编译成功后并测试单个模块的仿真波形,逐个下到实验板进行测试;如果下载到实验板不能完成功能,修改思路,重新编写本块代码,重新调试;当所有模块均能实现功能后,通过设计中各个模块之间的
信号联系,将模块封装后进行连线,最终完成实验。
总体结构框图:
4、控制器部分的状态转移图和流程图
状态转移图:
1.模式调节
2.火力调节
3.时间模块
流程图:
5、分块电路和总体电路的设计(含关键源程序或电路图)
主要的分块电路:
1.时间模块:
包含不定时功能与定时功能
(1)系统默认的为不定时功能,即ordercontrol初始选择不定时norder模块;当有外部按键BTN4输入信号时,ordercontrol选择定时order模块,且改变只能一次,不能返回,直到计时结束关机;
(2)在选择功能时,如果有外部关闭按键BTN3的复位信号reset输入或者计时完毕时,则输出复位,且将ordercontrol重新初始化为norder状态;
(3)将输出的时间交付给倒计时模块count。
程序:
ordercontrol.vhd
architecturebehaveofordercontrolis
signalmask:
std_logic:
='0';
begin
process(clk1kHz)
begin
ifclk1kHz'eventandclk1kHz='1'then
ifreset='1'then
resetorder<='1';resetnorder<='0';
endif;
iforderinput='1'then
resetorder<='0';resetnorder<='1';
endif;
orderset<=orderinput;
endif;
endprocess;
endbehave;
2.倒计时模块:
显示倒计时且使用频率时钟1kHz,需要进行转换leftimetemp/1000=leftime,且将leftimetemp信号输出给进度条模块
(1)ordercontrol是用来判断时间模块的时间改变时,计数是否要重新开始;
(2)decount的功能是用来输出剩余时间,由于计时使用频率时钟1Hz会产生较大的延时,故采用频率时钟1kHz。
对时钟的下降沿计数timecount,用总的时间*1000减去计数值timecount,则得到倒计时剩余的脉冲数;如果想得到时间,则需要leftimetemp/1000转换成真正的剩余时间leftime;
(3)将剩余时间leftime输出给div模块,整除后输出给十位,取余后输出给个位。
(4)将剩余的脉冲数leftimetemp输出给进度条模块,由于进度条模块也采用频率时钟1kHz计时,且也需要倒计时,则可同时与倒计时模块共用leftimetemp。
(5)有一种特殊情况,当模式为爆炒模式B时,系统默认时间为3s,倒计时完毕后系统不关闭,而是转入煎炒模式J,继续倒计时90s后才能关闭。
程序:
decount.vhd
architecturebehaveofdecountis
begin
process(clk1kHz)
variabletimecount:
integerrange0to90000;
variabletimesetemp:
integerrange0to90;
variablemask:
std_logic:
='0';
begin
ifclk1kHz'eventandclk1kHz='0'then
ifmask='0'then
timesetemp:
=timeset;mask:
='1';timecount:
=0;
endif;
timecontrol<='0';
timecount:
=timecount+1;
leftimetemp<=timesetemp*1000-timecount;
leftime<=timesetemp-timecount/1000;
ifreset='1'then
mask:
='0';
timecount:
=0;
leftime<=timeset;
leftimetemp<=timeset*1000;
timesetemp:
=timeset;
endif;
iftimecount>=timesetemp*1000then
iftimesetemp=3then
close<='0';
timecontrol<='1';
else
close<='1';
endif;
else
close<='0';
endif;
iftimesetemp=0then
close<='0';
leftime<=0;leftimetemp<=0;
endif;
endif;
endprocess;
endbehave;
3.数码管显示模块:
循环选通6个数码管进行扫频,通过驱动数码管的7个段进行显示
(1)count6是产生循环的6个数,来循环选通6个数码管,当扫频频率足够大的时候,则由于人眼的视觉暂留,观察到的数字为同时显示;
(2)L24xuan4c是每次选出一组数进行译码,即每次只能显示一个数字;
(3)dec7s为7段数码管驱动电路,将译码的结果驱动7个段,显示出一个数字。
4.进度条模块:
进度条是将总体时间分为8份,每倒计时消耗一个step则熄灭一个灯。
(1)选用时钟频率1kHz,因为1Hz计时3s无法平均分成8份;
(2)使用来自倒计时模块的leftimetemp,leftimetemp/8为真正的时间,随时获得剩余时间进行显示。
程序:
process(clk1kHz)
variablecountdiv:
integerrange0to90000;
variablek:
integerrange0to90000;
begin
if(reset='1')then
k:
=0;
temp<=leftimetemp;
if(clk1kHz'eventandclk1kHz='1')then
k:
=k+1;
countdiv:
=leftimetemp/8;
IFcountdiv/=0THEN
IFk>8*countdivork=8*countdivTHEN
light<="00000000";
ELSIF(k>7*countdivANDk<8*countdiv)ORk=7*countdivTHEN
light<="00000001";
ELSIF(k>6*countdivANDk<7*countdiv)ORk=6*countdivTHEN
light<="00000011";
ELSIF(k>5*countdivANDk<6*countdiv)ORk=5*countdivTHEN
light<="00000111";
ELSIF(k>4*countdivANDk<5*countdiv)ORk=4*countdivTHEN
light<="00001111";
ELSIF(k>3*countdivANDk<4*countdiv)ORk=3*countdivTHEN
light<="00011111";
ELSIF(k>2*countdivANDk<3*countdiv)ORk=2*countdivTHEN
light<="00111111";
ELSIF(k>countdivANDk<2*countdiv)ORk=countdivTHEN
light<="01111111";
ELSIF(k>0ANDk light<="11111111"; ENDIF; ELSE light<="00000000"; ENDIF; ENDIF; endif; endprocess; 总体电路: 通过各模块之间的联系,将封装好后的模块上端口均连接上,实现模块的组装 6、所实现功能说明(已完成的基本功能和扩展功能,器件的资源占用情况,关键波形仿真图,必要的测试方法等); 基本功能与扩展功能: 1.基本功能: 已完成题目所给的所有实验要求,能实现烹饪模式的选择、火力调节、定时功能、不定时功能、蜂鸣器、关闭键以及所有的特殊情况 2.扩展功能: 完成了进度条的设计,即倒计时点亮8个LED灯,随着时间的减少,8个灯均匀熄灭,倒计时结束同时关闭所有的LED灯。 器件资源占用情况: 1.由于在倒计时模块使用时钟频率1kHz,使得定义计数时钟的上升沿的变量为variabletimecount: integerrange0to90000,且多次使用该变量导致逻辑单元logicelements占用的比重为80%; 2.由于电磁炉的实验功能比较多且琐碎,故采用“从上而下”的设计思路,于是模块使用比较多且每个模块功能比较少,便于调试;但也使pins的总量占用了38%。 关键波形仿真图: 1.模式调节模块: 说明: 当有外部按键信号modecontrol输入,状态机的循环为0->1->2->3->4->5->1->2...;当有时间模块传来的信号timecontrol,使爆炒模式B(仿真波形中的3)模式反向转换为煎炒模式J(仿真波形中的2);当输入关闭信号reset信号时,状态信号state复位为close状态(仿真波形中的0)。 2.火力调节模块: 说明: 循环状态机的循环模式为1900<->1500<->1100<->600<->100;当外部按键输入up信号,由于初始状态为1900w,故输出不会增加,维持在1900w;当外部按键输入down信号,会变为1500w;依次类推,up信号控制增加,down信号控制减少,本质是控制循环状态机转移的方向。 3.倒计时模块: 说明: 设置输入的倒计时时间为16s,倒计时完毕后输出关闭信号close为“1”,即系统关闭;当输入reset开启信号后,时间置位为最初的倒计时时间,开始进行倒计时。 4.数码管模块: 说明: 当输入6个数给6个数码管显示器,经过译码后,输出为7段数码管驱动的组合码。 5.点阵模块: 说明: 经过行、列的扫描,实现一个周期的显示码字;当co为1时,完成了一个周期,继续扫描下一周期。 6.关闭模块: 说明: 当openinput信号输入时,整个程序开启;当任何一个关闭信号(closeinput1或closeinput2)输入时,则关闭整个系统;当再次输入openinput信号时,程序会被再次重新开启。 7.蜂鸣器模块: 说明: 当定时信号order输入时,则output计时10个脉冲,即蜂鸣器发出响声的时间10ms;再次输出定时信号order,蜂鸣器会再次计数、发出响声;在此过程中,只要有reset输入,就将所有的值复位。 必要的测试方法: 1.分模块编写,编译,通过后进行下一步骤; 2.仿真,观察仿真波形的正确性,正确后进行下一步骤; 3.下载到实验板进行调试,检验是否完成了设计的功能,如果需要其他模块的信号,则通过其他实验板上的按键替代。 7、故障及问题分析 1.时钟选择导致延时问题: 在最初设计时选择时钟频率1kHz,100Hz,1Hz,系统的各个模块使用时钟频率1kHz,防抖模块使用时钟频率100Hz,倒计时模块则使用时钟频率1Hz;在设计倒计时模块时,由于时钟频率为1Hz时倒计时正好以1s为单位,满足实际需求。 然后设计好代码后会得到下面的仿真波形(由于仿真时使用1Hz会使仿真时间很久,故仿真时选用了1kHz,不影响观测结果),在开始两个时间周期内倒计时还没有开始,所以这种设计方案会有延时缺陷;在通过思考之后,决定采用时钟频率1kHz取代时钟频率1Hz,使得时钟沿分的更细一些,整个系统更加灵敏,产生的延时很小,人眼几乎察觉不出来。 正确的代码原理以及仿真波形已在第五模块、第六模块已阐述,这里不再赘述。 具有延时的仿真波形: 具有延时的倒计时代码: architecturebehaveofdecountis begin process(clk1Hz) variabletimecount: integerrange0to90; variabletimesetemp: integerrange0to90; begin ifclk1Hz'eventandclk1Hz='0'then timecontrol<='0'; timecount: =timecount+1; leftime<=timesetemp-timecount; ifreset='1'then timecount: =0; timesetemp: =timeset; leftime<=timesetemp; endif; iftimecount>=timesetempthen iftimesetemp=3then close<='0'; timecontrol<='1'; else close<='1'; endif; else close<='0'; endif; iftimesetemp=0then close<='0'; leftime<=0; endif; endif; endprocess; endbehave; 2.扩展功能进度条的设计问题: 最开始的设计思路是将倒计时的时间平均分成8份,每计时完一个step后熄灭一个灯;然而比较棘手的问题是在本次实验中使用的倒计时时间含3s,无法进行分时。 综合这一问题倒计时中的问题,故同时也时钟频率1kHz,即将3*1000个时钟沿,这样就可以平均分成8份,且计时精准。 正确代码已在第五模块写出,这里不再赘述。 3.资源占用溢出问题: 在倒计时模块和进度条模块修正了时钟频率1kHz后,使用的变量所占用的逻辑单元约为原来的10倍( ),故整体编译逻辑单元logicelements溢出,由于两个模块之间的联系很密切,故让两个模块共享leftime和leftimetmp等变量,减少资源的占用。 8、总结和结论 为期4周的实验结束了,在这个过程中收获了很多,学会了团队合作、VHDL、缜密的设计思路等,付出了很多,经验受益终身。 最开始选题的时候,组员们都希望做一些比较有挑战性、有意思的题目,大家一致选择了第一个题目电磁炉的设计。 在最开始设计的时候,花了近3个小时构思整体的结构框图,研究题目所表达的意思以及现实使用的会有的不同情况,设计的时候使用模块划分,最后的成果也是清晰地模块的功能划分,每个模块需要的输入信号和输出信号在模块设计上标注,连接总图的时候思路就非常清晰,故主要的任务就是设计调试好每个模块的功能。 设计好整体框图后,开始写各个部分的代码。 分频器,防抖,状态机,数码管,点阵编写的比较顺利,参考的书籍比较多;主要的倒计时模块比较繁琐,开始时将每一个倒计时时间分别单自写一个工程,整理代码的时候觉得代码利用率很低,资源占用比较大,最后改进了倒计时模块,主要是将所有的倒计时重复利用一块代码。 遇到的问题也是多种多样的,有些是自己的马虎和一些可以通过仔细思考后修正的逻辑错误,有些问题自己是在没有办法解决就寻求队友的帮助,这里特别感谢我们队的同学,帮助了我解决了很多细致入微的问题。 仿真通过后,我和队友在第二周周六一起去实验室调试了整整一天,我的代码有些小问题没考虑到,例如reset复位的延时问题等,在实验过程中交流互相出现的问题,然后共同商量解决,终于在马上关门的时候完成了代码调试,终于松了一口气。 由于实验做的比较快,在第三周就进行了验收,老师非常耐心和我们交流完成情况和出现的问题,对我们有着激励的心情。 总体的实验功能感觉已经能达到现实生活中电磁炉的大部分基本功能,很有成就感。 本次实验让我知道实验的设计部分很重要,这对我审视其他编程软件如C++等有了新的认识,收获颇丰。 9、所用元器件及测试仪表清单 管脚设定: 元器件: 8*8LED点阵1个 LED数码管6个 BTN按键5个 LED灯8个 蜂鸣器1个 测试仪表: quartus2软件和实验板 10、完整源程序(要有注释) (1)模式调节 mode.vhd libraryieee; useieee.std_logic_1164.all; USEIEEE.STD_LOGIC_UNSIGNED.ALL; entitymodeis port(clk: Instd_logic; modecontrol: INstd_logic; timecontrol: INstd_logic;--从时间模块传来的模式控制信号,从爆炒模式转为煎炒模式 reset: INstd_logic; state: outstd_logic_vector(2downto0));--输出状态信息给不定时模块和火力调节模块 endmode; architecturebehaveofmodeis typestate_typeis(C,H,J,B,T,Z); signalpresent_state: state_type; signalnext_state: state_type; begin begin casepresent_stateis whenC=>ifmodecontrol='1'then next_state<=H; else next_state<=C; ifreset='1'then next_state<=C; endif; endif; whenH=>ifmodecontrol='1'then next_state<=J; else n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 电磁炉 控制器