CASE_04 基于FPGA的电梯控制器

本文详细介绍了如何使用FPGA设计一个六层楼电梯控制器,包括按键消抖、电梯运行主逻辑、步进电机驱动和状态显示模块的详细设计,以及系统设计和硬件实现。通过状态机和模块化设计,实现了电梯的有序运行和状态显示。最后,进行了实物验证和功能测试,确保设计的正确性。
摘要由CSDN通过智能技术生成

         该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源。

目录

1 简介

2. 电梯控制器简介

2.1 电梯控制器的设计框图

3 电梯控制器的模块设计

3.1 按键消抖模块

 3.2 电梯运行主逻辑模块

3.2.1 步骤一:明确设计目标信号

         3.2.2 步骤二:确定逻辑划分(状态机)

 3.3  步进电机驱动模块

 3.3.1 步进电机的基本知识

 3.3.2 步进电机驱动代码

 3.4 状态显示模块

3.4.1 状态显示模块简介

3.4.2  按键模块代码

 4 电梯控制器的系统设计

4.1 电梯控制器顶层设计代码

4.2 电梯控制器系统模块框图

 5 硬件设计

 5.1 电源接口电路设计

5.2 电源系统设计

5.3 时钟设计

5.4 JTAG端口和FPGA配置电路设计

5.5  FPGA芯片的电源引脚

5.6 电梯门外模拟向上请求按键以及指示灯

5.7 电梯门外模拟向下的请求按键以及指示灯

5.8 电梯内部模拟的请求按键以及指示灯

5.9 电梯开关门延迟与提前以及运行方向指示灯

5.10 楼层指示数码管以及超重报警模拟开关,指示灯

5.11 红外光幕保护模拟信号

5.12 步进电机驱动电路

5.13 PCB  图以及3D模型图

 6 实物验证

6.1 管脚分配

6.2  实物验证

资料合集包传送门:


1 简介

        本篇博客将完整讲述基于FPGA的电梯控制器设计。

2. 电梯控制器简介

        在物质生活日益丰富的今天,高楼大厦林立,为工作和生活效率,或是为了更质量的生活质量,大大小小的楼房都安装了电梯,那么电梯是如何有序高效的运行的呢?接下来将一一揭晓,该设计完全模拟了一个6层楼电梯在运行时的大部分逻辑,对学生来讲可以通过该案例学习,了解到如何进行逻辑划分,如何进行完成逻辑代码的设计。切记:该逻辑只能用于学习,不能用作商业目的,因为电梯设计应用中的故障逻辑远比该案例多,有很多涉及人生安全的问题,可能没有考虑全面。

2.1 电梯控制器的设计框图

        电梯控制器的框图如图,在FPGA内部设计了4个大的模块,分管不同的逻辑,简介如下:

按键消抖模块:对按键输入的抖动做滤波,以获取稳定的键值;

        电梯运行主逻辑模块:实现电梯相应请求,控制电梯上下的主要逻辑功能,是核心逻辑;

        状态显示模块:实现将电梯所处的状态通过LED灯,数码管显示出来;

        步进电机驱动模块:按照电梯运行逻辑模块的指令,对步进电机做出正反转控制;

       这里只对各个模块的功能做大致的介绍,更详细的内容见模块设计部分的章节。

3 电梯控制器的模块设计

3.1 按键消抖模块

        按键消抖:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。(摘自:百度百科

        为什么要进行消抖呢?

        在不同的使用场景下,原因不同,总结一句解释消除抖动带来的不利影响;例如:弱电按钮控制强电开关,若不进行消抖,强电开关在闭合时反复抖动,引起高压电拉电弧,容易引发危险。

        按键抖动通常存在两种形式,第一种为高电平有效的,如图所示:

              

        按键在没有按下时,处于常低状态;

        第二种为低电平有效的,如图所示:

                

         按键在没有按下时,处于常高状态;

        如何设计一个模块同时对两种状态都可以进行消抖呢?设置一个计数器数一定长度,当发现按键状态有变化时就开始清零计数,只有当计数器的值大于设定的长度时(这时证明按键状态稳定了),才输出按键的状态,这样就可以达到消抖的目的。

        受篇幅限制, 所有仿真工程和源码和指导视频在下方链接的资料包中统一提供。

仿真文件中模拟输入了一个常高和常低按键按下过程各一个。(注:仿真过程参见视频

)仿真结果如下图:

        

        上面的内容进行单个按键的消抖,在电梯控制器的设计中,一共需要使用18个按键和2个传感器信号,为了集中对按键进行消抖处理,单独设置一个模块,调用20个按键消抖模块,在这个模块中统一对按键进行消抖处理输出,这样可使系统设计的结构更加简明。

        仿真文件中模拟输入了20个抖动的按键输入。(注:仿真过程参见视频)

        仿真结果如下图:

 3.2 电梯运行主逻辑模块

        电梯运行逻辑看似简单,但实际去设计的时候,没有一个正确的思维方式,将在众多输入信号和逻辑判断条件中,陷入泥潭。当然,只要有明确的设计目标和思维方式,一个点一个点的去思考,把复杂逻辑简单化,依然可以很轻松的设计出电梯控制器的控制逻辑。在构思之前,提倡一种换位思考的方式,这种思考方式将有助于迅速构建电梯运行逻辑的框架,那就是把自己当做是电梯,接下来的所有思考你都会设身处地的去理解,作为一个电梯,该怎么办?

3.2.1 步骤一:明确设计目标信号

端口名称

中文含义

端口属性

clk

时钟信号

输入

rst_n

复位信号

输入

up_key[5:1]

1~5楼向上请求按键

输入

down_key[6:2]

2~6楼向下请求按键

输入

close_key

关门按键

输入

open_key

开门按键

输入

floor_key[6:1]

1~6楼楼层请求按键

输入

light_curtain

光幕保护信号

输入

load_over

超载保护信号

输入

motor_rotate_vild

电机旋转完成信号

输入

floor_num

楼层数值

输出

direct_state

运行方向

输出

up_req_state[5:1]

1~5楼向上请求状态

输出

down_req_state[6:2]

2~6楼向下请求状态

输出

floor_req_state[6:1]

1~6楼楼层请求状态

输出

door_state

开/关门状态

输出

stepper_motor_en

电机转动使能信号

输出

load_over_alarm

超载报警

输出

3.2.2 步骤二:确定逻辑划分(状态机)

         状态机的划分的合理性将直接影响后续输出信号设计的难易程度,记住一个要点就是状态机的设计是为了能更好的设计输出信号。在这里将电梯控制器分为了6个状态,每个状态代表着达到了某一层楼。状态机之间的跳转条件,只是电机旋转到了固定的圈数(代表着移动了一层楼的距离)所输出的一个有效使能信号。依托状态机,对电梯的输出状态信号的控制就会变得非常清晰,下面列举电梯控制器在逻辑设计中的要点:

 电梯是典型的遵循方向优先原则的公共交通工具,就是在处于该方向上的所有请求没有被处理完时,不会调换运行方向;

  1. 电梯内部楼层信号:被按下时立即锁存,当电梯达到该层楼时被清零;
  2. 电梯外部向上请求信号:被按下时立即锁存,当电梯达到该层楼,且运行方向向上时被清零;
  3. 电梯外部向下请求信号:被按下时立即锁存,当电梯达到该层楼,且运行方向向下时被清零;
  4. 电梯开关门信号:当电梯到达一层楼时,只有该层存在请求,才开门,否则将继续运行;当门打开时,关门计时器开始计数,只有当计时器计满预定时间时才执行关门(1,有人按下提前关门信号时,计时器会立即计满关门 2,在出现有人按下开门按键、出现超载、红外光幕被遮挡的情况,计时器将停止计数,们就会一直关不上)
  5. 电梯运行方向:只有在1楼和6楼时才会立即调换运行方向;若处于其余楼层,则是在运行方向上没有请求,且反方向有请求时才切换运行方向。
  6. 关于楼层的数字:状态机在那个状态,则输出哪一层楼的数字;
  7. 电机允许转动信号:有请求未被满足,且电梯门处于关闭状态时,使能电机转动。

 受篇幅限制, 所有仿真工程和源码和指导视频在下方链接的资料包中统一提供。

 电梯运行逻辑的仿真如下:

仿真文件中了一段电梯在不断请求中运行的过程:

1, 模拟一个3楼有人按上升请求,进门后请求5楼请求;

2, 在电梯去往3楼的过程中,2楼有人按下向下的请求;

3, 到达3楼后,按下上5楼的请求;

4, 到达2楼后,按下上6楼的请求;

5, 到达6楼后,按下上4楼的请求, 按下提前关门按键;

6, 到达4楼后,先模拟按住开门按键,模拟红外光幕被遮挡,模拟超载;(注:仿真过程参见视频)

仿真结果如下图:

 3.3  步进电机驱动模块

 3.3.1 步进电机的基本知识

        步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。下面这个就是本次设计使用的步进电机:

               本册使用的步进电机型号为24BYJ48,主要技术参数如下表:

       28BYJ48 5V步进电机是4相5线的步进电机,而且是减速步进电机 ,减速比为 1: 64,步进角为 5.625/64 度。 如果需要转动1圈,那么需要360/5.625*64=4096 个脉冲信号。

       怎么理解这句话呢???

       减速步进电机是为了增大扭矩设计的,内部是电机加齿轮的结构,电机上是小齿轮,中轴上是大齿轮。电机旋转时小齿轮带动大齿轮旋转,根据杠杆原理电机的力矩被放大,同时转速被减小,所以称之为减速步进电机。所以电机内部旋转的很快,但是可以看到电机的轴是慢慢转的。

       28BYJ48可得出每个脉冲的步进角度为5.625/64 度,控制电机旋转一周为8个脉冲,所以内部电机旋转一周,轴旋转5.625/64 *8度,可得出轴旋转一周,电机要旋转512转。

        工业使用的步进电机与本次实验使用的不同,下面图式两种不同款式的工业用步进电机:

                   

         使用步进电机前一定要仔细查看说明书,确认是四相还是两相,各个线怎样连接,本次实验使用的步进电机是四相的,不同颜色的线定义如下图:

                   

         下面是电机的端口结构图,1,3为一组,2,4为一组,5号是共用的VCC。

                           

         因本次使用的步进电机功率很小,所以可以直接使用一个ULN2803芯片进行驱动,如果是大功率的步进电机,是需要对应的驱动板的。

3.3.2 步进电机驱动代码

 

        仿真文件中模拟了根据电梯主逻辑控制,控制电机正反转(注:仿真过程参见视频)

仿真结果如下图:

 3.4 状态显示模块

3.4.1 状态显示模块简介

        状态显示模块的功能很简单,就是把电梯运行主逻辑模块的状态转换成控制板卡上数码管,发光二极管的控制信号,让人能直观感受电梯运行的逻辑。比较简单的发光二极管的原理在这里就不在赘述,下面简单介绍一下数码管:

 这里指的数码管就是最常见的七段显示数码管,如图:

        可以看出它是由7段小灯组成的,通过点亮小灯的组合不同可以组成不同的字符。管脚图如下:

       每个管脚控制着一段灯管,数码管还分为共阴和共阳两种,共阴是说每段小灯的负极是连接在一起的(一个共地管脚),每段小灯的正级是分开的(对应着每个管脚),共阳数码管的则刚好相反,本文就以共阴的数码管为例来讲解。

       数码管显示0~9这10个数字,按照管脚状态的组合,可以得到如下的数字管脚组合表,称它为译码表(小数点忽略,该设计不涉及小数点的使用):

       图中用‘1’表示该管脚状态为高,点亮该管脚对应的段码;‘0’则相反;

数字   管脚

a

b

c

d

e

f

g

0

1

1

1

1

1

1

0

1

0

1

1

0

0

0

0

2

1

1

0

1

1

0

1

3

1

1

1

1

0

0

1

4

0

1

1

0

0

1

1

5

1

0

1

1

0

1

1

6

1

0

1

1

1

1

1

7

1

1

1

0

0

0

0

8

1

1

1

1

1

1

1

9

1

1

1

1

0

1

1

3.4.2  按键模块代码

代码工程位于: Elevator_contorller\module_test\key_module\project中。

 

 

        仿真文件中模拟了各个状态灯的控制和数码管的译码功能(注:仿真过程参见视频)

        仿真结果如下图:

 4 电梯控制器的系统设计

        上一章已经完成了数字钟的各个模块的仿真验证工作,这一章将上一章节的模块有机的结合起来就构成了一个完整的电梯控制器了了,这里要完成的工作即是编写电梯控制器的顶层设计代码,将各个模块连接起来。

4.1 电梯控制器顶层设计代码

4.2 电梯控制器系统模块框图

        用quartuse ii对系统工程进行综合以后,点击RTL_VIWER系统可以自动生成设计的系统框图(RTL视图)如图:

 5 硬件设计

        前面的硬件描述语言已经把整个设计的做完,功能仿真也进行完毕了。但是的硬件设计的核心器件还没有定下来。采用器件(EP4CE6E22C8)对工程进行综合编译,可以看到资源占用报告,如图:

        可以看出设计占用了该器件15%的资源,这样还有85%的资源余量,那这样看来该器件是可以完成该设计的。

       下面以FPGA为例选用EP4CE6E22C8来完成该设计,下面分模块对硬件原理图进行讲解。

 5.1 电源接口电路设计

         电源接口电路采用了两种供电的方式,满足不同的情况下使用。

        (1)Micro Usb供电,取电方便,用智能手机的充电线或者充电宝均可取电;(2)排针供电,但是必须要实验室直流电源通过排线接入5V电源。

        电路中使用D1用来防反接,防止电源接反;R1使用的是自恢复保险丝,当后面电路意外短路的时,电阻急剧增大,形成高阻状态,防止烧坏后面电路的器件,当短路情况消失后,电阻减少,形成低阻状态,从而不需要人工干预,有效地保护电路。LED作为一个电源指示灯,当电源接好并且K1开关打开时,电源指示灯常亮。

5.2 电源系统设计

        FPGA芯片需要用到3种电源供电,所以电路中设计3种电源转换电路。

(1)5V电源转3.3V,E5、E6用来滤波储能,C3、C6用来滤出高频电源噪声。

(2)5V电源转2.5V,外部加的滤波电容功能同上。

(3)3V电源转1.2V,外部的电容功能同上。

5.3 时钟设计

        全局主时钟采用50M有源晶振设计,频率精度高、稳定性好,C7、C8用来滤除有源晶振的电源噪声。

5.4 JTAG端口和FPGA配置电路设计

         程序的下载,采用通用的JTAG方式下载程序,由于FPGA掉电易失,所以需要挂一个存储器,电路中选用的是EPCS16S18N,设计PCB板的时候需要注意的地方,就是有些脚需要上拉电阻。

5.5  FPGA芯片的电源引脚

        FPGA的电源引脚分布情况,VCC3_3,VCC1_2,以及VCC2_5。

5.6 电梯门外模拟向上请求按键以及指示灯

        本次设计中,采用按键来模拟电梯门外向上的请求按键,因为设计的是6层楼,所有,按键只有一层到5层有,就是电路图中up_key_x按键代表的楼层请求,高电平导通,当按下对应的楼层请求按键后,对应的按键对应的up_req_led_x就会点亮,用来提示此楼层的请求按键已经被响应。

5.7 电梯门外模拟向下的请求按键以及指示灯

         6层楼的向下请求按键从6楼到2楼,所有,down_key_x是从2到6,当电梯门外的向下请求按键被按下后,对应的向下楼层的请求指示灯down_reg_led_x被点亮,代表请求按键被系统响应。按键高电平有效,LED指示灯输出高电平点亮。

5.8 电梯内部模拟的请求按键以及指示灯

        6层楼,对应的请求按键有6个,模拟进入电梯后,到对应的楼层去,就按下对应的楼层按键,同时,对应的楼层的指示灯点亮,说明按键信号被系统响应,按键高电平有效,指示灯输出高电平点亮。

5.9 电梯开关门延迟与提前以及运行方向指示灯

         电路中使用了2个按键来模拟电梯的提前关门以及延迟关门的动作,当在一个楼层停下后,首先door_state_Led点亮,显示电梯门打开,如果没有提前关门或者延迟关门的动作,那么这个door_state_led亮固定的时间,当close_key被按下后,可观察到这个door_state_led的时间相对于正常来说变短了,当open_key被按下后,可观察到door_state_led的时间相对于正常来说延长了,up_status_led灯亮,表示电梯的运行方向向上,down_status_led亮,表示电梯的运行方向向下

5.10 楼层指示数码管以及超重报警模拟开关,指示灯

         电路中用一个共阴极数码管显示此刻电梯所在的楼层,load_over用来模拟超重的信号,当这个按键按下时,load_alarm_led会持续亮起。

5.11 红外光幕保护模拟信号

         当电梯的door_state_led亮后,说明此时电梯门已被打开,红外对管电路,正常情况下输出高电平,说明此时没有人在电梯门中,如果,检测到light_curtatin变为低电平,即两个红外对管间有遮挡,模拟有人在电梯门中,door_state_led会一直点亮,直到没有遮挡为止。

5.12 步进电机驱动电路

         电路中用了一个4相步进电机用来模拟电梯的升降,采用达林顿管增大驱动电流,从而驱动步进电机,在数码管显示的楼层之间转动,模拟电梯的运行。

5.13 PCB  图以及3D模型图

 6 实物验证

        在这里就已经到达设计的最后一个阶段了,需要把整个设计在的实物上进行验证。

6.1 管脚分配

Step1:打开elevator_contorller\formal_code\clock中的工程

        (注:formal_code正式程序中的在系统仿真的工程中加入了锁相环,以后可以方便的通过锁相环将设计应用于任何开发板)。

Step2:选择Pin Planner

Step3:根据《管脚分配手册》,对管脚进行分配

              分配完成以后保存并从新编译工程。(注:在正式程序的工程中,管脚已经分配好,所以使用时无需再进行分配,这里只是带大家学习这一过程。

6.2  实物验证

        最后一步任务就是把程序下载进入设计的开发板中,然后就可以验证功能是否正确了。

Step1:将实物行如下连接:

Step2: 打开elevator_contorller\formal_code\clock中的工程

  Step3:打开programmer

   Step4:设置硬件链接

 Step4:点击start等待下载完成,下载完成后重新上电

         运行结果:(工程中的下载配置文件已固化好,下载即可,若想学习如何进行下载文件的生成,请自行搜索相关方法

资料合集包传送门:

          至此,基于FPGA的等精度数字频率流程已经讲解完毕,博客中讲解了所有的设计原理和设计重点,同时介于篇幅的限制,部分源码没办法全部给出,需要进一步学习的可下载全套资料合集包,本案例资料合集包较大所以分卷压缩成了两卷,请下载两卷后放在同一文件夹下,这样才能解压成功:

        第一卷传送门: Elevator_contorller_Verilog.part1.rar

        第二卷传送门:Elevator_contorller_Verilog.part2.rar

资料包含内容如下:

文件夹名

功能描述

备注

bom

元器件清单

module_test

模块级的仿真工程(可能采用不同的仿真形式和仿真工具,具体以对应的博客为准)

需要安装Quartuse II 13.1

system_test

系统级的仿真工程(可能采用不同的仿真形式和仿真工具,具体以对应的文档为准)

需要安装Quartuse II 13.1

formal_code

程序工程的实物运行版本版本,用于下载到板卡上运行的(与仿真版本只有参数上的差异,并且生成了配置文件)

需要安装Quartuse II 13.1

sch&pcb

原理图和PCB设计图

打开文档需要安装Adobe Acrobat

video

产品设计讲解课程,与document的文件使用方法相同,也需要用你的机器码来获取播放密码。并且需要“比特电子视频专用播放器”打开,否则会报文件损坏错误。

使用“比特电子视频专用播放器” 去打开视频

软件提取网址

工作室提供了文件使用所需要的软件下载地址和对应的软件安装使用教程提取网址

  • 42
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
下面是一个基于FPGAVerilog语言的三层电梯控制器的代码示例: ```verilog module elevator_controller ( input clk, input reset, input [2:0] floor_buttons, input [2:0] elevator_positions, output [2:0] floor_leds, output [2:0] elevator_directions, output [2:0] elevator_states, output [2:0] door_open ); reg [1:0] elevator_states_reg [2:0]; reg door_open_reg [2:0]; always @(posedge clk or posedge reset) begin if (reset) begin for (int i = 0; i < 3; i = i + 1) begin elevator_states_reg[i] <= 2'b00; // 初始化电梯状态 door_open_reg[i] <= 1'b0; // 初始化门关闭状态 end end else begin for (int i = 0; i < 3; i = i + 1) begin case (elevator_states_reg[i]) 2'b00: begin // 电梯空闲状态 if (floor_buttons[i] != elevator_positions[i]) begin elevator_states_reg[i] <= (floor_buttons[i] > elevator_positions[i]) ? 2'b01 : 2'b10; end end 2'b01: begin // 向上运动状态 if (elevator_positions[i] != floor_buttons[i]) begin elevator_states_reg[i] <= (elevator_positions[i] < floor_buttons[i]) ? 2'b01 : 2'b10; end else begin elevator_states_reg[i] <= 2'b11; // 到达目标楼层,进入开门状态 end end 2'b10: begin // 向下运动状态 if (elevator_positions[i] != floor_buttons[i]) begin elevator_states_reg[i] <= (elevator_positions[i] > floor_buttons[i]) ? 2'b10 : 2'b01; end else begin elevator_states_reg[i] <= 2'b11; // 到达目标楼层,进入开门状态 end end 2'b11: begin // 开门状态 elevator_states_reg[i] <= 2'b00; // 切换到空闲状态 end endcase end end end always @(posedge clk) begin for (int i = 0; i < 3; i = i + 1) begin case (elevator_states_reg[i]) 2'b00: begin // 空闲状态,所有楼层灯熄灭,方向不确定,门关闭 floor_leds[i] <= 3'b000; elevator_directions[i] <= 2'b00; door_open[i] <= 1'b0; end 2'b01: begin // 向上运动状态,显示当前楼层灯,方向向上,门关闭 floor_leds[i] <= elevator_positions[i]; elevator_directions[i] <= 2'b01; door_open[i] <= 1'b0; end 2'b10: begin // 向下运动状态,显示当前楼层灯,方向向下,门关闭 floor_leds[i] <= elevator_positions[i]; elevator_directions[i] <= 2'b10; door_open[i] <= 1'b0; end 2'b11: begin // 开门状态,显示当前楼层灯,方向不确定,门打开 floor_leds[i] <= elevator_positions[i]; elevator_directions[i] <= 2'b00; door_open[i] <= 1'b1; end endcase end end assign elevator_states = elevator_states_reg; assign door_open = door_open_reg; endmodule ``` 这个示例代码实现了一个三层电梯控制器。它接收来自三个楼层按钮的输入和三个电梯位置的输入,并根据当前电梯状态控制楼层LED灯、电梯运行方向和门的状态。每个电梯都有独立的状态和门控制。具体的FPGA实现可能会有所不同,但这个示例可以作为一个起点来帮助你开始设计三层电梯控制器Verilog代码。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值