毕业设计(论文)-基于FPGA的电机控制_第1页
毕业设计(论文)-基于FPGA的电机控制_第2页
毕业设计(论文)-基于FPGA的电机控制_第3页
毕业设计(论文)-基于FPGA的电机控制_第4页
毕业设计(论文)-基于FPGA的电机控制_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计(论文)-基于FPGA的电机控制PAGEPAGE1基于FPGA的电机控制指导老师:设计了一个基于现场可编程门阵列(FPGA)的电机控制系统。简单介绍了步进电机和直流电机的工作原理和工作特点,并根据两种电机的不同特性设计了基于FPGA的不同的控制电路:以改变频率来控制步进电机的转速;调节脉冲的占空比大小改变输出电压的大小,从而达到控制直流电机的转速的目的。关键字:FPGA步进电机直流电机电机控制PWMDesignoftheMotor-ControlBasedonFPGAAbstract:theelectromotorcontrolsystemisdesignedbasedonFPGA.Thispapersimplyintroducestheprincipleandthecharacrersofcurrent-motorandstep-motor.Andwhat’smore,differentcontrolcircuitsbasedFPGAaredesignedaccorderingtothedifferentcharacteristicofcurrent-motorandstep-motor.Therotatespeedofstep-motoriscontrolledbychangingfrequency.Theoutput-voltagechangesaccorderingtotherateofimpulses,andsotheaimtocontroltherotateofcurrent-motorachieve.Keyword:step-motormotor-controlPWMFPGA目录1.系统设计…………………31.1功能介绍…………………31.2电机控制简介……………31.2.1步进电机的控制………31.2.2直流电机的控制………31.3总体设计方案………41.3.1总体设计思路…………41.3.2方案论证与比较…………………42.单元电路设计……………72.1.步进电机驱动电路……………72.2.直流电机驱动电路……………………83.软件设计……………………83.1实现方法……………………83.2程序流程图………………94.系统测试……………………105.结论及参考文献………105.1.结论:…………105.2.参考文献:……………………106.附控制转子中电枢的电流的方向和大小,就可以控制直流电动机的转动方向和转动速度。电枢电流为零时直流电机则停止不动。1.系统设计1.1功能简介一、基本功能(1)步进电机能够在四相八拍工作方式下连续运行。(2)能实现步进电机正\反转及速度变换。(3)能够实现直流电机的正反转及速度调节(4)显示电机工作状态1.2电机控制简介1.2.1步进电机的控制步进电机能够直接将数字脉冲信号转化成为角位移,不需要A/D转换,步进电机的空载启动频率一般较高,而运行频率相对来说较低,以超过空载频率启动将出现失步甚至无法启动。为了保证控制速度的精确性,要从一个速度准确达到另外一个速度,就要建立一个校验机制,以防超过或未达到所需速度.步进电机的脉冲分配:步进电机的脉冲分配是通过电机的通电换相来实现的。例如:四相步进电机的八拍工作方式,当电机正转时,其各相通电顺序为A-AB-B-BC-C-CD-D-DA-A,当电机反转时,其各相通电相序为A-AD-D-DC-C-CB-B-BA。步进电机换向时,一定要在电机降速停止或降到频率较低时才换向,以免产生较大的冲击而损坏电机。换向信号一定要在前一个方向的最后一个CP脉冲结束后以及下一个方向的第一个CP脉冲前发出。步进电机的转速控制:步进电机的转速控制实际上就是控制触发脉冲的频率。当脉冲的频率升高时,电机转速增加,当脉冲的频率降低时,电机的转速变慢。1.2.2直流电机具有很好的线性调速特性,简单的控制性能。控制直流电动机的转动方向比较简单,只需使驱动电路控制直流电源正接、反接,便可以达到对方向的控制。直流电机转速n的表达式为式中U--电枢端电压;I电枢电流;R--电枢电路总电阻;φ每极磁通量;K电机结构参数。由式可得,直流电机的转速控制方法可以分为两类:一类是对励磁通进行控制的厉磁控制法即改变磁通ф,一类是对电枢电压进行控制的电枢控制法即改变电枢电压U。现在一般采用后面一种方法。1.3总体设计方案1.3.1用于控制的电机是广州致远电子公司生产的电机实验仪:DP-51MOTOR(带有驱动电路,我们可以另外设计驱动电路)。为了实现对电机的控制,我们没有去做FPGA最小控制系统,而是直接采用F广州致远电子有限公FPGA实验仪:DP-FPGA。关键问题是如何产生对电机的控制信号。1.3.2一.控制部分的方案论证方案一、用逻辑电路实现。用定时芯片产生脉冲,用组合和时序电路实现对脉冲的分配及频率的调节。整个电路用到的分立元件较多,电路构成复杂,不易焊接,且电路的抗干扰能力较差。方案二:采用单片机作为核心控制部件。单片机设计控制电路省去了很多分立元器件。对于脉冲的产生及分配,频率的调节,转速及状态的改变都可以由单片机实现,不必再分别用分立元器件实现。但是按照给定的通电换相顺序,通过单片机的I/O向驱动电路发出控制脉冲,在电机的运行过程中要不停的产生控制脉冲,占用了大量的CPU时间,可能使单片机无法进行其它工作。方案三、用FPGA作控制部件,FPGA控制外围电路简单,整体性能好,有更好的稳定性好。精度高,抗干扰能力强。显然第三种方案具有更大的优越性,灵活性,经比较采用第三种方案。二.功率驱动电路的方案论证为了便于控制,我们把步进与直流电机的驱动电路做在一块PCB板子上。由于从FPGA的I/O中出来的电流较少,不足以驱动电机,或者能够驱动起来,但功率达不到要求。对于直流电机的驱动方案,有一个非常精典的驱动电路,不做过多论证。即采用由晶体管功率放大器8050和8550组成的H型PWM电路。用FPGA控制晶体管功率放大器使之工作在占空比可调的开关状态,精确调整电动机的转速,这种电路由于工作在管子的饱和截止模式下,效率非常高;H型电路保证了可以简单的实现转速和方向的控制;电子开关速度很快,稳定性也极强,是一种广泛应用的PWM调速技术。下面就步进电机的驱动作如下论证。方案一:单电压驱动。单电压驱动是指电机在工作时,只用一个电压源对绕组供电。如下图所示。步进电机单电压驱动它的特点是电路最简单。电路中的限流电阻R1决定了时间常数,但R1太大会使绕组供电电流减小。可在R1两端并联一个电容C,这样就可使电流的上升波形变陡,改善了高频特性。该电路一般只适用于小功率步进电机的驱动。方案二:斩波恒流驱动斩波驱动原理图T1是一个高频开关管,T2开关管的发射极接一只小电阻R0。以上的驱动过程表现为;T2每导通一次,T1导通多次,绕组的电流波形为:在T2导通的时间里,电源是脉冲式供电,提高了电源效率,并且能在效抑制共振。但是,由于电流波形为锯齿形,将会产生较大的电磁噪声。经比较,单电压驱动电路简单,比较适合小功率驱动,正好适合本设计的要求。所以采用方案一。经过上面的比较与论证,可以得出电机控制的总方框图LED显示LED显示直流电机直流驱动直流电机直流驱动FPGA最小FPGA最小系统按键步进驱动步进电机步进驱动步进电机2.单元电路设计2.1.步进电机驱动电路步进电机的驱动电路如下图所示,其驱动电路原理为:从FPGA出来的脉冲信号按一定的顺序分别接到晶体管Q3Q6的基极,四个8050的集电极分别有四个相应的信号输出,并接到电机的1、4、3、6脚,2、5脚接高电平。我们要求的电机的工作方式为四相八拍。正转各相通电顺序为A-AB-B-BC-C-CD-D-DA-A,则只要依次通1110-1100-1101-1001-1011-0011-0111-0110-1110脉冲序列。反转也可以此类推。则电机在脉冲序列信号的作用下按预定方向转动,通过改变脉冲序列信号的快慢即频率来控制步进电机转速。步进电机驱动原理图2.2.直流电机驱动电路直流电机驱动原理图P1为直流电机的选择信号,即直流电机的总控制信号。当P1为高电平时,就是让直流电机处于工作状态。当P2输入为低电平,P3输入为高电平时,晶体管功率放大器Q2、Q5导通,Q3、Q4截止。Q2、Q5与电机J10一起形成一个回路。从而驱动电机正转。当P2输入为高电平,P3输入为低电平时,晶体管功率放大器Q2、Q5截止,Q3、Q4导通,Q3、Q4与电机J10形成回路,驱动电机反转。从FPGA的I/O口中输出的电压只有3.3V,若功放管的基极直接与FPGA的I/O口相连,则控制电压最高为3.3V,再加上晶体管本身的压降,加到电动机两端的电压就更少了,电动机的驱动力明显不够.。因此,我们运用了TLP521-2光耦集成芯片,将控制部分与电机的驱动部分隔离开来,这样不仅增加了各系统模块之间的隔离度,也使驱动电流得到大大的加强。3.软件设计3.1实现方法总控制模块是采用VHDL语言在DP-FPGA实验板上编程。通过对各个按键的选择来实现各种功能。总的控制模块就是一个对不同按键的响应程序。共有复位RESET键,步进与直流电机选择SLECT键,正反选择SHIFT键,速度选择SPEED键四个按键3.2程序流程图开始开始程序初始化程序初始化扫描按键扫描按键是否有键按下 N是否有键按下 Y按键处理程序按键处理程序直流电机控制进程步进电机控制进程直流电机控制进程步进电机控制进程直流驱动模块步进驱动模块直流驱动模块步进驱动模块LED显示LED显示步进电机的转速或者频率直流电机步进电机直流电机步进电机 4.系统测试4.1.使用仪器:FPGA实验仪:DP-FPGA,广州致远电子有限公司电机实验仪:DP-51MOTOR,广州致远电子有限公司数字万用表:UT101MULTIMETER金创电子仪器厂直流稳压电源:DCPOWERSUPPLYDF1731SL2A,ZhongCeElectronicsCO.,LTD5.结论及参考文献5.1.结论:步进电机控制的控制通过程序较易实现,但要注意其起动时的频率不能太大,否则易产生失步,甚至根本起动不起来。步进电机的转速越快,其转矩将越小。5.2.参考文献:1王晓明电动机的单片机控制北京:北京航空航天大学出版社2002年第一版2.潘松,黄继业.EDA技术实用教程[m].北京:科学出版社.20023.黄智伟全国大学生电子设计竞赛训练教程北京:电子工业出版社2005年第一版4.南华大学第六届全国电子设计竞赛全体参赛成员.第六届电子大赛资料6.附录libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entitytopisPort(clk:instd_logic; reset:instd_logic;1为复位 0开启 button1:instd_logic; 速度选择 button2:instd_logic; 正反选择control:outstd_logic_vector(3downto0);四相电机输入信号 buzzer:outstd_logic; 报警信号 cs:outstd_logic; 数码管选中 shift:outstd_logic_vector(3downto0);数码管位选信号 data_led:outstd_logic_vector(7downto0));数码管数据endtop;architectureBehavioraloftopiscomponentkeyisPort(reset:instd_logic;输入复位信号 clk:instd_logic; button1:instd_logic; 输入速度按键信号 button2:instd_logic; 输入正反转按键信号 speed:outstd_logic_vector(2downto0);速度数据输出端 sel:outstd_logic_vector(1downto0));正反转信号输出端endcomponent;componentmcfpisPort(pwm_clk:instd_logic;速度控制脉冲 clk:instd_logic; reset:instd_logic; sel:instd_logic_vector(1downto0);正反转 qs:outstd_logic;control:outstd_logic_vector(3downto0));endcomponent;componentmcfsisPort(clk:instd_logic; reset:instd_logic; speed:instd_logic_vector(2downto0); pwm_clk:outstd_logic);endcomponent;componentjishuisPort(reset:instd_logic; qs:instd_logic; sel:instd_logic_vector(1downto0); alarm:outstd_logic; shuju1:outstd_logic_vector(7downto0); shuju2:outstd_logic_vector(7downto0));endcomponent;componentbaojinisPort(clk:instd_logic; alarm:instd_logic; buzzer:outstd_logic);endcomponent;componentxsisPort(clk:instd_logic; reset:instd_logic; shuju1:instd_logic_vector(7downto0); shuju2:instd_logic_vector(7downto0); cs:outstd_logic; shift:outstd_logic_vector(3downto0); data_led:outstd_logic_vector(7downto0));endcomponent;signalload1:std_logic_vector(2downto0);signalload2:std_logic;signalload3:std_logic_vector(1downto0);signalload4:std_logic;signalload5:std_logic;signalload6:std_logic_vector(7downto0);signalload7:std_logic_vector(7downto0);beginu1:keyportmap(reset=>reset,clk=>clk,button1=>button1,button2=>button2,speed=>load1,sel=>load3);u2:mcfsportmap(clk=>clk,reset=>reset,speed=>load1,pwm_clk=>load2);u3:mcfpportmap(pwm_clk=>load2,clk=>clk,reset=>reset,sel=>load3,control=>control,qs=>load4);u4:jishuportmap(reset=>reset,qs=>load4,sel=>load3,alarm=>load5,shuju1=>load6,shuju2=>load7);u5:baojinportmap(clk=>clk,alarm=>load5,buzzer=>buzzer);u6:xsportmap(clk=>clk,reset=>reset,shuju1=>load6,shuju2=>load7,cs=>cs,shift=>shift,data_led=>data_led);endBehavioral;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entitybaojinisPort(clk:instd_logic; alarm:instd_logic; buzzer:outstd_logic);endbaojin;architectureBehavioralofbaojinissignalc:std_logic;beginprocess(clk,alarm,c)variablecnt:integerrange0to50000; beginifclk'eventandclk='1'thencnt:=cnt+1;ifcnt<25000thenc<='1'; elsifcnt<50000thenc<='0'; elsecnt:=0;c<='0';endif; endif;ifalarm='1'thenbuzzer<=c;elsebuzzer<='0';endif;endprocess;endBehavioral;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entityjishuisPort(reset:instd_logic; qs:instd_logic;1个八拍信号 sel:instd_logic_vector(1downto0); 01正转10反转 alarm:outstd_logic;报警信号 shuju1:outstd_logic_vector(7downto0); shuju2:outstd_logic_vector(7downto0));endjishu;architectureBehavioralofjishuissignalc1,c2:std_logic;beginprocess(qs)variablecnt:integerrange0to50;beginifrising_edge(qs)then cnt:=cnt+1; ifcnt=50then cnt:=0;alarm<='1';c1<='1'; elsealarm<='0';c1<='0'; endif; endif;endprocess;process(reset,c1,sel)variablecnt:std_logic_vector(7downto0):="00000000";beginifreset='1'thenshuju1<="00000000";elsifrising_edge(c1)then ifsel="01"then ifcnt(3downto0)>="1001"then cnt(3downto0):="0000"; cnt(7downto4):=cnt(7downto4)+1; elsecnt(3downto0):=cnt(3downto0)+1; endif; ifcnt>"10011001"then cnt:="00000000";c2<='1'; elsec2<='0'; endif;endif; ifsel="10"then ifcnt(3downto0)="0000"then cnt(3downto0):="1001"; cnt(7downto4):=cnt(7downto4)-1; elsecnt(3downto0):=cnt(3downto0)-1; endif; ifcnt<="00000000"then cnt:="10011001";c2<='1';elsec2<='0'; endif; endif; endif;shuju1<=cnt;endprocess;process(reset,c2)variablecnt:std_logic_vector(7downto0):="00000000";beginifreset='1'thenshuju2<="00000000";elsifrising_edge(c2)then ifsel="01"then ifcnt(3downto0)>="1001"then cnt(3downto0):="0000"; cnt(7downto4):=cnt(7downto4)+1; elsecnt(3downto0):=cnt(3downto0)+1; endif; ifcnt>"10011001"then cnt:="00000000"; endif; endif;ifsel="10"then ifcnt(3downto0)="0000"then cnt(3downto0):="1001"; cnt(7downto4):=cnt(7downto4)-1; elsecnt(3downto0):=cnt(3downto0)-1; endif; ifcnt<="00000000"then cnt:="10011001"; endif; endif; endif;shuju2<=cnt;endprocess;endBehavioral;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entitymcfsisPort(clk:instd_logic; reset:instd_logic; speed:instd_logic_vector(2downto0); pwm_clk:outstd_logic); endmcfs;architectureBehavioralofmcfsissignalcoefficentl,coefficenth:integer;beginprocess(speed)begincasespeedis when"001"=>coefficentl<=500000;coefficenth<=1000000;50hz when"010" =>coefficentl<=166666;coefficenth<=333333;150hz when"011" =>coefficentl<=250000;coefficenth<=500000;200hz whenothers=>coefficentl<=2500000;coefficenth<=5000000;10hz endcase;endprocess;process(clk,reset,coefficentl,coefficenth)variablecnt:integer;beginifreset='1'then cnt:=0;pwm_clk<='1';elsifclk'eventandclk='1'thencnt:=cnt+1; ifcnt<coefficentlthen pwm_clk<='1'; elsifcnt<coefficenththen pwm_clk<='0';elsepwm_clk<='0';cnt:=0; endif; endif;endprocess;endBehavioral; libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entityxsisPort(clk:instd_logic; reset:instd_logic; shuju1:instd_logic_vector(7downto0); shuju2:instd_logic_vector(7downto0); cs:outstd_logic; shift:outstd_logic_vector(3downto0); data_led:outstd_logic_vector(7downto0));endxs;architectureBehavioralofxsissignalclk_shift:std_logic;signaldata_ledin:std_logic_vector(3downto0);beginprocess(clk,reset)variablecnt:integerrange0to50000;beginifreset='1'then cnt:=0; elsifclk'eventandclk='1'then cnt:=cnt+1; ifcnt=24999then clk_shift<=notclk_shift; cnt:=0;endif;endif;endprocess;process(clk_shift,reset)variablecnt:std_logic_vector(1downto0);beginifreset='1'thencnt:="00"; cs<='1'; shift<="1111"; data_ledin<="1111";elsifclk_shift'eventandclk_shift='1'then casecntis when"00"=> cs<='1'; shift<="1110"; data_ledin<=shuju1(3downto0); cnt:=cnt+1; when"01"=> cs<='1'; shift<="1101"; data_ledin<=shuju1(7downto4); cnt:=cnt+1; when"10"=> cs<='1'; shift<="1011"; data_ledin<=shuju2(3downto0); cnt:=cnt+1; when"11"=> cs<='1'; shift<="0111"; data_ledin<=shuju2(7downto4); cnt:="00"; whenothers=> cs<='1'; shift<="1111"; data_ledin<="1111"; endcase; endif;endprocess;process(data_ledin)--译码begincasedata_lediniswhen"0000"=>data_led<="11000000";--0 when"0001"=>data_led<="11111001";--1 when"0010"=>data_led<="10100100";--2 when"0011"=>data_led<="10110000";--3 when"0100"=>data_led<="10011001";--4 when"0101"=>data_led<="10010010";--5 when"0110"=>data_led<="10000010";--6 when"0111"=>data_led<="11111000";--7 when"1000"=>data_led<="10000000";--8 when"1001"=>data_led<="10010000";--9 when"1010"=>data_led<="11000000"; whenothers=>data_led<="11111111";--Nosignal;endcase;endprocess;endBehavioral;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--Uncommentthefollowinglinestousethedeclarationsthatare--providedforinstantiatingXilinxprimitivecomponents.--libraryUNISIM;--useUNISIM.VComponents.all;entitymcfpisPort(pwm_clk:instd_logic; clk:instd_logic; reset:instd_logic; sel:instd_logic_vector(1downto0);正反转信号1为正转0为反转 control:outstd_logic_vector(3downto0); qs:outstd_logic);endmcfp;architectureBehavioralofmcfpistypestatesis(st0,st1,st2,st3,st4,st5,st6,st7);signalstx:states;四相八拍通电方式beginprocess(clk,reset,sel)beginifreset='1'thenstx<=st0;elsifclk'eventandclk='1'then casestxiswhenst0=>ifpwm_clk='0'then ifsel="01"thenstx<=st1; elsifsel="10"thenstx<=st7; elsestx<=st0; endif; endif;whenst1=>ifpwm_clk='1'then

温馨提示

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

评论

0/150

提交评论