FPGA技术实现四层电梯控制器.docx
《FPGA技术实现四层电梯控制器.docx》由会员分享,可在线阅读,更多相关《FPGA技术实现四层电梯控制器.docx(16页珍藏版)》请在冰豆网上搜索。
![FPGA技术实现四层电梯控制器.docx](https://file1.bdocx.com/fileroot1/2023-2/7/9688c0cc-08b2-407c-b7bf-eb8c3f9024ca/9688c0cc-08b2-407c-b7bf-eb8c3f9024ca1.gif)
FPGA技术实现四层电梯控制器
电梯控制器
一、设计需求说明与功能
1.设计需求说明
电梯作为高层建筑物的重要交通工具与人们的工作和生活日益紧密联系。
FPGA/CPLD作为新一代工业控制器,以其高可靠性和技术先进性,在电梯控制中得到广泛应用,从而使电梯由传统的继电器控制方式发展为计算机控制的一个重要方向,成为当前电梯控制和技术改造的热点之一。
FPGA/CPLD是一种专门从事逻辑控制的微型计算机系统。
由于FPGA/CPLD具有性能稳定、抗干扰能力强、设计配置灵活等特点。
因此在工业控制方面得到了广泛应用。
自90年代后期FPGA/CPLD引入我国电梯行业以来,由FPGA/CPLD组成的电梯控制系统被许多电梯制造厂家普遍采用。
利用VHDL语言完成一个4层自动升降的电梯的控制电路,控制电路遵循方向优先原则控制电梯完成多层楼的载客服务,同时指示电梯运行情况和电梯内外请求信息。
电梯控制系统分为调速部分和逻辑控制部分。
调速部分的性能对电梯运行是乘客的舒适感有着重要影响,而逻辑控制部分则是电梯安全可靠运行的关键。
为了改善电梯的舒适感和运行的可靠性,现在都改为用FPGA/CPLD来控制电梯的运行,这样大大提高了电梯的性能。
2.设计设备
使用的软件平台:
WindowsXP+
二、方案设计及实现
1.电梯控制器的任务和要求
利用VHDL语言完成一个多层自动升降的电梯的控制电路,控制电路遵循方向优先原则控制电梯完成多层楼的载客服务,同时指示电梯运行情况和电梯内外请求信息。
(1)设计一个4层电梯全自动控制电路。
(2)电梯运行锁用一按钮代替(开锁上电),低电平可以运行,高电平不能运行。
(3)每层电梯入口处设有上行、下行请求按钮,电梯内设有乘客到达层次的停站要求开关,高电平有效。
(4)有电梯所处楼层指示灯和电梯上行、下行状态指示灯。
(5)电梯到达某一层时,该层指示灯亮,并一直保持到电梯到达另一层为止。
电梯上行或下行时,相应状态指示灯亮。
(6)电梯接收到停站请求后,每层运行2秒,到达停站层,停留2秒后门自动打开,开门指示灯亮,开门6秒后电梯自动关门。
(7)能记忆电梯内、外的请求信号,并按照电梯的运行规则依次响应,请求信号保留至响应后撤除。
(8)人数超载或超重用一按钮代替,高电平有效,超载时电梯不能运行,并有相应指示。
(9)事故报警按钮高电平有效,事故报警不能运行,并有指示灯,信号保留至事故消除。
(10)增加手动开门、关门控制,并可调整开、关门时间。
2.原理图
3.流程图
4.电梯控制器结构图
5.程序描述
--File:
control.vhd
--Designer:
WuHailin
--Module:
control
--Description:
--Date:
2011/05/1
--Modifydate:
2011/05/4
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcontrlIS
port(clk1,lock,alarm,overweight,It1,It2,It3,It4,up1,up2,up3,down2,down3,down4:
in
std_logic;----lock为电梯锁开关alarm为警报器开关overweight为超重开关It1、It2、It3、It4分别表示电梯停在一二三四楼up1表示一楼有向上请求Up2表示二楼有向上请求up3表示三楼有向上请求down2表示二楼有向下的请求
----down3表示三楼有向下请求down4表示四楼有向下请求
quick,delay,dengwo:
instd_logic;----分别表示快速关门延长一段时间关门不马上关门
led1,led2,led3,led4:
outstd_logic;----一二三四楼层的指示灯
alarmled,overweightled,upled,downled,dooropenled:
outstd_logic);----报警灯超重灯上行状态灯下降状态灯开门灯
endcontrl;
architecturexinofcontrlis
typestate_typeis(start,rukou,up,down,dooropen,stop,wait1,wait2,wait3,wait4,wait5,wait6,wait7,wait8,wait9,upwait1,upwait2,dnwait1,dnwait2);
------start表示初始化状态rukou表示程序执行状态up上行状态down下降状态dooropen开门状态stop停止运行状态
------后面几个状态用来延时
signalstate:
state_type:
=start;
signalstopcun:
std_logic_vector(3downto0);
-----电梯停止楼层存储器
signalupcun,downcun:
std_logic_vector(2downto0);
-----上升请求存储器下降请求存储器
signaldd1,dd2,dd3:
std_logic_vector(3downto0);
-----信号用来交换数据
begin
p1:
process(clk1,lock,alarm,overweight)
variableposition:
integerrange0to4;
begin
iflock='1'thenled1<='0';led2<='0';led3<='0';led4<='0';alarmled<='0';
overweightled<='0';dooropenled<='0';upled<='0';downled<='0';
----电梯上锁
elsifalarm='1'thenalarmled<='1';
-----警报灯亮
elsifoverweight='1'thenoverweightled<='1';
-----超重灯亮
elsifrising_edge(clk1)then
ifup1='1'thenupcun(0)<='1';endif;
ifup2='1'thenupcun
(1)<='1';endif;
ifup3='1'thenupcun
(2)<='1';endif;
ifdown4='1'thendowncun
(2)<='1';endif;
ifdown3='1'thendowncun
(1)<='1';endif;
ifdown2='1'thendowncun(0)<='1';endif;
ifIt1='1'thenstopcun(0)<='1';endif;
ifIt2='1'thenstopcun
(1)<='1';endif;
ifIt3='1'thenstopcun
(2)<='1';endif;
ifIt4='1'thenstopcun(3)<='1';endif;--将各种请求存入存储器
dd1<='0'&upcun;--将上升请求存储器扩展成四位
dd2<=downcun&'0';---将下降请求扩展成四位
dd3<=dd1ordd2orstopcun;
casestateis
whenstart=>
ifdd3="0000"thenstate<=start;
elsifposition=0thenled1<='1';position:
=position+1;state<=rukou;
endif;
-----电梯开始运行,一楼灯亮,如果没有请求,电梯状态不变
whenrukou=>
ifposition=1thenifstopcun(0)='1'orupcun(0)='1'thenstopcun(0)<='0';upcun(0)<='0';state<=dooropen;
elsestate<=up;
endif;
-----电梯在一楼,如果当前层有请求,进入开门状态,同时清除请求,否则电梯上升
elsifposition=2thenifstopcun
(1)='1'orupcun
(1)='1'ordowncun(0)='1'thenstopcun
(1)<='0';upcun
(1)<='0';downcun(0)<='0';state<=dooropen;
elsifdd3>"0011"thenstate<=up;
elsifdd3<"0010"thenstate<=down;
endif;
-----电梯在二楼,如果当前层有请求,进入开门状态,同时将请求清除,如果三四楼有请求,电梯上升,否则下降
elsifposition=3thenifstopcun
(2)='1'orupcun
(2)='1'ordowncun
(1)='1'thenstopcun
(2)<='0';upcun
(2)<='0';downcun
(1)<='0';state<=dooropen;
elsifdd3>"0111"thenstate<=up;
elsifdd3<"0100"thenstate<=down;
endif;
-----电梯在三楼,如果当前层有请求,进入开门状态,同时将请求清除,如果四楼有请求,电梯上升,否则下降
elsifposition=4thenifstopcun(3)='1'ordowncun
(2)='1'thenstopcun(3)<='0';downcun
(2)<='0';state<=dooropen;
elsestate<=down;
endif;
endif;
-----电梯在四楼,如果当前层有请求,进入开门状态,同时将请求清除,否则下降
whenup=>upled<='1';state<=upwait1;
-----上升状态,上行状态灯亮
whenupwait1=>state<=upwait2;
-----运行持续两秒
whenupwait2=>upled<='0';position:
=position+1;
-----到达新的楼层,上行指示灯灭
ifposition=1thenled1<='1';led2<='0';led3<='0';led4<='0';
-----一楼指示灯亮
elsifposition=2thenled2<='1';led1<='0';led3<='0';led4<='0';
-----二楼指示灯亮
elsifposition=3thenled3<='1';led2<='0';led1<='0';led4<='0';
-----三楼指示灯亮
elsifposition=4thenled4<='1';led1<='0';led2<='0';led3<='0';
-----四楼指示灯亮
elseled1<='0';led2<='0';led3<='0';led4<='0';
endif;
ifposition=2anddd3>"0011"andstopcun
(1)='0'andupcun
(1)='0'anddowncun(0)='0'thenstate<=up;
-----如果在二楼且当前层没有请求,电梯继续上升
elsifposition=3anddd3>"0111"andstopcun
(2)='0'andupcun
(2)='0'anddowncun
(1)='0'thenstate<=up;
-----如果在三楼且当前层没有请求,电梯继续上升
elsestate<=dooropen;ifposition=4thenifdowncun
(2)='1'thendowncun
(2)<='0';endif;
ifstopcun(3)='1'thenstopcun(3)<='0';endif;
elsifposition=3thenifdowncun
(1)='1'thendowncun
(1)<='0';endif;
ifupcun
(2)='1'thenupcun
(2)<='0';endif;
ifstopcun
(2)='1'thenstopcun
(2)<='0';endif;
elsifposition=2thenifdowncun(0)='1'thendowncun(0)<='0';endif;
ifupcun
(1)='1'thenupcun
(1)<='0';endif;
ifstopcun
(1)='1'thenstopcun
(1)<='0';endif;
endif;
endif;
-----电梯进入开门状态,且将与所在楼层相关的请求清除
whendown=>downled<='1';state<=dnwait1;
-----下降状态,下降指示灯亮
whendnwait1=>state<=dnwait2;
-----运行持续两秒
whendnwait2=>downled<='0';position:
=position-1;
-----到达新的楼层,下降指示灯灭
ifposition=1thenled1<='1';led2<='0';led3<='0';led4<='0';
elsifposition=2thenled2<='1';led1<='0';led3<='0';led4<='0';
elsifposition=3thenled3<='1';led2<='0';led1<='0';led4<='0';
elsifposition=4thenled4<='1';led2<='0';led3<='0';led1<='0';
elseled1<='0';led2<='0';led3<='0';led4<='0';
endif;
ifposition=3anddd3<"0100"andstopcun
(2)='0'andupcun
(2)='0'anddowncun
(1)='0'
thenstate<=down;
-----电梯在三楼且当前层没有请求,电梯继续下降
elsifposition=2anddd3<"0010"andstopcun
(1)='0'andupcun
(1)='0'anddowncun(0)
='0'
thenstate<=down;
-----电梯在二楼且当前层没有请求,电梯继续下降
elsestate<=dooropen;ifposition=1thenifupcun(0)='1'thenupcun(0)<='0';endif;
ifstopcun(0)='1'thenstopcun(0)<='0';endif;
elsifposition=2thenifupcun
(1)='1'thenupcun
(1)<='0';endif;
ifdowncun(0)='1'thendowncun(0)<='0';endif;
ifstopcun
(1)='1'thenstopcun
(1)<='0';endif;
elsifposition=3thenifupcun
(2)='1'thenupcun
(2)<='0';endif;
ifdowncun
(1)='1'thendowncun
(1)<='0';endif;
ifstopcun
(2)='1'thenstopcun
(2)<='0';endif;
endif;
endif;
-----电梯进入开门状态且将与所在楼层相关的请求清除
whendooropen=>state<=wait1;
whenwait1=>dooropenled<='1';state<=wait2;
-----电梯到达楼层后,停两秒再开门
whenwait2=>ifquick='1'thenstate<=wait7;
-----快速关门,电梯开门后过三秒关门
elsifdelay='1'thenstate<=wait3;-
----延时关门,电梯开门后过九秒关门
elsestate<=wait5;
-----正常情况下电梯开门后过六秒关门
endif;
whenwait3=>state<=wait4;
whenwait4=>state<=wait5;
whenwait5=>state<=wait6;
whenwait6=>state<=wait7;
whenwait7=>state<=wait8;
whenwait8=>state<=wait9;
-----延时过程
whenwait9=>dooropenled<='0';
ifdengwo='1'thenstate<=wait6;
-----不马上关门,门合上后再次打开
elsifdd3>"0000"thenstate<=rukou;
-----请求没有执行完毕,继续执行程序
elsestate<=stop;
-----请求执行完毕,电梯停止运行
endif;
whenstop=>ifposition>1thenstopcun(0)<='1';state<=rukou;
-----如果电梯不是停在一楼,将电梯返回到一楼
elseled1<='0';led2<='0';led3<='0';led4<='0';alarmled<='0';
overweightled<='0';dooropenled<='0';upled<='0';downled<='0';
position:
=0;
-----电梯停止运行,进入上锁状态
endif;
endcase;
endif;
endprocessp1;
endxin;
三部分仿真波形图:
1电梯上锁
电梯上锁,有请求也不执行;
2电梯报警
当有紧急情况时,报警灯亮,有请求不会执行;
3电梯超载
当电梯超载时,超载警报灯亮,有请求不执行
4电梯运行模拟
这个图模拟的是多个请求时,电梯的运行情况。
先是一楼有向上请求想到二楼去同时二楼有向上请求到四楼去,接着四楼有下降请求回到一楼,电梯运行情况是:
电梯在一楼(一楼指示灯led1亮)时开门持续6秒(波形上可以看到开门灯亮),关门后,电梯向上运行(上行指示灯亮2秒),到二楼后(二楼指示灯led2亮),电梯开门(同样开门灯持续亮六秒),接着电梯继续上升,上行指示灯亮2秒,到三楼时,三楼指示灯led3亮,电梯继续向上运行,上行指示灯亮2秒,到达四楼时四楼指示灯亮,同时电梯门打开(开门灯亮6秒),关门后,电梯向下运行(下降指示灯亮2秒),到达三楼时三楼指示灯亮,电梯继续向下运行(下降指示灯亮2秒),到达2楼时二楼指示灯亮,电梯继续向下运行(下降指示灯亮两秒),到达一楼时,电梯门打开(开门灯亮),关门后没有其它请求,电梯停止运行。
四楼有个向下的请求要到三楼去,二楼有个向下的请求要到一楼,电梯运行情况为:
电梯开始时在一楼,一楼指示灯亮,电梯向上运行(上升指示灯亮2秒),到达二楼,二楼指示灯亮,电梯继续向上运行(上升指示灯亮2秒),到达三楼,三楼指示灯亮,电梯仍向上运行(上升指示灯亮2秒),到达四楼,四楼指示灯亮,电梯门打开(开门灯亮6秒),电梯关门后,电梯向下运行(下降指示灯亮2秒),到达三楼(三楼指示灯亮),电梯开门(开门指示灯亮6秒),电梯继续下降(下降指示灯亮2秒),到达二楼(二楼指示灯亮),电梯开门(开门指示灯亮6秒),电梯继续下降(下降指示灯亮2秒),到达一楼,电梯门打开,电梯运行结束。
5电梯开门延时模拟
电梯受到一个不马上关门信号(dengwo=’1’),电梯关上的门重新打开,并延长一段时间门。
6电梯紧急开门
在这幅波形图上,当第二次开门时有一个快速关门信号(quick=’1’)开门灯亮了四秒就灭了(电梯关门了),当第三次开门时收到一个延时信号(delay=’1’),开门灯亮了8秒才灭。
注释:
由于有的信号名字太长无法全部显示出来,现特意标示(每幅图都一样),信号的名称依次为:
alarmalarmledclk1delaydengwodooropenleddown2down3down4downledIt1It2It3It4led1led2led3led4lockoverweightoverweightledquickup1up2up3upled。
系统延时分析总结:
四总结
在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
俗话说写程序容易,调试程序难,通过这次实践我真正体会到了这句话的深刻含义,尤其是对做电梯的同学来说,体会会更深一些,电梯本身并不复杂,就是那么几个状态,之所以难完全是因为电梯的模块较少,集成度比较高,主程序模块的代码非常长(平均大概是170行左右,高的可达250多行),这就给调试造成了极大的不方便,因为代码少,出现错误的概率也比较小。
一旦程序代码较长,逻辑就很难理清,当然如果出现错误还好一点,最关键的是警告,如果警告没处理好,结果很可能就出不来,只能对着一大堆警告在那干着急,大呼“崩溃,悲剧”之类的话,我遇到过很多这种情况,几乎都快绝望了,但是一旦有了结果,那种高兴喜悦之情就会溢于言表,我亲眼目睹很多同学好不容易做出结果后那手舞足蹈的情景,即使内向的人也不例外。
我想这次实践不仅使我们学科学知识这么简单,它还使我们明白了很多的道理,例如如何在绝望中寻找希望,阳光总在风雨后等等,我想对每一个同学而言,这番经历都将使其获益终生。