基于FPGA的直流电机综合测控系统设计_第1页
基于FPGA的直流电机综合测控系统设计_第2页
基于FPGA的直流电机综合测控系统设计_第3页
基于FPGA的直流电机综合测控系统设计_第4页
基于FPGA的直流电机综合测控系统设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于FPGA的直流电机综合测控系统设计目录TOC\o"1-2"\h\u32231引言 摘要:随着直流电机在众多领域的广泛应用,其关键地位日益凸显。面对不断提升的高精度、高速度需求,深入研究直流电机的测控系统显得至关重要。传统的测控方案多依赖于单片机或者DSP,但这些方案在处理速度和外围电路复杂度方面等存在局限。本文设计了一种基于FPGA技术和QuartusII开发平台的直流电机测控系统。该系统采用自顶向下的设计方法,并运用VHDL语言对各个功能模块进行详细描述。通过计算机仿真和实验验证,该系统基本实现了直流电机的一种数字化PWM调速、测速、转向以及实时显示速度等功能,可实际应用于家电产品、交通工具和工业自动化设备等领域,为设备提供更为精确、稳定的控制。关键词:直流电机;FPGA;VHDL;PWM1引言选题的研究意义直流电机,作为一种关键的电力设备,因其高效率、良好的控制性能、快速的动态响应以及易于维护和维修等优势,使得在工业、民用等不同领域中得到了广泛应用。随着科技的进步和社会的发展,直流电机的研究和应用范围也在不断扩大。在工业领域,直流电机用于驱动各种机械设备;在交通领域,直流电机是电动汽车、电动公交车等交通工具的重要动力源;在日常生活领域,直流电机则广泛应用于风扇、洗衣机等家用器具。除了直流电机本身,研究的主要重点是其控制系统。直流电机控制系统能够实现精确控制电机的转速和转矩,从而提升生产效率和经济效益,使电机在运行过程中更加稳定可靠;能够通过控制电机的电压和电流,促进能源节约和减排。在当前技术更新迭代需求的背景下,对直流电机本身及其控制系统的深入研究不仅有助于提升其性能和应用范围,更能为社会的发展和进步作出积极的贡献。直流电机控制系统研究现状随着行业的不断进步,人们对电机系统的控制要求日益提高。目前市场较多的是采用单片机(MCU)和数字信号处理器(DSP)作为主控芯片。然而,单片机REF_Ref1560\r\h[1]受限于其内部结构和计算速度,难以应用先进的控制理论来完成高效的控制算法。相比之下,数字信号处理器REF_Ref25746\r\h[2]在算法实现方面具有一定优势,但外围电路复杂且易受到干扰,仍存在一些局限。随着可编程逻辑器件的发展,基于EDA技术的FPGA器件的开发应用可以从根本上解决所遇到的问题。通过硬件编程语言构建的FPGA内部硬件电路,不仅可以节省大量的模拟器件,降低功耗,提高可靠性,而且FPGA并行处理能力能显著提升系统的运行效率REF_Ref25821\r\h[3]。因此,FPGA作为主控芯片在实现直流电机控制系统中发挥着重要作用。本课题就是基于FPGA技术,致力于实现直流电机的测速与控制系统。电机控制器的控制算法经历了不断的发展与优化。经典的PID控制理论REF_Ref25929\r\h[4]难以对其进行精确的数学建模,这主要是因为存在大量的非线性干扰因素。为了提升电机的转速控制精度,当前常采用模糊PID转速控制算法。同时,采用FPGA和霍尔传感器相结合的方法,可以准确地测量出电机的电流和位置。国外学者也进一步对比研究发现,模型参考自适应控制来控制直流电机的转速表现出更优异的性能,也有基于FPGA的分数阶系统和PID控制器的设计REF_Ref24577\r\h[5,REF_Ref24603\r\h6]。国际上,已经公开发表了大量关于电机控制器集成方面的文章,也有许多采用EDA方法及FPGA器件实现的电机控制原理,如电压空间矢量PWM、基于矢量控制、直接转矩控制等REF_Ref27013\r\h[7]。2直流电机测控系统的方案设计2.1FPGA简介FPGA,即“fieldprogrammablegatearray”的英文缩写,其意为现场可编程门阵列,是由可编程逻辑块、可编程输入/输出块和可编程互连等结构组合而成。在开发的过程中,FPGA主要采用自顶向下的设计方法,从系统整体结构和功能入手,逐步细化至更低层次的模块和电路,以满足实际应用的需求。如图1所示,FPGA的开发流程主要包括设计输入、综合优化、适配、仿真验证、编程下载、硬件测试REF_Ref27072\r\h[8]。原理图/HDL文本编辑原理图/HDL文本编辑综合FPGA适配FPGA器件和电路系统时序与功能门级仿真FPAG编程下载逻辑综合器结构综合器功能仿真图1FPGA设计开发流程2.2调速方案设计直流电机的调速方法主要有以下几种:串电阻调速:借助在电枢外部串联电阻来调整电机的转速REF_Ref27118\r\h[9]。尽管此方法简单易行,但仅能分档调速,且效率较低,因为电阻会产生额外的能量损耗。变磁调速:通过改变电机主磁通量来调整转速。但其调速范围有限,动态响应速度相对较慢REF_Ref27118\r\h[9]。调压调速:利用电枢电压的变化,使电机转速发生变化。这种方法因其快速的动态响应特性,特别适合应用于需要平滑调速的系统中。通过对比分析,将第三种方法作为调速系统的控制方式。在该方案下,最常采用的是脉冲宽度调制法(PWM)。其基本原理是利用电机电枢电压的接通和断开的时间(占空比)的变化,对电机的运行速度进行精确地控制。只需按照一定的规律改变通电、断电的时间即可使电机的运行速度达到和保持平稳REF_Ref16843\r\h[10]。在脉冲宽度调制法中,改变占空比,即可改变一个周期内电枢两端的平均电压。设占空比为α,频率为F,高电平时间为t1,低电平时间为t2,则可得到如下关系: (1) (2)在PWM调速时,多采用保持周期T(或频率F)不变,同时改变t1和t2来调整占空比的方法。由式(2)可知,当t1时间越长,占空比越大,电机转速就越快。由式(1)可知,若只改变t1或t2,则在调速时,将改变PWM的频率。PWM的频率在机械固有频率附近会产生震荡。综上所述,通过采用电压调制并结合PWM调速方法,这样可以实现对直流电机转速的精确、高效控制,满足各种应用场景的需求。2.3测速方案设计直流电机的速度测量主要有两种方法:利用光电技术进行速度测量光电测速技术利用带有缺口的圆盘与光电管的结合来测量速度。当圆盘随直流电机旋转时,光电管接收脉冲信号。结合定时器和计数器,可以计算在特定时间内接收到的脉冲数量,进而得出电机的旋转速度。但这种方法对环境光线条件较为敏感,且圆盘缺口位置的变化可能引入测量误差。利用霍尔效应的速度测量方法而霍尔效应测速则利用磁场变化和霍尔电路的相互作用。当电动机转轴带动转盘边的磁钢旋转时,磁场强度随之变化。霍尔电路将这一变化转换为脉冲信号,并通过放大和整形处理输出矩形脉冲。电机转速的变化直接导致输出脉冲频率的改变,从而精确反映电机的旋转速度。该方法应用较多的是霍尔传感器REF_Ref17218\r\h[11],因其结构简单、体积小、价格适中且可靠性高而广受青睐。其出色的抗干扰能力使其能在各种环境条件下稳定运行。经过对比分析,本次系统设计决定采用霍尔传感器作为直流电机的测速元件。同时,结合FPGA器件上的脉冲计数功能,将能更准确地测量电机地转速。2.4系统整体设计基于FPGA的直流电机测控系统的整体设计框图如图2所示。整体电路由FPGA芯片控制,并由数码管显示电路、按键电路、驱动电路、测速电路和直流电机组成。而FPGA芯片的内置电路包括了时钟发生器、转向与启停控制模块、PWM控制模块以及测速模块。FPGAFPGA数码管显示数码管显示按键电路驱动电路M测速电路时钟发生器PWM控制模块测速模块转向、启停控制模块图2系统整体设计框图系统的工作过程为:在系统启动后,首先设定预期的运行状态,并将相应的信号发送到FPGA主控板。此时,PWM模块会生成特定的脉宽调制PWM控制信号REF_Ref25821\r\h[3],此信号通过电机驱动电路调节电机的工作状态。为了确保电机的稳定运行,系统会实时检测其运行状态。同时,测速电路会不断检测电机的实际速度,并将该速度信号反馈给FPGA。测速模块接收速度信号后,会进行计数处理,并通过数码管实时显示当前电机的转速,以此确保直流电机能以恒定的运行速度运行。当需要进行直流电机的调速控制时,加速按键按下时,PWM模块中控制信号占空比会增大,从而使电机加速转动;相反,减速按键按下时,控制信号占空比减小,电机则会减速转动REF_Ref17346\r\h[12]。在此过程中,系统还支持通过按键实现对电机的正反转控制。3主要功能模块设计在直流电机测控系统的功能设计过程中,选用的工具是Altra公司的QuartusⅡ软件,系统由FPGA芯片控制,其现场可编程门阵列器件采用CycloneⅣ系列的EP4CE6F17C8器件。QuartusⅡ软件以其全面的多平台设计环境满足了复杂设计的多样化需求,并且提供了丰富的芯片支持包,为设计过程提供了极大的便利。设计过程中,主要采用VHDL语言来编写系统程序,采用模块化设计理念,其将一个复杂的系统分解为若干个较小的、相对独立的模块,从而提高代码的可读性、维护性和复用性。本次设计涵盖了工作时钟模块、PWM控制电路、主控模块、电机测速系统、数码管译码模块、触发器模块以及消抖模块七大核心部分。3.1工作时钟模块3.1.1锁相环模块这主要由锁相环PLL模块担任,它能有效同步输入的时钟信号,并以其作为参考信号实现锁相。进而,模块可输出一至多个同步倍频或分频的片内时钟,满足系统应用REF_Ref27072\r\h[8]。本系统通过调用IP核使用PLL锁相环进行分频得到所需的时钟信号,如图3所示,其输入频率是50MHz,直接来自核心板上;输出一个频率:c0=4096Hz。图3锁相环PLL20模块3.1.2分频模块分频模块FP通过处理50MHz时钟信号,将其分频为1KHz和1Hz时钟。其中,1KHz的时钟被用作数码管译码模块的输入时钟,1Hz的时钟则为频率计控制模块提供了1秒的时间基准,如图4所示。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFPISPORT(CLK:INSTD_LOGIC;--50M输入时钟CLK1KHz:OUTSTD_LOGIC;--1kHz时钟信号CLK1Hz:OUTSTD_LOGIC);--1Hz时钟信号ENDFP;ARCHITECTUREONEOFFPISSIGNALclk_1KHz:STD_LOGIC;SIGNALclk_1Hz:STD_LOGIC;SIGNALc1:INTEGERRANGE0TO50000;SIGNALc2:INTEGERRANGE0TO10000;BEGINPROCESS(CLK)BEGIN --该部分输出1KHz的时钟信号IF(CLK'EVENTANDCLK='1')THENIF(c1>=24999)THEN--50M/1000=x,X/2-1=24999c1<=0;clk_1KHz<=NOT(clk_1KHz);--c1计数到24999,clk_1KHZ就翻转上一个值ELSEc1<=c1+1; --c1计数ENDIF;ENDIF;CLK1KHz<=clk_1KHz;ENDPROCESS;PROCESS(clk_1KHz)BEGIN --该部分输出1Hz的时钟信号IF(clk_1KHz'EVENTANDclk_1KHz='1')THENIF(c2>=499)THEN--1000/1=x,X/2-1=499c2<=0;clk_1Hz<=NOT(clk_1Hz);--c2计数到499,clk_1HZ就翻转上一个值ELSEc2<=c2+1; --c2计数ENDIF;ENDIF;CLK1Hz<=clk_1Hz;ENDPROCESS;ENDONE;图4分频模块3.2PWM控制电路PWM控制电路由PWM脉宽调制信号发生模块,8位计数器模块和速度控制模块组成。3.2.1PWM脉宽调制信号发生模块PWM脉宽调制信号发生模块SQU是FPGA内部负责生成PWM信号的专门电路,如图5所示,其中CIN[7..0]是来自8位计数器模块,为计数值,实际上形成了一种锯齿波信号,其频率即为PWM波的输出频率;ADR[7..0]来自速度控制模块的设定值。当计数值小于设定值时,OT=1;当计数值大于设定值,OT=0,由此产生周期性的PWM波形。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSQUISPORT(CIN:INSTD_LOGIC_VECTOR(7DOWNTO0);--计数值 ADR:INSTD_LOGIC_VECTOR(7DOWNTO0);--设定值 OT:OUTSTD_LOGIC);ENDSQU;ARCHITECTUREONEOFSQUISBEGINPROCESS(CIN) BEGIN IF(ADR<CIN)THENOT<='1'; ELSEOT<='0'; ENDIF;ENDPROCESS;ENDONE;图5PWM脉宽调制信号发生模块3.2.28位计数器模块8位计数器模块是产生PWM波的频率,如图6所示。当时钟信号CLK每一个上升沿,使得DOUT[7..0]的输出值递增1。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT8BISPORT(CLK:INSTD_LOGIC;--4096Hz的时钟信号DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCNT8B;ARCHITECTUREONEOFCNT8BISSIGNALQ1:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK) BEGIN IFCLK'EVENTANDCLK='1'THEN--时钟上升沿到来 Q1<=Q1+1; ENDIF;ENDPROCESS;DOUT<=Q1;ENDONE;图68位计数器模块3.2.3速度控制模块速度控制模块是按键控制直流电机的转速,如图7所示,其中按键key5被设定为控制档,当低电平时,代表加速档;当高电平时,代表减速档。此时再按下key4键,DOUT将输出当前的速度设定值,这一设定值会被PWM脉宽调制信号发生模块接收并作为CIN的值,同时LED输出显示设定的速度等级。模块部分程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysuduisport(key4,key5,key1:instd_logic;--key4、key5为按键输入信号,key1为系统复位信号 DOUT:outstd_logic_vector(7downto0);--计数设定值 LED:outstd_logic_vector(3downto0));--速度等级endsudu;architectureoneofsuduistypestatesis(st0,st1,st2,st3,st4,st5,st6,st7,st8,st9);signals:states;beginprocess(key1,key4,key5,s) begin ifkey1='0'thens<=st0; elsifkey4'eventandkey4='1'then--上升沿到来时 casesis --加减速设定 whenst0=>ifkey5='0'thens<=st1;elses<=st0;endif; whenst1=>ifkey5='0'thens<=st2;elses<=st0;endif; whenst2=>ifkey5='0'thens<=st3;elses<=st1;endif; whenst3=>ifkey5='0'thens<=st4;elses<=st2;endif; whenst4=>ifkey5='0'thens<=st5;elses<=st3;endif; whenst5=>ifkey5='0'thens<=st6;elses<=st4;endif; whenst6=>ifkey5='0'thens<=st7;elses<=st5;endif; whenst7=>ifkey5='0'thens<=st8;elses<=st6;endif; whenst8=>ifkey5='0'thens<=st9;elses<=st7;endif; whenst9=>ifkey5='0'thens<=st9;elses<=st8;endif; endcase; endif;endprocess;process(s) begin casesis --设置等级和计数设定值 whenst0=>DOUT<="00000000";LED<="0000"; whenst1=>DOUT<="00110111";LED<="0001"; whenst2=>DOUT<="00111001";LED<="0010"; whenst3=>DOUT<="00111101";LED<="0011"; whenst4=>DOUT<="01000100";LED<="0100"; whenst5=>DOUT<="01001101";LED<="0101"; whenst6=>DOUT<="01010100";LED<="0110"; whenst7=>DOUT<="01100010";LED<="0111"; whenst8=>DOUT<="01101001";LED<="1000"; whenst9=>DOUT<="01101101";LED<="1001"; endcase;endprocess;endone;图7速度控制模块3.3主控模块主控模块是控制直流电机转向和启/停,如图8所示,其中key2是按键控制电机启/停,SL是按键控制电机转向,M是PWM脉宽调制信号发生模块输出的PWM波。当将M赋值给M0时,为了电机正常运转,需要将M1设置为低电平,当按键第二次按下的时候,则把M赋值给M1,则M0应设置为低电平。如此反复的就实现了电机的正转,反转。当按键key2被按下时,则电机停止转动,当key2再次被按下时,则电机开始转动。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYkongzhiISPORT(SL,key2,M:INSTD_LOGIC;--SL为正反转按键,key2为启动停止按键M0,M1:OUTSTD_LOGIC);--输出控制电机ENDkongzhi;ARCHITECTUREONEOFkongzhiISTYPESTATESIS(S0,S1);--正反两种状态SIGNALc_state,next_state:STATES:=S0;BEGINPROCESS(SL) BEGIN IFSL='1'andSL'eventTHENc_state<=next_state;--按键按下,次态变为现态 ENDIF;ENDPROCESS;PROCESS(c_state,M) BEGIN IFkey2='0'THENM0<='0';M1<='0';--如果有低电平,那么M0,M1都为0,则电机不转 ELSE CASEc_stateIS WHENS0=>M0<=M;M1<='0';next_state<=S1; WHENS1=>M1<=M;M0<='0';next_state<=S0; ENDCASE; ENDIF;ENDPROCESS;ENDONE;图8主控模块3.4电机测速系统准确测量电机转速至关重要,它不仅能够直观反映电机的运行状态,更关键的是,它可以实现电机的闭环控制,即在设定好电机转速后,该系统能在负载变化时维持恒定的转速和输出功率REF_Ref27072\r\h[8]。该电机测速系统包括频率计控制模块、电机脉冲计数模块和锁存模块REF_Ref8764\r\h[13],如图9所示。这个系统设计是用来在1秒内准确记录输入的脉冲数量。图9电机测速系统的原理图3.4.1频率计控制模块频率计控制模块TF_CTRL产生测频控制信号的,如图9所示。此模块中,CNT_EN信号启动一个1秒宽度的周期性脉冲,同步激活频率计内的脉冲计数器CNT10D的启用端,并生成锁定存储信号LOCK。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTF_CTRLISPORT(CLK1HZ:INSTD_LOGIC;--1HZ时钟信号 CNT_EN:OUTSTD_LOGIC;--计数器时钟使能 CLR:OUTSTD_LOGIC; --计数器清零 LOCK:OUTSTD_LOGIC);--输出锁存信号ENDTF_CTRL;ARCHITECTUREONEOFTF_CTRLISSIGNALS:STD_LOGIC;BEGINPROCESS(CLK1HZ) BEGIN IFCLK1HZ'EVENTANDCLK1HZ='1'THEN S<=NOTS; ENDIF;ENDPROCESS;PROCESS(CLK1HZ,S) BEGIN IFCLK1HZ='0'ANDS='0'THENCLR<='1';--产生计数器清零信号 ELSECLR<='0'; ENDIF;ENDPROCESS;LOCK<=NOTS;CNT_EN<=S;ENDONE;3.4.2电机脉冲计数模块电机脉冲计数模块CNT10D,如图9所示。在enb为高电平时允许计数;低电平时停止计数,并保持当前的脉冲数。此模块是由三个十进制计数模块CNT10连接组合而成,如图10所示,CNT10程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10isPORT(CLK:instd_logic; --时钟信号 CLR:instd_logic; --清零信号 enb:instd_logic; --使能信号 Q:outstd_logic_vector(3downto0);--计数值 COUT:outstd_logic); --进位信号ENDCNT10;architectureoneofCNT10isbeginprocess(CLK,CLR,enb) variableQ0:std_logic_vector(3downto0); begin ifCLR='1'thenQ0:="0000"; --计数器异步复位 elsifCLK'eventandCLK='1'then--检测时钟上升沿 ifenb='1'then --检测是否允许计数 ifQ0<10thenQ0:=Q0+1;--允许计数,检测是否小于10 endif; endif; endif; ifQ0="1010"thenQ0:="0000";COUT<='1';--计数大于9,计数值清零,输出进位信号 elseCOUT<='0'; endif; Q<=Q0; endprocess;endone;图10电机脉冲计数模块内部原理图3.4.3锁存模块锁存模块LOCK12,如图9所示。锁存信号LOCK的上升沿会将计数器在前1秒的计数值锁定在LOCK12锁存器内,这样的设计能确保显示的稳定性,防止因周期性清零而产生的闪烁现象。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYLOCK12ISPORT(D:INSTD_LOGIC_VECTOR(11DOWNTO0);--速度输入信号 LK:INSTD_LOGIC; --锁存信号 LEDA:OUTSTD_LOGIC_VECTOR(3DOWNTO0); LEDB:OUTSTD_LOGIC_VECTOR(3DOWNTO0); LEDC:OUTSTD_LOGIC_VECTOR(3DOWNTO0) --速度输出信号,分别将值赋值给不同的数码管 );ENDLOCK12;ARCHITECTUREONEOFLOCK12ISBEGINPROCESS(LK,D)BEGIN IFLK'EVENTANDLK='1'THEN LEDA<=D(11DOWNTO8); LEDB<=D(7DOWNTO4); LEDC<=D(3DOWNTO0); ENDIF;ENDPROCESS;ENDONE;3.5数码管译码模块数码管译码模块:一是将电机测速系统中1s内产生的脉冲数经译码输出到数码管,实时显示电机转速;二是将PWM控制电路中通过按键设定的速度等级进行译码,并将结果显示在数码管上。如图11所示,模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDisplayIS--数码管译码模块PORT(CLK:INSTD_LOGIC;--1KHz时钟信号扫描数码管 A1:INSTD_LOGIC_VECTOR(3DOWNTO0); A2:INSTD_LOGIC_VECTOR(3DOWNTO0); A3:INSTD_LOGIC_VECTOR(3DOWNTO0); --电机的转速 DOUT:INSTD_LOGIC_VECTOR(3DOWNTO0);--速度等级SEG:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--段选信号DIG:OUTSTD_LOGIC_VECTOR(5DOWNTO0) --位选信号);ENDDisplay;ARCHITECTUREONEOFDisplayISSIGNALSEG1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)VARIABLEjishu:INTEGERRANGE0TO10;VARIABLEwx:STD_LOGIC_VECTOR(5DOWNTO0);BEGINIFRISING_EDGE(CLK)THENjishu:=jishu+1;IFjishu>3THENjishu:=0;ENDIF;CASEjishuIS WHEN0=>SEG1<=A3(3DOWNTO0);WHEN1=>SEG1<=A2(3DOWNTO0);WHEN2=>SEG1<=A1(3DOWNTO0); WHEN3=>SEG1<=DOUT(3DOWNTO0);WHENOTHERS=>jishu:=0;ENDCASE;CASEjishuIS --位选WHEN0=>wx:="110111";WHEN1=>wx:="101111"; WHEN2=>wx:="011111"; WHEN3=>wx:="111110";WHENOTHERS=>jishu:=0;ENDCASE;DIG<=wx;ENDIF;ENDPROCESS;PROCESS(SEG1)VARIABLEshuxin:STD_LOGIC_VECTOR(7DOWNTO0);BEGINCASESEG1IS 段选WHEN"0000"=>shuxin:="11000000";WHEN"0001"=>shuxin:="11111001";WHEN"0010"=>shuxin:="10100100";WHEN"0011"=>shuxin:="10110000";WHEN"0100"=>shuxin:="10011001";WHEN"0101"=>shuxin:="10010010";WHEN"0110"=>shuxin:="10000010";WHEN"0111"=>shuxin:="11111000";WHEN"1000"=>shuxin:="10000000";WHEN"1001"=>shuxin:="10010000"; WHENothers=>NULL;ENDCASE;SEG<=shuxin;ENDPROCESS;ENDONE;图11数码管译码模块3.6触发器模块在FPGA开发板上,按键的设计是以低电平触发为按下状态,松开按键则回到高电平状态。为了使按键按下时保持低电平,松开时保持高电平的需求,所以在按键后增加一个JK触发器模块,如图12所示,j、k接高电平,按键接CLK,可实现触发器的翻转功能,满足了按键状态转换的需求。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYjkffISPORT(j,k:INSTD_LOGIC; --输入信号 CLK:INSTD_LOGIC; --按键输入信号 Q,Qn:OUTSTD_LOGIC); --输出信号ENDjkff;ARCHITECTUREONEOFjkffISSIGNALQ1:STD_LOGIC;BEGINPROCESS(CLK) BEGIN IFCLK'EVENTANDCLK='1'THEN --按键按下时 IFj='1'ANDk='0'THENQ1<='0'; ELSIFj='0'ANDk='1'THENQ1<='1'; ELSIFj='1'ANDk='1'THENQ1<=NOTQ1; --Q1翻转 else Q1<=Q1; --Q1保持前一个状态 ENDIF; ENDIF;ENDPROCESS;Q<=Q1;Qn<=NOTQ1;ENDONE;图12JK触发器模块3.7消抖模块按键在闭合和断开的瞬间,往往会伴随一系列的抖动,如图13所示。这种现象可能会导致意外的输入或触发错误,为了避免这一问题,应当在按键之后接入一个消抖模块ERZP,如图14所示。此消抖模块采用的是定时方式去毛刺。系统中,当CLK计数达到12时,识别为有效的高电平状态,而当计数达到7时,则被视为有效的低电平状态。模块程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYERZPISPORT(CLK:INSTD_LOGIC;--时钟信号 KIN:INSTD_LOGIC;--按键输入信号KOUT:OUTSTD_LOGIC);--消抖后的输出信号ENDERZP;ARCHITECTUREONEOFERZPISSIGNALKINL,KINH:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK,KIN,KINL,KINH) BEGIN IFCLK'EVENTANDCLK='1'THEN--上升沿到来IF(KIN='0')THENKINL<=KINL+1;--低电平时计数ELSEKINL<="0000";ENDIF;IF(KIN='1')THENKINH<=KINH+1;--高电平时计数ELSEKINH<="0000";ENDIF;IF(KINH>"1100")THENKOUT<='1';--高电平计数为12时,输出高电平ELSIF(KINL>"0111")THENKOUT<='0';--低电平计数为7时,输出低电平ENDIF; ENDIF;ENDPROCESS;ENDONE;键按下键按下前沿抖动后沿抖动键稳定图13按键抖动图图14消抖模块3.8顶层模块连接顶层系统的设计就是在完成各模块的编译和仿真验证后,再编写一个顶层文件,将所有单元模块连接成一个完整的电路。经过编译和保存,最终得到了顶层文件的工作原理图。如图15所示,直流电机综合测控系统主要由工作时钟模块、电机测速系统、PWM控制电路、主控模块和数码管译码模块这五个部分组成,再结合每个按键后所需的消抖模块或者触发器模块共同形成完整的电路结构。其中主控模块的输入连接两个按键,分别控制电机启停和正反转,输出连接驱动模块。速度控制模块输入连接三个按键,控制电机的加减速和系统复位。数码管译码模块的输出连接三个数码管,三个数码管显示电机速度,一个数码管显示等级。图15顶层文件的原理图4系统外围电路设计4.1驱动电路驱动电路的核心设计依赖于控制芯片MX1919,它采用了高效的H桥电路结构REF_Ref17643\r\h[14],并结合了高可靠性的功率管技术,能够直接驱动线圈、步进电机和直流电机。MX1919通过主控芯片上的I/O接口接收控制指令,进而直接调整电源电压,实现对电机正反转、启动/停止及PWM速度的精确调控,其电路布局简洁,操作简便。整个驱动电路包括P1-P3排针、U1芯片、C1-C2电容、D1稳压管、R1电阻,如图16所示。其中,P1接供电电源,P2接开发板,P3接电机。该电路工作过程为:首先,外部提供的电源电压经过电源部分的转换,生成适用于驱动直流电机的电压和电流。随后,根据控制逻辑电路的指令,驱动部分将这些转换后的信号传递给直流电机。这些信号包含了电压和电流的大小及方向等关键参数,用以调控直流电机的运动状态。在此电路中,R1主要起限制电流的作用,而D1则负责维持电压稳定,通过串联的限流电阻来防止电流超过预设的安全阈值。然而,这种保护机制仅对单次过流有效,如果电流过大,可能导致雪崩击穿,从而引发短路。图16驱动电路原理图主要驱动芯片MX1919的控制功能如表1所示,INA1(或INA2)和INB1(或INB2)分别是1通道(或2通道)正转和反转逻辑输入;OUTA1(或OUTA2)和OUTB1(或OUTB2)分别是1通道(或2通道)正转和反转输出,控制电机。表1控制功能INAxINBxOUTAxOUTBx功能LLZZ停止HLHL正转LHLH反转HHLL刹车注:x代表1或者2。4.2测速电路测速电路的设计主要借助霍尔传感器ES3144REF_Ref17721\r\h[15]和LM393芯片。ES3144是一款基于双极半导体工艺制造的霍尔元件,其工作电压和温度适应范围广泛,特别适用于汽车、工业及家庭电器中的电子开关应用。LM393芯片是一种电压比较器,具有宽工作电压、低静态电流等特点,常被用于模拟与数字电路之间的转换和信号处理电路中。整个测速电路包括P1排针、U1芯片、U2霍尔传感器、C1-C2电容、R1-R6电阻、D1-D2的LED灯,如图17所示,其中P1接开发板。在此电路中,U2输出的信号如图18所示。该信号在U1中与2号引脚上的分压电阻产生的模拟电压比较后输出TTL高低电平,如图19所示。其中C1和C2为滤波电容:C1负责稳定电源输出,而C2则确保模拟信号的稳定。R2和R3起限制电流的作用。R4是一个上拉电阻,它不仅可以将不确定的信号固定在高电平,还起到了限流作用。图17测速电路原理图VtVtVt图18霍尔传感器的输出信号 图19经电压比较器的输出信号测速电路的核心原理在于采用频率测量法,即在特定的时间窗口内对信号进行计数,从而确定其频率,如图20所示。此方法基于电机旋转产生的脉冲数量n,在规定时间间隔内来测定转速REF_Ref17218\r\h[11]REF_Ref17218\r\h。值得注意的是,输出信号的强度取决于霍尔传感器在电机外部的安装位置。为了获得最佳的信号效果,需要通过实验来确定传感器的理想安装点REF_Ref17218\r\h[11]。每当直流电机的转轴完成一周的旋转,霍尔传感器会检测到磁钢的信号,并随之产生一个脉冲信号。这些脉冲信号经过放大和整形处理后,会转化为高低电平信号,随后被送往FPGA芯片进行计数。通过计数这些信号,我们能够精确地计算出直流电机的转速。FPGA信号源规定时间内计数FPGA信号源规定时间内计数图20测速原理图5实物测试与仿真5.1主要模块仿真5.1.1PWM控制电路(1)PWM脉宽调制发生模块ADR来源于8位计数器的输入计数值,CIN为按键输入的设定值,OT为输出值。为了确保稳定的波形观察,ADR被设定为从00000000计数至11111111,并在到达此值后循环重新开始,其整个计数周期固定为1ns。在图21中,CIN被设定为00011111。当ADR的值小于CIN时,OT输出高电平;当ADR的值达到或超过CIN时,OT则输出低电平。在整个过程中,OT输出的频率保持稳定,从而形成PWM波形。进一步观察图22和图23,随着OT设定值逐渐增加——分别设定为00111111和01111111,OT输出的高电平持续时间相应延长。这反映了PWM波的占空比随着设定值的增加而增大,进而导致电机速度的提升。图21PWM占空比12.16%的仿真图图22PWM占空比24.71%的仿真图图23PWM占空比49.80%的仿真图(2)速度控制模块key1为系统复位,key4和key5为按键输入,DOUT为输出信号,LED为输出的速度等级。从仿真图24看出,key1为低电平时,LED和DOUT信号均被清零。当key5为低电平时,即选择了加速档。此时每当key4上升沿触发时,LED从0000每次递增1,直至1001;DOUT信号会更新为LED当前显示等级所对应的设定值。当key5为高电平时,即选择了减速档,从图24中看出,此时每当key4上升沿触发时,LED从1001依次减1,最多减为0000;DOUT信号也会更新为LED当前显示等级所对应的设定值。图24速度控制模块仿真图5.1.2主控模块key2和SL为按键输入,分别控制电机的启停和正反转;M为PWM波的输入信号;M0和M1为输出信号,控制电机。当SL的上升沿第一次被检测到时,M1的输出与M同步,同时M0输出低电平;当SL的上升沿第二次被检测到时,M0的输出与M同步,M1则输出低电平。此过程中不断交替进行。当key2为低电平时,M0和M1均输出低电平。主控模块仿真波形如图25所示。图25主控模块仿真图5.1.3电机测速系统(1)频率计控制模块:CLK1HZ为1HZ的输入时钟信号;CNT_EN、CLR、LOCK为输出信号,分别为计数器时钟使能、计数器清零、锁存信号REF_Ref8764\r\h[13]。从仿真图26看出,为了展示波形,CLK1HZ时钟周期设置为80ns,与实际要求不同。在此设置下,CNT_EN、CLR和LOCK的输出周期均为160ns。每当CLK1HZ的上升沿出现时,CLR和LOCK的状态交替变化:第一次上升沿时,CNT_EN为高电平,LOCK为低电平;第二次上升沿时,CNT_EN变为低电平,LOCK变为高电平。当CNT_EN和CLK1HZ均为低电平时,CLR输出高电平,即产生清零信号。图26频率计控制模块仿真图(2)电机脉冲计数模块:CLK为输入的时钟信号,enb和CLR为输入信号,分别为计数使能信号和清零信号;q为计数输出信号。从仿真图27看出,当enb信号为高电平时,q随着CLK上升沿的到来进行递增计数;当enb信号为低电平时,q停止计数。当CLR信号为高电平时,则q=000000000000。当q的低4位值到达1001时,就向高位进1,q=000000010000,q的低4位值又从0000计数到1001,再次触发进位,q=000000100000。这一过程持续进行,形成一个有效的3位十进制计数器。图27电机脉冲计数模块仿真图(3)锁存模块:D和LK为输入信号,分别为电机转速计数值、锁存信号;LEDA、LEDB和LEDC为输出信号。从仿真图28看出,LK为高电平时,D中的计数值将被锁存,并且这个值会被分别赋值给三个输出信号。具体来说,D的高4位会赋给LEDA,中间4位赋给LEDB,低4位赋给LEDC。图28锁存模块仿真图5.1.4触发器模块CLK为按键输入,j、k为输入信号;Q、Qn为输出信号。为方便观察波形,CLK设定为固定周期80ns,从仿真图29看出,当j=1,k=0时,Q=0,Qn=1;当j=0,k=1时,Q=1,Qn=0;当j=1,k=1时,Q和Qn翻转上一个状态值;当j=0,k=0时,Q和Qn保持上一个状态值。图29触发器模块仿真图5.1.5消抖模块CLK为4096HZ的输入时钟信号,KIN为按键输入信号;KOUT为消抖后的输出信号。为了简化波形观察和分析,从仿真图30看出,设定CLK时钟周期为5ns,与实际要求不同。当KIN为高电平时,CLK的计数达到12时,KOUT会输出高电平;当KIN为低电平时,CLK的计数达到7时,KOUT会输出为低电平。图30消抖模块仿真图5.2结果测试在完成外围电路与FPGA开发板相关引脚的连接之后,通过下载器将已编写的程序烧录至芯片中,系统即可进入正常运行模式。此外,将生成的sof文件转化为jic文件,并通过JTAG接口将其下载

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论