毕业设计基于FPGA的电机控制.doc_第1页
毕业设计基于FPGA的电机控制.doc_第2页
毕业设计基于FPGA的电机控制.doc_第3页
毕业设计基于FPGA的电机控制.doc_第4页
毕业设计基于FPGA的电机控制.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

基于FPGA的电机的控制 摘要:目前,电机在控制系统中的应用越来越广泛,由此凸现了电机控制的重要性。本文简单介绍了步进电机和伺服电机的原理和特点,并根据两种电机的不同特性设计了基于FPGA的不同的控制电路:以PWM变频来控制步进电机的转速;以调节脉冲的占空比大小改变输出电压的大小来控制伺服电机的转速。关键字:步进电机 伺服电机 电机控制 PWM 占空比 Design of the Motor-Control Based on FPGAAbstract: At present, the motor is playing a more and more important part in the application of auto-control system; It impels us continuously to study how to master the motor techniques. This paper simply introduced the principles and the characters of current-motor and step-motor; On the basis of those, we designed the driving circuit for both the current-motor and the step-motor based on FPGA:changing the frequency with PWM(脉宽调制电路) to control the speed of step-motor, changing the volume of output-voltage with adjusting the duty cycle (占空比) of impulses to control the speed of current-motor. Keyword: Step-motor Servo-motor Motor-control PWM Duty cycle目录第一章 总体设计.3第二章 单元电路设计.61.步进电机驱动电路设计.62.伺服电机驱动电路设计.6第三章 软件设计.7第四章 系统测试.9第五章 结论及参考文献.9第六章 附录.10一.总体设计1电机简介1.1.1.步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。不过步进电机在控制的精度、速度变化范围、低速性能方面都不如传统的闭环控制的直流伺服电动机,在精度不是需要特别高的场合就可以使用步进电机.1.1.2. 伺服电机可以把输入的电压信号变换成为轴上的角位移和角速度输出,在控制系统中,伺服系统是一种十分广泛应用的系统,伺服电机在系统中是用作执行元件,定子中的励磁磁通和转子中的电流相互作用时就会产生电磁转矩驱动电枢转动,恰当地控制转子中电枢的电流的方向和大小,就可以控制伺服电机的转动方向和转动速度,电枢电流为零时伺服电机则停止不动,不像步进电机需要用时序脉冲去驱动,还可以通过反馈形成闭环控制,达到较高的精度。实现更简单。2电机控制1.2.1.步进电机的控制:步进电机能够直接将数字脉冲信号转化成为角位移,不需要A/D 转换,所以被认为是理想的数控执行元件。1.2.1.1.步进电机的起动:步进电动机的最高起动频率(空载起动频率)一般为0.1KHz到3-4KHz,而最高运行频率则可以达到? KHz。以超过最高起动频率的频率直接起动,将出现失步现象,甚至无法起动。因此驱动步进电机时,应当先计算出电机不失步起动的最大频率,但其计算过程涉及参量复杂,鉴于我们不是机械专业学生,对其具体理论了解有限,故不能精确计算出空载起动频率,实际应用对起动段的处理是采用按直线拟合的方法,即阶梯升速法。可按两种情 图1 阶梯升速起动况处理,已知突跳频率则按突跳频率分段起动,分段数n=f/fq。未知突跳频率,则按段拟合至给定的起动频率,每段频率的递增量(后称阶梯频率)f=f/8,即采用8段拟合。在运行控制过程中,将起始的速度(频率)分为n分作为阶梯频率,采用阶梯升速法将速度连续升到所需要的速度,然后锁定,按预置的曲线运行。如图1所示。速度从V1V2如果是线性增加,则按给定的斜率升/降速;如果是突变,则按阶梯升速法处理。在此过程中要处理好两个问题: 速度转换时间应尽量短;为了缩短速度转换的时间,可以采用建立数据表的方法。,结合各曲线段的频率和各段间的阶梯频率便可以建立一个连续的数据表,并通过转换程序将其转换为脉冲速率。通过在不同的阶段调用相应的脉冲速率,控制电机的运行。保证控制速度的精确性;要从一个速度准确达到另外一个速度,就要建立一个校验机制,以防超过或未达到所需速度。1.2.1.2.步进电机的换向:步进电机通电换相这一过程称为脉冲分配。例如:四相步进电机的八拍工作方式,其各相通电顺序为A-AB-B-BC-C-CD-D-DA-A,通电控制脉冲必须严格按照这一顺序分别控制A、B、C、D相的通断。如果按给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。步进电机换向时,一定要在电机降速停止或降到突跳频率范围之内再换向,以免产生较大的冲击而损坏电机。换向信号一定要在前一个方向的最后一个CP脉冲结束后以及下一个方向的第一个CP脉冲前发出。如图3所示。对于CP脉冲的设计主要要求其有一定的脉冲宽度(一般不小于5s)、脉冲序列的均匀度及高低电平方式.1.2.1.3.步进电机的转速控制:步进电机的加/减速控制,实际上就是控制触发脉冲的频率,两个脉冲的间隔长短,决定了步进电机的转速。升速时,使脉冲频率增高,减速时,使脉冲频率降低。调整触发脉冲频率,就可以对步进电机进行调速。 1.2.2.伺服电机的控制:1.2.2.1.控制方案比较控制直流伺服电动机的转动方向比较简单,只需使驱动电路控制直流电源正接、反接,便可以达到对方向的控制。而电动机的转动速度则跟电机的电磁转矩有关。 (1.2.2.1) 式(1.2.2.1)中M即为电磁转矩,为磁通量,Ia为励磁电流;控制伺服电机速度的方法有两种:一种是改变电枢电压Ua即改变电枢电流Ia的方法;另一种是改变励磁电流If即改变磁通的方法。常用调节电枢电压的方法。对电动机电枢电压的调节电路、方案选择的不同,结果会有很大的差异。以下是电动机的驱动调速电路的方案选择。方案一:采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目的。但是电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。更主要的问题在于一般的电动机的电阻很小,但电流很大;分压不仅会降低效率,而且实现很困难。方案二:采用继电器对电机的开或关进行控制,通过开关的切换对电机的速度进行调节。这个方案的优点是电路较为简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短,可靠性不高。方案三:采用由晶体管功率放大器8050和8550组成的H型PWM电路。用FPGA控制晶体管功率放大器使之工作在占空比可调的开关状态,精确调整电动机的转速,这种电路由于工作在管子的饱和截止模式下,效率非常高;H型电路保证了可以简单的实现转速和方向的 控制;电子开关速度很快,稳定性也极强,是一种广泛应用的PWM调速技术。基于上述理论的分析,直流伺服电动机驱动的调速电路选用由晶体管功率放大器组成的H型PWM电路来实现。伺服电机控制闭环控制图: 图2 闭环速度控制系统1.2.2.2.PWM波的实现用FPGA产生PWM波具有频率稳定、运算速度快等优点。为了使得到的频率等步进变化,采用相位累加的方法。输出波形的频率可用式(1.2.2.2.2)算出。 (1.2.2.2.2)其中,fosc为晶振频率;k为分频系数,取k=200;N为相位累加器位数,取N10,计数范围即为01024;ff为相位累加器步长。我们采用的实验箱晶振为32MHz,初始状态ff=1,通过改变ff的值可以改变输出波形的频率。将k=3,N=10,fosc=32M代入式可得到频率步进为160Hz。可用式(1.2.2.2.3)计算频率: (1.2.2.2.3)可以看出,只要改变ff的值,就可以方便的改变频率,使其实现160Hz的等步进调频。本设计中设置了100档调节ff,从而实现了从20转/分到1800转/分每档约为20转的等步进调速。如果有需要,可以方便地修改程序,使其达到预定的要求,从而实现无级调速。电机控制总框图: 按键输入电机控制模块(FPGA最小系统)步进电机驱动电路步进电机LED(电机运行状态)add_s/sub_s/shift伺服电机驱动电路clk/cs_shift伺服电机add_c/sub_c/shift 图4 电机控制总框图二.单元电路设计2.1.步进电机驱动电路: 步进电机的驱动电路如图5所示,其驱动电路原理很简单。从FPGA出来的脉冲信图5 步进电机驱动电路号从J1接入按一定的顺序分别接到晶体管Q7Q10的基极,输出端则有四个相应的信号输出,并接到电机的1、4、3、6脚(注意:电机引出了六根线,只有1、4、3、6才是真正接电机的四相输入,且分别接电机的A、B、C、D相)。设脉冲信号Step1的输入信号是低电平,则输出就为高电平,相应的电机A相导通;反之,则A相不导通。以此类推,其余各相亦是如此。则电机在脉冲序列信号的作用下按预定方向转动,通过改变脉冲序列信号的快慢即频率来控制步进电机转速。2.2.伺服电机驱动电路:直流电动机PWM驱动电路的具体电路如图6所示,本电路是基于PWM原理的H型驱 图6 直流伺服电动机PWM驱动电路动电路。该电路采用晶体管功率放大器8050和8550,以满足电动机启动瞬间的大电流要求。当J1-6输入为PWM调制信号时,则J1-5输入为低电平,晶体管功率放大器Q1、Q4导通,Q2、Q3截止。Q1、Q4与电机DC-Motor一起形成一个回路,从而驱动电机正转。当J1-5输入为PWM调制信号时,则J1-6输入为低电平,晶体管功率放大器Q1、Q4截止,Q2、Q3导通,Q2、Q3与电机DC-Motor形成回路,驱动电机反转。一般控制系统电压统一为3.3V电源,因此若晶体管功率放大器的基极由控制系统直接控制,则控制电压最高为3.3V,在加上三极管本身的压降,加到电动机两端的电压就只有2.5V左右,减弱了电动机的驱动力。基于以上考虑,我们运用了4N25光耦集成块,将控制部分与电动机的驱动部分隔离开来,这样不仅增加了各系统模块之间的隔离度,也使驱动电流得到大大的加强。在此,光耦集成电路的电源VCC为9V,H型驱动电路中晶体管功率放大器Q3、Q6的发射极所加的电源为9V。两个电源利用光耦隔离开来,互不影响。 图7 电机驱动电路总电路图2.3.控制模块的设计: 总控制模块用VHDL语言对FPGA编程实现。总控制模块其实质是一个按键控制程序,共有reset复位键、add累加键、sub递减键、start/stop启动/停止键、CS-shift伺服/步进电机控制切换键、shift电机正反转控制键六个按键。系统启动时,首先运行系统初始化程序,程序先转到步进电机控制模块,送复位信号使步进电机处于初始状态,再转到伺服电机控制模块,送复位信号使伺服电机处于初始状态。系统运行时,默认运行伺服电机控制模块。其间主控程序不断检测按键,只要有键被按下则启动相应的子模块实现实时控制。具体程序代码见附录程序清单。 三.软件设计 3.1.程序流程图:控制模块的程序流程图如图8所示。开 始系统初始化检测按键是否按键?NY判断按键 步进电机 调整按键步进/伺服电机转换按键伺服电机调整按键步进进程?伺服进程?步进电机控制进程伺服电机控制进程NNYY 步进电机 驱动电路 伺服电机 驱动电路步进电机伺服电机 显示模块步进电机转速(圈/分)或伺服电机PWM波占空比 图8 控制模块程序流程图3.2.步进电机控制模块的设计:步进电机控制模块其程序设计共分按键去抖、变频、测频、步进、换向五个部分。模块一接收到按键信号,则按键去抖部分先对按键信号进行处理,得到稳定的控制信号;如果是变频信号则变频部分动作,通过相位累加模型,改变步进电机脉冲频率,并送给步进部分;如果是换向信号,则换向部分动作,为了使电机降速停止或降到突跳频率范围之内再换向,先停送驱动脉冲一秒,再送反向脉冲给步进部分,驱动电机换向;步进部分则是按照送来的脉冲频率和步进顺序信号驱动电机按预定的转速和转向转动;测频部分通过测定所送脉冲频率,再利用四相电机八拍运行时步距角为=360度/(50*8)=0.9度的尺度则可以计算出步进电机的每分钟转速数据,再送给显示模块显示。3.2.伺服电机控制模块的设计:伺服电机控制模块其程序设计共分为按键检测、按键去抖、PWM波产生、换向、占空比计数五个部分。按键检测部分检测到按键信号,则送至按键去抖部分处理后得到稳定的控制信号;在没有收到控制信号时,PWM波产生部分则按默认的设置产生PWM波,一旦收到控制信号,波形产生部分则根据按键为累加或递减信号来产生相应的PWM波脉冲,相应的,占空比计数部分则开始对输出脉冲计数, PWM信号占空比的初始值为50,通过对时钟进行计数,每计50个脉冲输出一个高电平,再过50个脉冲输出一个低电平。计数周期固定为100,如果占空比改变为51,那么来51个脉冲输出一个高电平,49个脉冲输出低电平;然后将占空比计数结果送显示模块显示;如果收到换向信号,则跟步进电机换向部分一样,先停送脉冲一秒,再送反向脉冲信号完成反向转动。四.系统测试4.1.使用仪器: 直流稳压电源: DC POWER SUPPLY DF1731SL2A,Zhong Ce Electronics CO., LTD; 数字万用表:UT101 MULTIMETER 金创电子仪器厂;FPGA实验仪:DP-FPGA, 广州致远电子有限公司; 电机实验仪:DP-51MOTOR,广州致远电子有限公司;4.2.测试结果: 问题1:电机不转,正反转指示灯不亮。原因:三极管管脚接错;解决办法:重接此只三极管; 问题2:电机不转,但正反转指示灯亮。原因:分压电阻过大,导致电机驱动电流过小;解决办法:根据电机驱动电流大小换分压电阻。 问题3:靠近电源接进口的三极管发热严重。 原因:电路设计与实践数据出现偏差,导致流过三极管的电流偏高. 解决办法:根据实测电路数据,修改电路原件. 经反复调试,现电路可按照按键输入准确控制电机运行.五.结论及参考文献5.1.结论:对直流伺服电机采用PWM脉冲方式控制,其功率损耗小,运行效率高,加减速性能好,尤其是在要求低速大转矩下连续运行的场合。伺服电机手步进电机控制相对简单,但要处理好启动、换向时的加速问题,否则容易产生“失步”现象,对电机造成不必要的冲击。5.2.参考文献:1.潘松,黄计业.EDA 技术实用教程m.北京:科学出版社.2002。2.黄智伟主编,王彦,陈文光,朱卫华编著.全国大学生电子设计竞赛训练教程M.北京:电 子工业出版社 2005.3.南华大学第六届全国电子设计竞赛全体参赛成员 .第六届电子大赛资料C(多谢老师提供).4. 王松武,蒋志坚.通用仪器【M】.哈尔滨:哈尔滨工程大学出版社.2002。5. 高吉祥.电子技术基础实验与课程设计【M】.北京:电子工业出版社.2002。六.附件6.1.元件清单:器件型号数量备注FPGA实验板1主控制器步进电机1伺服电机1整流桥2w101整流用电阻若干10K(2个),220K(2个),100欧/1W(4个),200欧(2个),470欧(2个)NPN三极管56092NPN三极管90132NPN三极管80504PNP三极管56102发光二极管2光电耦合器4N252二极管IN41484电源插孔1插针1信号接口电解电容1000uF/50V1瓷片电容33P1小车车架16.2.程序清单:-步进电机部分-/*ZTSD.VHD*/-换向模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity ztsd is Port (clk,key,rst:in std_logic; -系统时时钟/换向按键/复位信号 y:out std_logic ; -输出sel:out std_logic);end ztsd;architecture Behavioral of ztsd issignal sel1:std_logic;beginprocess(key,clk,rst) -产生换向延时秒脉冲variable cnt:integer range 0 to 32000000;beginif rst=0 then cnt:=0;elsif key=1 then cnt:=0;else if rising_edge(clk) then if cnt32000000 then cnt:=cnt+1;y=0;else cnt:=32000000;y=1;end if;end if;end if;end process;process(key,sel1,rst)beginif rst=0 then sel1=1;elsif rising_edge(key) then sel1=not sel1;end if;sel=7then clkk=not clkk;cnt:=0;else cnt:=cnt+1;end if;end if;end process;clkkk=clkk;process(clkk,sel,rst) -控制脉冲产生模块variable index:integer range 0 to 7:=0;beginif rst=0 then index:=0; elsif rising_edge(clkk) then if sel=1 thenif index=1 then index:=index-1;else index:=7;end if;end if;control0);signal clkkk:std_logic;signal clkk:std_logic:=0;signal data_ledin:std_logic_vector(3 downto 0);begincepin:block -测频模块beginprocess(clk,rst)variable cnt:integer range 1 to 32000000;beginif rst=0 then cnt:=1;elsif rising_edge(clk) then if cnt=32000000 then clkk0);variable cnt1:integer range 0 to 399;beginif rst=0 then cnt:=(others=0);cnt1:=0;elsif rising_edge(clk1) thenif clkk=1 thenif cnt1399 then cnt1:=cnt1+1;else cnt1:=0; if cnt(3 downto 0)9 thencnt(3 downto 0):=cnt(3 downto 0)+1;else cnt(3 downto 0):=0000;if cnt(7 downto 4)9 then cnt(7 downto 4):=cnt(7 downto 4)+1;else cnt(7 downto 4):=0000;if cnt(11 downto 8)9 then cnt(11 downto 8):=cnt(11 downto 8)+1;else cnt(11 downto 8):=0000;if cnt(15 downto 12)0) ;end if;end if;count=cnt;end process;end block;process(clkk)beginif clkkevent and clkk=0 then d2=count;end if;end process;process(clk,rst)variable cnt:integer range 0 to 79999:=0;beginif rst=0 then cnt:=0;elsif rising_edge(clk) then if cnt=79999 then clkkk=not clkkk;cnt:=0;else cnt:=cnt+1;end if;end if;end process;disp:block -转速显示模块beginprocess(clkkk,d2,rst)variable cnt:std_logic_vector(1 downto 0):=00;beginif rst=0 then cnt:=00;shift=1111;data_ledinshift=1110; data_ledinshift=1101; data_ledinshift=1011; data_ledinshift=0111; data_ledinshiftdata_leddata_leddata_leddata_leddata_leddata_leddata_leddata_leddata_leddata_leddata_led=11111111;-No signal; end case;end process;end block;end Behavioral;-/*BIANPIN.VHD*/-变频模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity bianpin is Port (rst,clk,sub,add:in std_logic; -复位信号/系统时钟/减速输入/加速输入 count:out std_logic ); -已变频率输出end bianpin;architecture Behavioral of bianpin issignal con:integer range 1 to 100:=50;signal clkk:std_logic:=0;signal cnt1:integer range 0 to 1100;beginprocess(clkk,add,sub,rst) -加减键处理模块variable con1:integer range 1 to 100:=50;beginif rst=0 then con1:=1;elsif clkkevent and clkk=1 then if add=0 then if con1=2 then con1:=con1-1;end if;end if;end if;con=1499999then clkk=not clkk;cnt:=0;else cnt:=cnt+1;end if;end if;end process;process(clk,con,cnt1,rst) -变频模块beginif rst=0 then cnt1=1000 then cnt1=0;count=0; elsif cnt1=con then count=1;cnt1=cnt1+con; else count=0;cnt1clk,key=sel,keyo=sel1);u2:bianpin port map (clk=clk,sub=sub,add=add,count=count1,rst=rst);u3:step_motor port map (clk=count1,sel=sel2,clkkk=y2,control=step1,rst=rst);u4:ztsd port map (clk=clk,key=sel1,y=y1,sel=sel2,rst=rst);u5:cepin port map (clk=clk,clk1=y2,shift=shift,data_led=data_led,rst=rst);u6:anjianqd port map (clk=clk,key=startstop,keyo=startstop1);step2(3)=step1(3) and y1;step2(2)=step1(2) and y1;step2(1)=step1(1) and y1;step2(0)=step1(0) and y1;step(3)=step2(3) and ss;step(2)=step2(2) and ss;step(1)=step2(1) and ss;step(0)ssssnull;end case;end process; end Behavioral;-伺服电机部分-/*ZTSDPWM.VHD*/-换向模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive co

温馨提示

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

评论

0/150

提交评论