基于fpga的直流电机vhdl+论文+开题报告+(csdn免费下载)

FPGA项目设计 专栏收录该内容
17 篇文章 6 订阅

下载资料链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

摘要

直流电机是日常生活中常见的一种能量转换装置,它应用广泛,功能强大,在生产生活中占据着重要位置。直流电机的控制方法多种多样,控制系统的组成更是五花八门。本文将采用现场可编辑门阵列FPGA来实现对直流电机的控制,为实现电机数字控制提供一种新方法。

硬件方面,我们将使用Altera公司的Cyclone中等规模FPGA芯片。论文中,我们对控制系统的硬件电路进行简单的说明,对所使用的芯片功能与各项参数进行详细介绍,以使整个系统的设计思路更加清晰。

软件方面,我们使用QuartusII软件及VHDL语言来完成本次设计的程序部分。利用VHDL语言编程,再生成各个功能模块,通过对各个功能模块的连接,构成整个直流电机控制系统。将设计好的软件系统下载到实验箱,就可以通过实验箱上的按键实现对直流电机的控制。

基于FPGA的直流电机PWM控制

引 言

直流电机作为一种电能转换为机械能的基本装置,自问世以来,就在国民经济中占据重要地位。在我国,随着生产力大发展和生产现代化的加深,直流电机在我国的各行各业都扮演着重要的角色。而增强对直流电机的控制能力,就能让直流电机更好的满足人们的要求,因此,一直以来人们都在不断提升和改进直流电机控制技术。

最初的直流调速系统是采用恒定的直流电压向直流电动机电枢供电,通过改变电枢回路中的电阻来实现调速。这种方法简单易行设备制造方便,价格低廉。但缺点是效率低、机械特性软、不能在较宽范围内平滑调速,所以目前极少采用。1957年晶闸管的发明使直流电机控制水平上了一个新台阶。它体积小、响应快、工作可靠、寿命长、维修简便,采用晶闸管供电,不仅使直流调速系统经济指标上和可靠性有所提高,而且在技术性能上也显示出很大的优越性。

随着计算机技术的飞速发展,数字直流调速控制装置兴起,使当今的直流电机控制系统拥有了更高的精确性,稳定性和可操作性。这使得直流电机得以在对电动机控制系统的性能要求较高的场合大显身手。

硬件电路系统的改进与复杂化,促使了各类硬件设计软件和工具的发展与进化。而FPGA拥有最高的逻辑密度、最丰富的特性和最高的性能,在如今的硬件设计中广泛应用,从数据处理和存储直到仪器仪表、数字信号处理都广泛涉及。因此,本次设计将利用现场可编程门列阵(FPGA)及VHDL语言编程来实现对直流电机的PWM控制。与传统PWM控制电路相比,使用FPGA产生PWM波形,只需FPGA内部资源就可以实现,与这样可以大大简化外围电路,省去了数模转换电路,有效缩小电路尺寸,减小电路功耗,使整个系统更容易控制与维护。VHDL语言与其他硬件语言相比,具有设计灵活,功能强大,易于修改,支持广泛等特点,尤其是Block模块设计,可以使抽象的编程语言形象化,使整个电路设计内容更容易理解与修正。

1 设计软件及开发平台

1.1 QuartusII软件简介

Quartus II
是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera
Hardware Description
Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。而且,Quartus
II提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。

除此之外,Quartus II 可以和DSP
Builder工具与Matlab/Simulink相结合,能够方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

QuartusII软件支持多种语言,本次设计采用VHDL语言。它是超高速集成电路硬件描述语一言(Very-High-speed
Integrated Cireuit Hardware Description
Language)的缩写,于1985年正式推出,是目前标准化程度最高的硬件描述语一言,IEEE于1987年将VHDL采纳为IEEE#1076标准。经过十几年的发展、应用和完善,VHDL以其强大的系统描述能力、规范的程序设计结构、灵活的语言表达风格和多层次的仿真测试手段,在电子设计领域得到了普遍的认同和广泛的接受,成为现代EDA领域的首选硬件描述语言。目前,流行的EDA工具软件全部支持VHDL,它在EDA领域的学术交流、电子设计的存档、专用集成电路(ASIC)和SOC设计等方面,
担任着不可或缺的角色。

1.2 SmartEDA实验开发平台

SmartEDA实验开发平台拥有实验开发所需的必须功能,除了核心芯片外,拥有种类丰富、功能强大的外围电路。使用方便快捷,易于操作。其主要功能特点如下:

  • 核心板包括用户扩展PACK、4个独立按键、8个LED以及5V电源插座,在PACK上扩展设计后可直接用于用户产品设计和电子设计大赛。

  • 采用核心板加主板的灵活结构,核心板可以采用各公司FPGA的各种型号。

  • 大部分实验不需要跳线设置,免去了实验前繁琐的跳线设置,实验开发简单快捷。

  • 核心板上I/O口PACK考虑的高速特性,可用于高速扩展外设。

  • 具有SD卡接口,支持SD、MMC卡读写。

  • 8个独立LED灯,8个独立按键,1个蜂鸣器。

  • 8个七段数码管。

  • 直流电机驱动电路(包括测速电路),可做直流电机闭环调试控制实验。

  • 大量实验程序,详细配套教材。

    本次设计所用的FPGA为Altera公司Cyclone系列的EP1C6Q240,它兼容EP1C12Q240。EP1C6Q240包含有5980个逻辑单元和92Kbit的片上RAM,拥有185个用户I/O口。

    Cyclone
    FPGA常用的配置方式有主动配置(AS)、被动配置(PS)以及JTAG配置。Cyclone
    FPGA是第一款支持对配置数据进行压缩的FPGA,这使得用户可以将压缩的配置数据存储到配置器件或其他存储器中。

    图1-1为SmartEDA实验开发平台的核心电路图。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYrKzffj-1618936139685)(media/a3fcce397918adc369a695a5caf1bd78.png)]
    在这里插入图片描述

    图1-1 SmartEDA实验开发平台的核心电路图

    Figure 1-1 the core circuit diagram of SmartEDA

2 控制原理

2.1 直流电机基本工作原理

直流电机由永磁铁、电枢、换向器组成。如下图2-1a,2-2b,上下为两个固定的永久磁铁,分别为N极,S极。abcd为一个可旋转导体,即电枢。电枢的ab端与cd端分别连接两个互不接触的半圆形金属片,这两金属片就是换向器。

工作时,在换向器的AB两端上加上一个上正下负的直流电压(如图2-1a),电流由a到b,由c到d,而磁力线方向为自上而下。由左手定则,ab向左移动,cd则向右移动,电枢将逆时针旋转起来。因为换向器与电枢连接在一起,因此也会随着电枢逆时针旋转。

当电枢转过180°,如图2-1b,cd在上,ab在下。电流由d到c,由b到a。由左手定则可知,cd向左移动,ab向右移动,电枢将继续沿逆时针方向旋转。当转过180°时,又回到图2-1a的情况。如此往复,电机实现转动。

若改变A、B的正负,电机将顺时针旋转,原理同上。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fISTFoXQ-1618936139687)(media/1445f3d18684c98a9fbf663662445ada.png)]

图2-1a 直流电机的旋转原理 图2-1b 直流电机的旋转原理
在这里插入图片描述

Figure2-1a The rotation of DC motor Figure2-1b The rotation of DC motor

2.2 直流电机PWM调速原理

2.2.1 PWM简介

PWM,即“Pulse Width
Modulation”的英文缩写,其意为脉冲宽度调制。控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,这种脉冲被称为PWM
信号。通过调整PWM的周期、PWM的占空比便可以达到控制充电电流的目的。

近年来,随着计算机进入控制领域,以及新型的电力电子功率元器件的不断出现,使采用全控型的开关功率元件进行脉宽调制控制方式已成为主流。这种方式很容易在微机控制中实现,这正是直流电机控制数字化的契机。

2.2.2 PWM调速原理

直流电机的速度控制有对励磁磁通进行控制的励磁控制法和对电枢电压进行控制的电枢控制法。由于励磁控制法受到的限制较多,因此本次设计中将采用电枢控制法。现在绝大多数直流电机采用开关驱动方式,通过脉宽调制PWM就可以控制电枢电压,进而实现调速。

PWM为一种等幅、占空比可变的方波,改变占空比,即可改变一个周期内电枢两端的平均电压。设占空比为α,周期为T,高电平时间为t1,低电平时间为t2,电枢两端最大电压为U,平均电压为U0,则可得到如下关系

T=t1+t2 (2.1)

α= (2.2)

(2.3)

由以上两式不难看出,改变占空比即可改变电枢两端的平均电压。在转矩不变的情况下,电机转速跟供电电压成正比,所以通过改变占空比就可以实现对控制的速度。

在PWM调速时,可以通过以下3种方法改变占空比:

(1)定宽调频法。T1保持不变,只改变t2,周期T(或频率f)也随之改变。

(2)调宽调频法。T2保持不变,只改变t1,周期T(或频率f)也随之改变。

(3)定频调宽法。周期T(或频率f)保持不变,同时改变t1和t2。

由于前两种方法在调速时,将改变PWM的周期,进而改变PWM的频率。当

PWM的频率与机械固有频率接近时,将引起震荡。因此,现在多采用第三种方法。

2.3 实验箱直流电机电路

直流电机及测速电路如图2-2。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88ESBHfc-1618936139690)(media/70ed1e18747907889922803dfbcadb55.png)]

图2-2 直流电机及测速电路

Figure 2-2 The circuit of DC motor and tachometer circuit

如图2-2,直流电机控制使用了H桥驱动电路。当DCMotorA输出高电平时,则Q3、Q6导通→Q1导通→MOTOR_B点为MGV+,Q6导通→MOTOR_A点为GND,此时直流电机会正转。由于Q6的集电极通过一个二极管D3连接到H桥的另一个控制端DCMotorB,将DCMotorB控制端电压钳在1.0V以下,所以不管DCMotorB输出是高电平还是低电平,Q5、Q7都会截止,故Q2截止,不会造成H桥短路故障。

当DCMotorA输出为低电平时,Q3、Q1截止→Q6截止,DCMotorB的输出电平可以控制电机反转或停机。若DCMotorB输出高电平,则Q5、Q7导通→Q2导通→MOTOR_A点为MGV+,Q7导通→MOTOR_B点为GND,此时直流电机将会反转。当DCMotorB输出低电平时,Q5、Q7都会截止,故Q2截止,电机停机。

主板上还设计有电机测速电路,这样可以进行闭环调试实验。测试电路采用槽型光电开关,当电机转动时,安装在电机转轴上的转盘将从槽型光电开关转过。转盘上均匀分布有4个孔,电机转动一周,光电开关工作4次,则在DCMotorSpeed输入引脚上会出现4个低脉冲。检测1S内DCMotorSpeed上低脉冲的个数除以4即可得到电机每秒转速。U14为施密特触发器,用于对光电开关输出信号进行整形处理,LED19是对外的逻辑分析仪测试点及接口。

3 控制系统软件设计

3.1 总体功能简述

本次设计要求使用FPGA实现对直流电机的启停、加减速、正反转的控制。用FPGA控制直流电机,能够将大量逻辑功能集成于一个单片IC中,节省资源,实现在线编程。擦除,使设计更灵活,可靠度更高,且系统结构极为紧凑。在整个设计过程中,只要将适当的程序导入实验箱内的芯片,并锁定直流电机电路的所需引脚即可完成对直流电机的初步控制。

整个系统共包含4个按键。这4个按键是电机控制系统的控制端。分别是启停键、正反转键、加速键、减速键。当按下任意一个按键时,电机将根据按键产生相应的变化。流程图如图3-1。
在这里插入图片描述

Figure 3-1 the flow chart of control system function design

除此之外,为了更好的检验对电机的控制能力,同时丰富设计内容,这次设计中将额外加入测速模块,利用该模块可以对电机一周期内的转动圈数进行计数,并将计数结果显示在七段数码管上。

3.2 程序逻辑原理

3.2.1 PWM信号产生与控制原理

当系统工作时,时钟信号导入PWM模块,模块内部计数器将进行计数,之后将计数结果与设定值比较,根据比较的不同结果,输出端会输出高低两种电平信号,从而产生占空比可调的PWM信号。

设定值通过按键控制其加减,起始值为默认的0。因此通过按键调节设定值的大小,可以对PWM信号的占空比进行调节。在这次设计中,PWM信号只有0和1两个值,随着PWM信号导入控制模块,在控制模块输出的电压也将呈现无电压与额定电压之间的不断转换。当通断电时间足够短时,电机的停顿将无法被人眼识别,电机的速度由此得到有效控制。

3.2.2 测速电路测速原理

前文已经提到,实验箱上的测速电路采用槽型光电开关。电机每转动一圈,均会在MotorSpeed端口输出4个低电平脉冲。因此若要实现对电机的测速,只需对输出脉冲信号中的低电平进行计数,经过适当运算处理即可实现。

由于最终结果将在七段数码管上显示,因此在计数时应采用十进制计数,这样,计数结果将为“8421BCD码”,再将各位上的BCD码按位分别导入显示电路,就可以轻易完成数码管显示。如果直接采用二进制计数,最终的计数结果需要转换为十进制数,在按位显示,将大大增加运算量,增大显示难度,除此之外,在之后的程序编辑时,也极容易产生逻辑混乱,无法正常实现其应有功能。

3.2.3 显示电路原理

这次设计将使用七段数码管显示两位计数结果。但是受到实验箱硬件的限制,每次只有一个数码管可以正常显示。为了克服实验箱的硬件限制,我们将在程序上进行一定调整,使用状态机来让两个数码管进行轮流显示。如果两个数码管的切换频率足够快,利用人眼的视觉暂留,就可以产生两位数同时显示的错觉,从而顺利实现数码管十进制显示。

在程序上实现从二进制数到数码管十进制显示的转换并不难,只要知道如何控制数码管的各段即可。图3-2a为数码管各段编号,图3-2b为共阳极数码管的原理图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbPDy4Yl-1618936139694)(media/814b54f3b6e875008105811d7cf727eb.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3eTIbqdT-1618936139695)(media/0d9693da85b4a98c685d85d7d9a1d6ea.png)]
在这里插入图片描述

图3-2a 数码管各段编号 图3-2b 共阳数码管原理图

Figure 3-2a the segment number of nixie tube Figure 3-2b schematic diagram
of anode digital tube

在显示模块中,需要利用CASE语句将二进制码与数码管段码之间进行转换。转换按照表3-1所示七段LED显示字符与段码表进行。

表3-1 LED显示字符与段码对照表

Table 3-1 the comparison table of LED display character and segment code

显示字符共阳极段码共阴极段码
0C0H3FH
1F9H06H
2A4H5BH
3B0H4FH
499H66H
592H6DH
682H7DH
7F8H07H
880H7FH
990H6FH

3.2.4 状态机简介

状态机及其设计技术是实用数字系统设计中的重要组成部分,也是实现高效率高可靠逻辑控制的重要途径。用VHDL语言可以设计不同的表达方式和不同实用功能的状态机,然而它们都有相对固定的语句和程序表达方式,只要把握了这些固定的语句表达部分,就能根据实际需要写出各种不同风格和实用目的的VHDL状态机。因此,掌握和应用状态机是很有必要,并且不难实现的。

利用VHDL设计的实用逻辑系统中,有许多可以利用状态机的设计方案来描述和实现。无论与基于VHDL的其他设计方案相比,还是与可完成相似功能的CPU相比,状态机都有其难以超越的优越性。

首先,状态机的工作方式是根据控制信号按照预先设定的状态进行顺序运行,因此可以克服纯硬件数字系统顺序方式控制不灵活的特点。第二,状态机容易构成性能良好的同步时序逻辑模块,这对于对付大规模逻辑电路设计中令人深感棘手的竞争冒险现象是一个上佳选择。第三,与VHDL的其他描述方式相比,状态的VHDL表述丰富多样,程序层次分明,结构清晰,易读易懂。在排错、修改和模块移植方面也有其独到的好处。第四,在高速运算和控制方面,状态机更有其巨大的优势。由于在VHDL中,一个状态机可以由多个进程构成,一个结构体中可以包含多个状态机,而一个单独的状态机以顺序方式所能完成的运算和控制方面的工作与一个CPU的功能类似。因此,一个设计实体的功能便类似于一个含有并行运行的多CPU的高性能微处理器的功能。而多CPU的微处理器早已在通信、工控和军事等领域有了广泛应用。第五,状态机在可靠性方面具有明显优势。CPU本身的结构特点与执行软件指令的工作方式决定了任何CPU都不可能获得圆满的容错保障。因此,在要求高可靠性的特殊环境中的电子系统中,CPU就难以满足要求。而状态机就不同了,它由纯硬件电路构成,并且拥有各种完整的容错技术。除此之外,即使状态机进入了非法状态,它也可以在极短的时间内跳出,这不足以对系统造成伤害。

用VHDL语言设计的状态机有多种形式,从状态机的信号输出方式上可以分为Mealy型和Moore型两种状态机;从结构上分,有单进程状态机和多进程状态机;从状态表达方式上分,有符号化状态机和确定状态编码状态机;从编码方式上分,有顺序编码状态机、一位热码编码状态机或其他编码方式状态机。然而,最一般和最常用的状态机通常包含说明部分、主控时序进程、主控组合进程、辅助进程几个部分,这也是状态机易于操作的原因之一。

这次设计中,我们将使用Mealy型状态机。Mealy型状态机的输出是当前状态和输入信号的函数,也就是说,当输入信号发生变化时,它的输出将立即发生相应的变化,而不完全依赖时钟信号。这次的显示模块需要实时显示电机所转的圈数,因此必须使用Mealy型状态机。

3.3 各模块功能设计与分析

3.3.1 PWM信号发生模块

PWM信号是整个电机控制系统的基础,没有PWM信号,就无法正常实现对电机的正常控制,因此PWM模块设计的好坏会直接影响设计的最终效果能否让人满意。

该模块的输入端,至少应有时钟信号输入端、与比较值输入端两个。时钟信号输入后,触发模块内部计数器,对时钟脉冲进行计数。之后与比较值输入端输入的输入值进行比较,决定输出端的输出信号。在此,我们加入一个PWM_EN的使能端,当使能端输入为0时,不论比较结果如何,PWM模块的输出端始终是0;当使能端输入为1时,输出端根据比较结果正常输出。PWM模块的输出将输入到主控模块,并最终影响电机运行状态,加入这个使能端,可以在PWM模块里实现对电机的启停控制,这样系统控制的精确性有较高保障,同时可以减小主控模块的体积,降低内部程序的复杂度,在后期的维护与纠错中,可以保证我们更快的找到问题所在。

在PWM模块的输出端设计上,我们有两种选择。第一,采用双输出,即输出端根据比较结果同时输出0和1。第二,采用单输出,即输出端根据比较结果,按一定周期分别输出0和1。这次设计所用实验箱里的直流电机电路为双输入(MotorA与MotorB),因此,在PWM模块采用双输出可以说是有一定道理的。但整个控制系统所要实现的功能是多样且复杂的,双输出虽然直接易懂,但并不利于系统控制与程序编译。而单输出则不同,虽然无法实现对直流电机的直接控制,但是可以将输出信号输入到主控模块中,并在主控模块中经过适当的处理,实现对直流电机的有效控制。显然,采用这种方法稳定性更好,程序上也更加简单易懂。图3-3为PWM模块管脚图。

>   [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJ4XST9k-1618936139695)(media/9d4ee137be212952934b9824d1deba84.png)]

图3-3 PWM模块

Figure 3-3 PWM module

PWM模块程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity pwm is

port(clk:in std_logic;

bj:in std_logic_vector(3 downto 0);

pwm_en:in std_logic;

pwm_out:out std_logic

);

end pwm;

architecture a1 of pwm is

signal cnt:std_logic_vector(3 downto 0);

signal pwm_inside:std_logic;

begin

process(clk,pwm_en)

begin

if(clk’event and clk=‘1’) then

cnt<=cnt+1;

end if;

if(cnt<bj) then

pwm_inside<=‘1’;

else pwm_inside<=‘0’;

end if;

pwm_out<=pwm_inside and pwm_en;

end process;

end;

下图为比较值(bj)等于“1000”时的时序仿真图

在这里插入图片描述

图3-4 PWM模块时序仿真图

Figure 3-4 Timing simulation diagram of PWM module

3.3.2 按键计数模块

为了实现直流电机的速度控制,就必须保证用户可以改变PWM信号的占空比,而信号的占空比可以通过改变PWM模块中的比较值来实现。因此,在PWM模块之前,我们加入一个按键计数模块。该模块中有加、减两个按键,当按下这两个按键时,输出端的输出值将发生相应的加、减变化。除了这些基本功能,我们还将输出结果输入到实验箱上的LED电路中,用四个LED灯显示当前速度等级,以方便控制与读取。

使用VHDL语言编程时,在同一个PROCESS中只能存在一个边沿触发,因此在编辑按键触发程序时,在逻辑上容易出现一些意想不到的错误。针对这种情况,我们对按键的功能进行了一些改动,将KEY1和KEY2两个键中的KEY2键改为加减档控制键。当KEY2键未按下时,按下KEY1,计数器将加一;当KEY2按下之后再按KEY1时,计数器将减一。计数器的默认起始值为0,因此,操作时,应先将本模块的内部计数值提高一些,否则,即使按下直流电机启动键,电机也无法正常运转。图3-5为按键计数管脚模块。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCCyBKiL-1618936139696)(media/bc2d7a89a63fe12e197c41b7efb530f9.png)]
在这里插入图片描述

图3-5 按键计数模块

Figure 3-5 pressed key count module

模块程序如下

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity jishu is

port(key3,key4:in std_logic;

count_out:out std_logic_vector(3 downto 0);

led:out std_logic_vector(3 downto 0)

);

end jishu;

architecture aa of jishu is

begin

process(key3)

variable cnt:std_logic_vector(3 downto 0);

variable de:std_logic_vector(3 downto 0);

begin

if(key4=‘0’) then

de:=“1111”;

else

de:=“0001”;

end if;

if(key3’event and key3=‘0’) then

cnt:=cnt+de;

end if;

count_out<=cnt;

led<=cnt;

end process;

end;

3.3.3 主控模块

主控模块是整个直流电机控制系统的核心,它是直接与直流电机端口相连的模块。由于加减速控制已经通过PWM模块与按键计数模块实现,所以在主控模块中只需要实现启停信号与正反转信号的产生,并在最后输出时与PWM信号进行整合就可以实现对直流电机运行状态的控制。

在模块的输入端,需要有两个按键输入,它们分别对应直流电机的启停键与正反转键。除此之外,还需要有一个PWM信号输入端,用于接收由PWM模块产生的PWM信号。在输出端,主控模块是与直流电机电路相连的,因此要有两个连接直流电机的输出端口。同时,还要有一个PWM信号使能信号输出端,将使能信号输入到PWM模块中。当使能信号为1时,允许PWM模块正常输出PWM信号;当使能信号为0时,使PWM模块只能输出0,从而实现对直流电机的启停控制。

对于直流电机的启停控制,也可以通过在模块内部设定控制信号的方式来实现。即在模块内设定一个只有高低位的脉冲信号,在最后的输出时,与输出信号相整合,这样也可以实现直流电机的启停控制。不过采用这种方法,会使最终用于整合的信号多出一个,这无疑会使程序看起来更加繁琐,不利于纠错与改进,因此最终我们放弃了这一方案。

对于直流电机的正反转控制,同样有两种方案可以选择。一种是对最终输出结果进行取反运算。例如,正常情况下,直流电机正转时,直流电机电路两个输入端MotorA=‘1’,MotorB=‘0’。当按下正反转按键时,将对主控模块的输出取反,此时,MotorA=‘0’,MotorB=‘1’,直流电机将进入反转状态。这种方案实现简单,通俗易懂,但有一个明显的缺陷。当直流电机停止时,直流电机电路两个端口均是为0,如果此时按下正反转键,两个端口将全变为1,直流电机开始正转;如果在这种情况下再次按下正反转键,两个端口又都变为0,直流电机停止转动。这显然与正反转的功能相悖。就算直流电机通过正常方式启动,也有可能在各类按键操作过程中,使直流电机电路两端口进入错误状态(例如全1或全0),这种情况下,该系统的正反转控制也将失灵。因此放弃该方案。

正反转控制的另一种方案是在模块内部设置一个正反转信号。其默认状态为0,当按下正反转控制键时,该信号将取反。在输出端口,该信号会与各内部信号整合,并将整合结果作为最终输出输入到直流电机电路中。使用这种方法,可以有效提高电机正反转控制的稳定性与精确性,远远优于第一种方案,因此在这次设计中,我们将采用这个方案实现对正反转的控制。图3-6为主控模块管脚图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WA4c7rIj-1618936139698)(media/6e85ab2a98ea244dbf101075f33904df.png)]
在这里插入图片描述

图3-6 主控模块

Figure 3-6 master control module

主控模块程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity kongzhi is

port(key1,key2:in std_logic;

pwm_in:in std_logic;

en_out:out std_logic;

mota:out std_logic;

motb:out std_logic

);

end kongzhi;

architecture a2 of kongzhi is

signal z_f:std_logic;

signal q_t:std_logic;

begin

process(key1,key2)

variable count:std_logic_vector(3 downto 0);

begin

if(key1=‘0’) then

q_t<=not q_t;

end if;

if(key2=‘0’) then

z_f<=not z_f;

end if;

en_out<=q_t;

mota<=pwm_in and not z_f;

motb<=pwm_in and z_f;

end process;

end;

3.3.4 测速模块

为了丰富设计内容,扩展整个直流电机控制系统的功能,我们在基础功能之外加入了测速功能。通过这一功能,可以使用户直观的看到直流电机在一个运行周期内所转动的圈数。

实现这一功能需要使用实验箱上的MotorSpeed端口,该端口是直流电机电路中的一个输出端口,它功能与其他两个端口相互独立,互不干扰。因此这部分功能将独立于之前的控制模块之外,两个模块互不影响。同时,这个功能也将充分利用直流电机电路中的一个未使用端口,增加实验箱的使用率。

测速模块的主要功能是对由MotorSpeed端口输出的低电平脉冲进行计数,并经过适当的方法将计数结果转换为电机所转的圈数。对电平脉冲计数是十分容易实现的,不论是低电平触发还是边沿触发都可以实现准确的计数。因此,这一模块的难点与关键是将低电平脉冲计数结果转换为圈数的计数。由直流电机电路的内部设计,我们知道,直流电机每转一圈,将有四个低电平脉冲从MotorSpeed端口输出。我们知道,在VHDL语言中是不能进行除法计算的,所以最直观的除四法是不能实现的。

针对这种情况,我们在测速模块内部设置了双计数系统。即当低电平脉冲到来时,计数器1由0开始计数,当计数器1的结果为4时,计数器2才加一。而计数器1将清零并重新开始计数,如此循环,最终我们将得到电机转动圈数的二进制表示结果。显然,采用这种方法,对于直流电机所转圈数的计数是可以顺利实现的。

但这种方法也有一个缺陷。由于计数结果是二进制数,而最终的显示方式是基于七段数码管的十进制显示。如果结果是一位数,实现起来并不难。但由于直流电机的转速非常快,显示电路至少要使用两位数七段码管,这无疑就十分困难了。二进制数与十进制数之间进行转换,并且将转换结果按照数位分别输出,利用VHDL语言几乎是不可能实现的,即使实现,也将使用大量的程序语句。对于一个系统来说,简单易懂,方便执行是十分重要的,因此,我们决定在计数方式上加以改进。

改进方法如下:计数器1的工作方式不变,依旧对低电平脉冲计数,当计数结果为4时,计数器1清零,计数器2加一。当计数器2的计数结果为“1010”时,计数器2清零,计数器3加一。在最后输出时,计数器2将对应最终计数结果的个位,而计数器3将对应输出结果的十位。采用这种方案,在显示模块时进行的数值转换将十分容易,而且这种位对位的方式也大大提高了稳定性与准确性。图3-7为测速模块管脚图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEzpudra-1618936139700)(media/f2ba7ae2585bef9a275d88eab629e310.png)]
在这里插入图片描述

图3-7 测速模块

Figure 3-7 speed measurement module

测速模块程序如下:

library ieee;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_1164.all;

entity cesu is

port(speed:in std_logic;

high_out:out std_logic_vector(3 downto 0);

low_out:out std_logic_vector(3 downto 0)

);

end cesu;

architecture b1 of cesu is

signal jj:std_logic;

begin

process(speed)

variable cnta:std_logic_vector(1 downto 0);

variable gw:std_logic_vector(3 downto 0);

variable sw:std_logic_vector(3 downto 0);

begin

if(speed=‘0’) then

cnta:=cnta+1;

end if;

if(cnta<“11”) then

jj<=‘0’;

elsif(cnta=“11”) then

jj<=‘1’;

end if;

if(jj’event and jj=‘1’) then

if(gw<9) then

gw:=gw+1;

sw:=sw;

elsif(gw=9) then

gw:=“0000”;

sw:=sw+1;

end if;

end if;

high_out<=sw;

low_out<=gw;

end process;

end;

测速模块时序仿真结果如图3-8

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXpsuNJM-1618936139701)(media/93a46dd7242900e496d0457ca900c248.png)]
在这里插入图片描述

图3-8 测速模块时序仿真图

Figure 3-8 Timing simulation diagram of speed measurement module

其中,high_out对应于十位,low_out对应于个位,结果一目了然,计数无误。

3.3.5 数码管显示模块

测速模块的计数结果,必须经过显示模块,才能将二进制结果转换为由数码管显示的十进制数。由于受到实验箱的硬件限制,我们无法实现两个数码管同时显示,因此在程序上,我们将使用状态机作为显示辅助手段,让选中的两个数码管以足够快的频率轮流显示,利用人眼的视觉暂留来实现两位数显示。人眼的视觉暂留时间一般为0.1s到0.4s,因此,在理论上,只要两个数码管的切换频率只要大于10HZ,就基本可以产生两个数码管同时显示的错觉。当然,如果频率越大,看起来越连贯,显示效果也越好。在这次设计中,我们将频率设置为100HZ,远远大于最低要求,显示结果完全可以保证。

显示模块的高位输入端和低位输入端将分别接收来自计数模块的十位和个位两个信号,时钟信号输入端将接收频率为100HZ的CLK信号。高、低位输入端将决定数码管的显示数值,而时钟信号输入端接收的时钟信号的频率将决定两个数码管之间的切换速度。模块输出端将连接实验箱的数码管显示电路,将段控制信号与位控制信号输入其中,实现对数码管显示电路的控制。

在程序上,我们将使用一个多进程状态机来实现。其中一个进程用于实现将二进制输入转换为十进制数并在数码管上显示;另一个进程用于实现两个数码管的轮流显示。二进制数与七段数码管显示的十进制数之间的对应关系已经在3.2.3中给出,这里不再赘述。图3-9为显示模块管脚图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2ZdB3fm-1618936139702)(media/3682cf085eaed9649632adb58b906061.png)]
在这里插入图片描述

图3-9 显示模块

Figure 3-9 display module

显示模块的程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity xianshi is

port(clk:in std_logic;

high_in:in std_logic_vector(3 downto 0);

low_in:in std_logic_vector(3 downto 0);

duan:out std_logic_vector(6 downto 0);

wei:out std_logic_vector(1 downto 0)

);

end xianshi;

architecture b2 of xianshi is

Type states is (s0,s1);

signal st,nst: states:=s0;

signal qq:Std_Logic_vector(3 downto 0);

begin

process(high_in,low_in,st,clk)

begin

case st is

when s0=> qq<=low_in;wei<=“10”;

When s1=> qq<=high_in;wei<=“01”;

when others=> qq<=qq;wei<=“11”;

end case;

CASE qq IS

When “0000”=> duan<=“1000000”;

When “0001”=> duan<=“1111001”;

When “0010”=> duan<=“0100100”;

When “0011”=> duan<=“0110000”;

When “0100”=> duan<=“0011001”;

When “0101”=>duan<=“0010010”;

When “0110”=> duan<=“0000010”;

When “0111”=> duan<=“1111000”;

When “1000”=> duan<=“0000000”;

When “1001” => duan<=“0010000”;

When others => duan<=“1111111”;

end case;

CASE st IS

When s0=> nst<= s1;

When s1=> nst<= s0;

end case;

end process;

reg: PROCESS(clk)–zhukong shixu jincheng

begin

if clk’Event and clk = ‘1’ then st<=nst;

End if;

End PROCESS reg;

end;

3.3.6 消抖模块

作为机械开关的键盘,在按键操作时,机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,如图。在实际应用中,如果不进行处理将会造成误触发。

按键消抖动关键在于提取稳定的低电平状态,滤除前沿、后沿抖动毛刺。对于一个脉冲,可以用一个脉冲对它采样。如果连续三次采样为低电平,可以认为信号已经处于稳定状态,这时输出一个低电平按键信号。如果采样的过程中不能满足连续三次采样为低,则认为键稳定状态结束,这时输出为高电平。一般的检测时间是10ms,即在10ms内如果按键状态无变化,就视为按键按下,这次设计正是如此。图3-10为按键抖动原理图。

在这里插入图片描述

图3-10 按键抖动原理图

Figure3-10 schematic diagram of button judder

图3-11为消抖模块管脚图
在这里插入图片描述

图3-11 消抖模块

Figure 3-11 shakes disappeared module

消抖程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_Arith.ALL;

USE IEEE.STD_LOGIC_Unsigned.ALL;

ENTITY filter_200us IS

PORT(

clk,in_bit: IN STD_LOGIC;

out_bit: OUT STD_LOGIC

);

END;

ARCHITECTURE one OF filter_200us IS

SIGNAL cnt:STD_LOGIC_VECTOR(19 DOWNTO 0);

SIGNAL out_bit_r:STD_LOGIC;

BEGIN

out_bit<=out_bit_r;

PROCESS(clk)

BEGIN

IF RISING_EDGE(clk) THEN

IF in_bit =‘1’ THEN

cnt <=X"00000";

out_bit_r <=‘1’; ELSE

IF cnt>=480000 THEN out_bit_r<=‘0’; ELSE .

cnt<=cnt+1; out_bit_r<=‘1’;

END IF;

END IF;

END IF;

END PROCESS;

END;

4 结论与展望

直流电动机是一种常用的动力装置,广泛应用于伺服控制、数控机床、机器人等领域,随着现代工业的快速发展对直流电机控制系统的性能要求不断提高。这次设计是基于FPGA技术进行的,与传统控制方法相比,采用这种方法在电路集成度上具有明显的优势,因此,如果把这种方法应用于实际,在芯片功耗与体积上的优势也必然是其他控制方式无法比拟的。

直流电机的运行状态由其两个端口的高、低位状态共同决定,如果对直流电机两个端口进行直接控制,程序的复杂度将大大增加,而且容易发生冲突,在日后的维护,改良上也必将遇到巨大困难,这次设计采用PWM间接控制方式正是出于对这种问题的考虑。使用PWM进行控制,整个系统直观,简洁,从设计成果也可以看出,整个系统的核心就只有PWM模块和主控模块两个模块,而且每个模块只有区区几十行,简单易懂,逻辑清楚,显然符合设计要求。

这次虽然已经实现了对直流电机的基本控制功能,并且实现了对直流电机转动的基本计数功能,但是也有许多明显的不足。由于实验箱略显陈旧,并没有在硬件上对按键抖动加以处理,因此在程序上还需要加入按键消抖模块,由于所要使用的按键较多,导致了程序体积增大,对各个模块的连线有一定影响。

除此之外,在测速模块中,由于只设置了个位与十位两位,在计数上有较大限制,当直流电机的转速较快时,测速电路基本失去了其应有的作用,这个将在日后的设计中加以改进。

同时,由于时间仓促和硬件限制,这次设计并没有涉及到直流电机定速功能,定速功能是一个智能化较高,应用范围极广的功能,在这方面的空白不能不说是一大遗憾。就控制系统的应用而言,只对直流电机进行控制,而没有对更复杂一点的电机进行控制,这也是一个缺陷。

在未来的研究和学习中,我们将尽力弥补现在的不足,填补领域的空白,深化所学知识,锻炼应用能力,从而更好的适应多变的社会环境与日新月异的现代科技。

参考文献

[1] 潘志浪.基于FPGA的DDS信号源的设计[D].武汉:武汉理工大学信息工程学院,2007.

[2] 周立功,等.EDA实验与实践[M].北京:北京航空航天大学出版社,2007.

[3] 王美妮.基于FPGA的DDS的研究设计与实现[D].大连:大连海事大学,2006.

[4]
徐金龙,刘宇红,《基于DDS原理的任意波形信号发生器的设计》[M],现代机械,2000年

[5] 潘松 黄继业编著,《EDA技术实用教程》[M],科学技术出版,2005年

[6]陶东娅.
基于NiosII的直流电机PWM调速系统设计[D].杭州:浙江工业大学,2009年.

[7]李凡.基于FPGA的全数字无刷直流电机控制系统研究[D].重庆:重庆大学,2010年

[8]王毓银.《数字电路逻辑设计》[M],高等教育出版社,1999年

[9]田萍,刘新云;用VHDL语言实现数字系统[J];现代电子技术;2004年07期

[10]何西凤;黄念慈;;数字化通用PWM控制器的设计[J];电源技术应用;2006年05期

附 录

直流电机控制系统模块总体设计连接图

在这里插入图片描述

致 谢

四年的大学时光转瞬即逝,在这四年中,有过欣喜,有过悲伤,有过困惑,有过迷茫。在这四年里,我经历了许多,也学会了许多。这次毕业设计是对大学成果的一次检验,是对大学期间所学知识的一次综合应用。

在毕业设计期间,首先需要感谢的是解建侠老师的指导与帮助。解老师在学术上给予我悉心的指导,使我对FPGA的理解不断深化,不但巩固了以往所学的知识,而且学会了许多新技巧。对于我在设计中遇到的困难与迷惑,解老师总会耐心的分析指导,帮助我渡过一个个难关,是我完成毕业设计的最大保障。我会将老师的支持与鼓励铭记于心,使它成为我日后工作学习的动力。

同时,我还要感谢同组同学对我的帮助与启发。在平时的实验中,我们时常交换自己近期的研究设计成果,我在设计中的许多灵感与创新就是在此产生。在遇到各种难以预知的麻烦与困难时,也总是他们最先给予我帮助与鼓励,让我在失落、迷茫时感受到来自同学的温暖与支持。

最后,要感谢家人对我的无声的关注与奉献,没有家人的帮助,就不会有今天的我。在此,我衷心地感谢帮助过我的诸位。
,《基于DDS原理的任意波形信号发生器的设计》[M],现代机械,2000年

[5] 潘松 黄继业编著,《EDA技术实用教程》[M],科学技术出版,2005年

[6]陶东娅.
基于NiosII的直流电机PWM调速系统设计[D].杭州:浙江工业大学,2009年.

[7]李凡.基于FPGA的全数字无刷直流电机控制系统研究[D].重庆:重庆大学,2010年

[8]王毓银.《数字电路逻辑设计》[M],高等教育出版社,1999年

[9]田萍,刘新云;用VHDL语言实现数字系统[J];现代电子技术;2004年07期

[10]何西凤;黄念慈;;数字化通用PWM控制器的设计[J];电源技术应用;2006年05期

附 录

直流电机控制系统模块总体设计连接图

[外链图片转存中…(img-xUEdEoQ0-1618936139704)]

致 谢

四年的大学时光转瞬即逝,在这四年中,有过欣喜,有过悲伤,有过困惑,有过迷茫。在这四年里,我经历了许多,也学会了许多。这次毕业设计是对大学成果的一次检验,是对大学期间所学知识的一次综合应用。

在毕业设计期间,首先需要感谢的是解建侠老师的指导与帮助。解老师在学术上给予我悉心的指导,使我对FPGA的理解不断深化,不但巩固了以往所学的知识,而且学会了许多新技巧。对于我在设计中遇到的困难与迷惑,解老师总会耐心的分析指导,帮助我渡过一个个难关,是我完成毕业设计的最大保障。我会将老师的支持与鼓励铭记于心,使它成为我日后工作学习的动力。

同时,我还要感谢同组同学对我的帮助与启发。在平时的实验中,我们时常交换自己近期的研究设计成果,我在设计中的许多灵感与创新就是在此产生。在遇到各种难以预知的麻烦与困难时,也总是他们最先给予我帮助与鼓励,让我在失落、迷茫时感受到来自同学的温暖与支持。

最后,要感谢家人对我的无声的关注与奉献,没有家人的帮助,就不会有今天的我。在此,我衷心地感谢帮助过我的诸位。

  • 2
    点赞
  • 2
    评论
  • 13
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值