EDA步进电机控制设计1_第1页
EDA步进电机控制设计1_第2页
EDA步进电机控制设计1_第3页
EDA步进电机控制设计1_第4页
EDA步进电机控制设计1_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

EDA步进电机控制设计EDA步进电机控制设计/EDA步进电机控制设计河南科技大学课程设计说明书课程名称EDA技术题目步进电机控制学院车辆及动力工程学院班级学生姓名指导教师日期EDA技术课程设计任务书班级:姓名:学号:设计题目:步进电机控制一、设计目的进一步巩固理论知识,培养所学理论知识在实际中的应用能力;掌握EDA设计的一般方法;熟悉一种EDA软件,掌握一般EDA系统的调试方法;利用EDA软件设计一个电子技术综合问题,培养VHDL编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础.二、设计任务(1)控制步进电机的启动和停止;(2)控制步进电机的正转和反转;(3)电机速度可调并显示转速;三、设计要求(1)通过对相应文献的收集、分析以及总结,给出相应课题的背景、意义及现状研究分析。(2)通过课题设计,掌握计算机组成原理的分析方法和设计方法。(3)学习按要求编写课程设计报告书,能正确阐述设计和实验结果。(4)学生应抱着严谨认真的态度积极投入到课程设计过程中,认真查阅相应文献以及实现,给出个人分析、设计以及实现。四、设计时间安排查找相关资料(1天)、设计并绘制系统原理图(2天)、编写VHDL程序(2天)、调试(2天)、编写设计报告(2天)和答辩(1天).1.江国强编著。EDA技术及实用(第三版).北京:电子工业出版社,2011。2。曹昕燕,周凤臣。EDA技术实验及课程设计.北京:清华大学出版社,2006.53.阎石主编。数字电子技术基础.北京:高等教育出版社,2003。4.MarkZwolinski.DigitalSystemDesignwithVHDL。北京:电子工业出版社,20085。AlanB。MarcovitzIntroductiontologicDesign。北京:电子工业出版社,2003指导教师签字:年月日步进电机控制摘要随着电子技术的发展,现场可编程门阵列FPGA和复杂可编程逻辑器件CPLD的出现,使得电子系统的设计者利用及器件相应的电子设计软件,在实验室里就可以设计自己的专用集成电路ASIC器件。其中电子设计自动化(EDA)的关键技术之一就是可以用硬件描述语言(HDL)来描述硬件电路。VHDL是用来描述从抽象到具体级别硬件的工业标准语言,它是由美国国防部在80年代开发的HDL,现在已成为IEEE承认的标准硬件描述语言。VHDL支持硬件的设计、验证、综合和测试,以及硬件设计数据的交换、维护、修改和硬件的实现,具有描述能力强、生命周期长、支持大规模设计的分解和已有设计的再利用等优点。利用VHDL这些优点和先进的EDA工具,根据具体的实际要求,将设计一个步进电机控制器电路。步进电机是一种将电脉冲转化为角位移的执行机构。也就是当步进驱动器接收到一个脉冲信号时,它就驱动步进电机按设定的方向转动一个固定的角度,它的旋转是以固定的角度一步一步运行的。现场可编程门阵列(FPGA)是对步进电机实现一体化控制的理想选择.目前,步进电机在控制系统中的应用越来越广泛,由此凸现了步进电机控制的重要性。本文简单介绍了步进电机的原理和特点,并根据步进电机的特性设计了基于FPGA的控制电路:以PWM变频来控制步进电机的转速。关键字:步进电机电机控制EDA技术目录TOC\o”1—3"\h\z\u第一章绪论§1.1步进电机简介步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。不过步进电机在控制的精度、速度变化范围、低速性能方面都不如传统的闭环控制的直流伺服电动机,在精度不是需要特别高的场合就可以使用步进电机。§1。2步进电机控制步进电机能够直接将数字脉冲信号转化成为角位移,不需要A/D转换,所以被认为是理想的数控执行元件。§1。2。1.步进电机的起动:步进电动机的最高起动频率(空载起动频率)一般为0。1KHz到3—4KHz,而最高运行频率则可以达到6KHz。以超过最高起动频率的频率直接起动,将出现"失步”现象,甚至无法起动.因此驱动步进电机时,应当先计算出电机不失步起动的最大频率,但其计算过程涉及参量复杂,鉴于我们对其具体理论了解有限,故不能精确计算出空载起动频率,实际应用对起动段的处理是采用按直线拟合的方法,即”阶梯升速法"。可按两种情图1。2.1阶梯升速起动况处理,①已知突跳频率则按突跳频率分段起动,分段数n=f/fq。②未知突跳频率,则按段拟合至给定的起动频率,每段频率的递增量(后称阶梯频率)△f=f/8,即采用8段拟合。在运行控制过程中,将起始的速度(频率)分为n分作为阶梯频率,采用"阶梯升速法”将速度连续升到所需要的速度,然后锁定,按预置的曲线运行.如图所示。速度从V1→V2如果是线性增加,则按给定的斜率升/降速;如果是突变,则按"阶梯升速法”处理。在此过程中要处理好两个问题:①速度转换时间应尽量短;为了缩短速度转换的时间,可以采用建立数据表的方法,结合各曲线段的频率和各段间的阶梯频率便可以建立一个连续的数据表,并通过转换程序将其转换为脉冲速率。通过在不同的阶段调用相应的脉冲速率,控制电机的运行.②保证控制速度的精确性;要从一个速度准确达到另外一个速度,就要建立一个校验机制,以防超过或未达到所需速度。§1。2。2。步进电机的换向:步进电机通电换相这一过程称为脉冲分配。例如:四相步进电机的八拍工作方式,其各相通电顺序为A—AB—B—BC-C-CD-D-DA-A,通电控制脉冲必须严格按照这一顺序分别控制A、B、C、D相的通断。如果按给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。步进电机换向时,一定要在电机降速停止或降到突跳频率范围之内再换向,以免产生较大的冲击而损坏电机。换向信号一定要在前一个方向的最后一个CP脉冲结束后以及下一个方向的第一个CP脉冲前发出.如图所示。对于CP脉冲的设计主要要求其有一定的脉冲宽度(一般不小于5μs)、脉冲序列的均匀度及高低电平方式。图1。2。2换向信号起作用的时刻§1.2.3.步进电机的转速控制:步进电机的加/减速控制,实际上就是控制触发脉冲的频率,两个脉冲的间隔长短,决定了步进电机的转速。升速时,使脉冲频率增高,减速时,使脉冲频率降低。调整触发脉冲频率,就可以对步进电机进行调速.

第二章总体设计§2。1步进电机驱动电路:步进电机的驱动电路如图所示,其驱动电路原理很简单。从FPGA出来的脉冲信图2.1步进电机驱动电路号从J1接入按一定的顺序分别接到晶体管Q7~Q10的基极,输出端则有四个相应的信号输出,并接到电机的1、4、3、6脚(注意:电机引出了六根线,只有1、4、3、6才是真正接电机的四相输入,且分别接电机的A、B、C、D相)。设脉冲信号Step1的输入信号是低电平,则输出就为高电平,相应的电机A相导通;反之,则A相不导通。以此类推,其余各相亦是如此。则电机在脉冲序列信号的作用下按预定方向转动,通过改变脉冲序列信号的快慢即频率来控制步进电机转速。§2。2控制模块的设计:总控制模块用VHDL语言对FPGA编程实现.总控制模块其实质是一个按键控制程序,共有reset复位键、add累加键、sub递减键、start/stop启动/停止键、shift电机正反转控制键五个按键。系统启动时,首先运行系统初始化程序,程序先转到步进电机控制模块,送复位信号使步进电机处于初始状态。其间主控程序不断检测按键,只要有键被按下则启动相应的子模块实现实时控制。具体程序代码见附录程序清单。§2.3程序流程图:控制模块的程序流程图如图所示.图2。3控制模块程序流程图§2.4步进电机控制模块的设计:步进电机控制模块其程序设计共分按键去抖、变频、测频、步进、换向五个部分。模块一接收到按键信号,则按键去抖部分先对按键信号进行处理,得到稳定的控制信号;如果是变频信号则变频部分动作,通过相位累加模型,改变步进电机脉冲频率,并送给步进部分;如果是换向信号,则换向部分动作,为了使电机降速停止或降到突跳频率范围之内再换向,先停送驱动脉冲一秒,再送反向脉冲给步进部分,驱动电机换向;步进部分则是按照送来的脉冲频率和步进顺序信号驱动电机按预定的转速和转向转动;测频部分通过测定所送脉冲频率,再利用四相电机八拍运行时步距角为θ=360度/(50*8)=0。9度的尺度则可以计算出步进电机的每分钟转速数据,再送给显示模块显示。

第三章系统程序及仿真§3。1总体设计电路图3。1总体设计电路接线图§3。2程序、程序块及仿真波形--/*ZTSD.VHD*/--换向模块libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE。STD_LOGIC_ARITH.ALL;useIEEE。STD_LOGIC_UNSIGNED。ALL;ENTITYztsdISPORT(clk,key,rst:inSTD_LOGIC;-—系统时钟/换向按键/复位信号 y:outSTD_LOGIC;--输出 sel:outSTD_LOGIC);ENDztsd;ARCHITECTUREBehavioralOFztsdISSIGNALsel1:STD_LOGIC;BEGINPROCESS(key,clk,rst)--产生换向延时秒脉冲VARIABLEcnt:integerrange0to32000000;BEGIN IFrst='0'THENcnt:=0; ELSIFkey='1’THENcnt:=0; ELSEIFrising_edge(clk)THEN IFcnt<32000000THENcnt:=cnt+1;y〈=’0’; ELSEcnt:=32000000;y<='1'; ENDIF; ENDIF; ENDIF;ENDPROCESS;PROCESS(key,sel1,rst)BEGIN IFrst='0’THENsel1<='1'; ELSIFrising_edge(key)THEN sel1〈=notsel1; ENDIF;sel<=sel1; ENDPROCESS;ENDBehavioral;图3.2。1图3.2。2—-/*STEP_MOTOR。VHD*/—-步进电机控制脉冲产生模块libraryIEEE;useIEEE。STD_LOGIC_1164。ALL;useIEEE。STD_LOGIC_ARITH.ALL;useIEEE。STD_LOGIC_UNSIGNED.ALL;ENTITYstep_motorISPORT(clk,rst:inSTD_LOGIC;——系统时钟/复位信号 sel:inSTD_LOGIC;-—正反转切换键 clkkk:outSTD_LOGIC;-—步进电机步进脉冲 control:outSTD_LOGIC_VECTOR(3DOWNTO0));—-步机电机四相输出ENDstep_motor;ARCHITECTUREBehavioralOFstep_motorISSIGNALclkk:STD_LOGIC;TYPEstepISarray(0to7)OFSTD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(clk,rst)-—电机运转脉冲分频模块VARIABLEcnt:integerrange0to1499999;BEGIN IFrst='0’THENcnt:=0; ELSIFclk’EVENTANDclk=’1'THEN IFcnt>=7 THENclkk〈=notclkk;cnt:=0; ELSEcnt:=cnt+1; ENDIF; ENDIF;ENDPROCESS;clkkk<=clkk;PROCESS(clkk,sel,rst)—-控制脉冲产生模块VARIABLEindex:integerrange0to7:=0;VARIABLEeight_step:step;BEGINeight_step(0):=”0001”;eight_step(1):="0011";eight_step(2):=”0010”;eight_step(3):="0110”;eight_step(4):=”0100";eight_step(5):=”1100";eight_step(6):=”1000";eight_step(7):="1001”; IFrst=’0’THENindex:=0; ELSIFrising_edge(clkk)THEN IFsel='1’THEN IFindex<=6THEN index:=index+1; ELSEindex:=0; ENDIF; ELSEIFindex〉=1THEN index:=index-1; ELSEindex:=7; ENDIF; ENDIF; control<=eight_step(index); ENDIF;ENDPROCESS;ENDBehavioral;图3。2.3图3。2。4--/*CEPIN.VHD*/--测频模块libraryIEEE;useIEEE。STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH。ALL;useIEEE。STD_LOGIC_UNSIGNED.ALL;ENTITYcepinISPORT(clk,clk1,rst:inSTD_LOGIC;——系统时钟/输入被测脉冲/复位信号 shift:outSTD_LOGIC_VECTOR(3DOWNTO0);--数码管位选信号 data_led:outSTD_LOGIC_VECTOR(7DOWNTO0));—-七段数码管ENDcepin;ARCHITECTUREBehavioralOFcepinISSIGNALcount,d2:STD_LOGIC_VECTOR(15DOWNTO0):=(others=〉’0');SIGNALclkkk:STD_LOGIC;SIGNALclkk:STD_LOGIC:='0';SIGNALdata_ledin:STD_LOGIC_VECTOR(3DOWNTO0);BEGINcepin:block--测频模块BEGINPROCESS(clk,rst)VARIABLEcnt:integerrange1to32000000;BEGIN IFrst=’0'THENcnt:=1; ELSIFrising_edge(clk)THEN IFcnt〉=32000000THEN clkk〈=notclkk; cnt:=1; ELSE cnt:=cnt+1; ENDIF; ENDIF;ENDPROCESS;PROCESS(clkk,clk1,rst)VARIABLEcnt:STD_LOGIC_VECTOR(15DOWNTO0):=(others=>'0');VARIABLEcnt1:integerrange0to399;BEGIN IFrst=’0’THENcnt:=(others=〉'0');cnt1:=0; ELSIFrising_edge(clk1)THEN IFclkk=’1’THEN IFcnt1<399THENcnt1:=cnt1+1; ELSEcnt1:=0; IFcnt(3DOWNTO0)<9THEN cnt(3DOWNTO0):=cnt(3DOWNTO0)+1; ELSEcnt(3DOWNTO0):=”0000"; IFcnt(7DOWNTO4)<9THEN cnt(7DOWNTO4):=cnt(7DOWNTO4)+1; ELSEcnt(7DOWNTO4):="0000”; IFcnt(11DOWNTO8)〈9THEN cnt(11DOWNTO8):=cnt(11DOWNTO8)+1; ELSEcnt(11DOWNTO8):="0000"; IFcnt(15DOWNTO12)〈9THEN cnt(15DOWNTO12):=cnt(15DOWNTO12)+1; ELSEcnt(15DOWNTO12):="0000"; ENDIF; ENDIF; ENDIF; ENDIF; ENDIF; ELSEcnt:=(others=>'0’); ENDIF; ENDIF;count<=cnt;ENDPROCESS;ENDblock;PROCESS(clkk)BEGINIFclkk’EVENTANDclkk='0'THENd2<=count;ENDIF;ENDPROCESS;PROCESS(clk,rst)VARIABLEcnt:integerrange0to79999:=0;BEGIN IFrst=’0’THENcnt:=0; ELSIFrising_edge(clk)THEN IFcnt=79999THENclkkk〈=notclkkk;cnt:=0; ELSEcnt:=cnt+1; ENDIF; ENDIF;ENDPROCESS;disp:block-—转速显示模块BEGIN PROCESS(clkkk,d2,rst) VARIABLEcnt:STD_LOGIC_VECTOR(1DOWNTO0):="00”; BEGIN IFrst='0’THENcnt:=”00";shift〈="1111”;data_ledin<=”1111”; ELSIFrising_edge(clkkk) THEN casecntIS WHEN”00”=>shift〈="1110"; data_ledin〈=d2(3DOWNTO0); cnt:=cnt+1; WHEN"01"=〉shift〈="1101”; data_ledin〈=d2(7DOWNTO4); cnt:=cnt+1; WHEN"10”=>shift<=”1011"; data_ledin<=d2(11DOWNTO8); cnt:=cnt+1; WHEN"11"=〉shift〈="0111”; data_ledin<=d2(15DOWNTO12); cnt:=”00"; WHENothers=〉shift<=”1111”;cnt:=”00”; ENDcase; ENDIF; ENDPROCESS;ENDblock;yima:blockBEGINPROCESS(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 WHENothers=〉data_led<=”11111111”;-—NoSIGNAL;ENDcase;ENDPROCESS;ENDblock;ENDBehavioral;图3。2.5图3.2.6--/*BIANPIN.VHD*/——变频模块libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE。STD_LOGIC_UNSIGNED。ALL;ENTITYbianpinISPORT(rst,clk,sub,add:inSTD_LOGIC;——复位信号/系统时钟/减速输入/加速输入 count:outSTD_LOGIC);--已变频率输出ENDbianpin;ARCHITECTUREBehavioralOFbianpinISSIGNALcon:integerrange1to100:=50;SIGNALclkk:STD_LOGIC:='0';SIGNALcnt1:integerrange0to1100;BEGINPROCESS(clkk,add,sub,rst)—-加减键处理模块VARIABLEcon1:integerrange1to100:=50;BEGIN IFrst='0'THENcon1:=1; ELSIFclkk'EVENTANDclkk=’1’THEN IFadd='0’THEN IFcon1〈=99THEN con1:=con1+1; ENDIF; ELSIFsub=’0'THEN IFcon1>=2THEN con1:=con1-1; ENDIF; ENDIF; ENDIF;con<=con1;ENDPROCESS;PROCESS(clk,rst)——产生按键检测频率VARIABLEcnt:integerrange0to1499999;BEGIN IFrst=’0’THENcnt:=0; ELSIFclk'EVENTANDclk=’1'THEN IFcnt〉=1499999 THENclkk<=notclkk;cnt:=0; ELSEcnt:=cnt+1; ENDIF; ENDIF;ENDPROCESS;PROCESS(clk,con,cnt1,rst)-—变频模块BEGIN IFrst='0'THENcnt1〈=0; ELSIFrising_edge(clk)THEN IFcnt1〉=1000THENcnt1<=0;count〈='0’; ELSIFcnt1<=conTHENcount〈='1';cnt1<=cnt1+con; ELSEcount〈=’0’;cnt1<=cnt1+con; ENDIF; ENDIF;ENDPROCESS;ENDBehavioral;图3.2.7图3。2。8—-/*ANJIANQD.VHD*/——按键去抖模块libraryIEEE;useIEEE。STD

温馨提示

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

评论

0/150

提交评论