步进电机控制器设计报告

更新时间:2024-01-08 16:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

常熟理工学院课程设计报告

步进电机控制器设计报告

1.绪言

在本次EDA课程设计中,我们组选择了做一个步进电机驱动程序的课题。对于步进电机我们以前并未接触过,它的工作原理是什么,它是如何工作的,我们应该如何控制它的转停,这都是我们迫切需要了解的。

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

步进电机及驱动电源是互相联系的整体。步进电机驱动电源框图如图1所示。变频信号源产生频率可调的脉冲信号,调节步进电机的速度。脉冲分配器则根据要求把脉冲信号按一定的逻辑关系加到脉冲放大器上,使步进电机按确定的运行方式工作。

感应子式步进电机以相数可分为:二相电机、三相电机、四相电机、五相电机等。以机座号(电机外径)可分为:42BYG(BYG 为感应子式步进电机代号)、57BYG、86BYG 、110BYG 、(国际标准), 而像70BYG 、90BYG 、130BYG 等均为国内标准。 1.1 驱动控制系统组成

使用、控制步进电机必须由环形脉冲,功率放大等组成的控制系统。 1.1.1 脉冲信号的产生

脉冲信号一般由单片机或CPU 产生,一般脉冲信号的占空比为0.3-0.4 左右,电机转速越高,占空比则越大。 1.1.2 信号分配

0

常熟理工学院课程设计报告

感应子式步进电机以二、四相电机为主,二相电机工作方式有二相四拍和二相八拍二种,具体分配如下:二相四拍为,步距角为1.8 度;二相八拍为,步距角为0.9 度。四相电机工作方式也有二种,四相四拍为AB-BC-CD-DA-AB,步距角为1.8 度;四相八拍为AB-B-BC-C-CD-D-AB,(步距角为0.9 度)。

2.课题要求

2.1 步进电机控制器设计

要求: (1) start为”1”时,步进电机转动。

start为”0”时,步进电机停转。 (2) 预设step_in为常数,当clk为上升沿,load和start为”1’加载时,

电机开始转动,转动step_in次后,停止转动。当下次符合此要求时将再次转动。

(3) 通过load,,step_in同步或异步载入steps值。

示意图如下:

图2

如图2所示,为步进电机控制器的输入输出示意图。 其中:

load为加载信号

start为步进电机启动信号 en为使能信号

reset为置位清零信号 clk为时钟信号

step_in[15..0]表示输入的十六位二进制数,其数值范围用十进制数表示为0-65535。

Coil_out[3..0]表示输出,共有A,B,A′,B′四种状态。

1

常熟理工学院课程设计报告

A,B,A′,B′四种转动状态可用图3表示,电机按下图A- B- A′- B′- A循环转动,每转过一次变换90度。当Coil_out[3..0]=“1000”,指针指向A;当Coil_out[3..0]=“0100”,指针指向B;当Coil_out[3..0]=“0010”,指针指向A′;当Coil_out[3..0]=“0001”,指针指向B′;当Coil_out[3..0]=“0000”,电机不工作。

图3

2.2 通过网络上收集资料,图书馆查阅书本,我们逐步了解了步进电机,了解它的基本工作原理后我们我们逐渐形成了一些驱动程序的基本构思,我们决定利用状态机的工作方式去编写步进电机的驱动。

3.方案设计与论证

3.1 状态机

关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态,状态机停止。

包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。在有限状态机中,会有有许多变量,例如,状态 机有很多与动作(actions)转换(Mealy机)或状态(摩尔机)关联的动作,多重起

2

常熟理工学院课程设计报告

始状态,基于没有输入符号的转换,或者指定符号和状态(非定有 限状态机)的多个转换,指派给接收状态(识别者)的一个或多个状态等等。

传统应用程序的控制流程基本是顺序的:遵循事先设定的逻辑,从头到尾地执行。很少有事件能改变标准执行流程;而且这些事件主要涉及异常情况。“命令行实用程序”是这种传统应用程序的典型例子。

另一类应用程序由外部发生的事件来驱动——换言之,事件在应用程序之外生成,无法由应用程序或程序员来控制。具体需要执行的代码取决于接收到的事件,或者它相对于其他事件的抵达时间。所以,控制流程既不能是顺序的,也不能是事先设定好的,因为它要依赖于外部事件。事件驱动的GUI应用程序是这种应用程序的典型例子,它们由命令和选择(也就是用户造成的事件)来驱动。 3.2 设计论证

利用状态机的工作原理来设计步进电机的控制程序。本课题要求需要输出五种状态,其中有四种转动状态,电机即按照此四种状态旋转,还有一种状态是用于保护电机,避免电机因通电过长而烧坏。 3.3

最初设计:按照由易及难的原则,即将steps值固定,使电机转动步数恒定,每次触发旋转则按照固定steps值转,转动steps值后停转。

二次修改:在设计好最初的目标程序后,我们有对程序进行改进,即增加了steps预设功能,在进行波形仿真的时候,可修改输入信号step_in的值(16位二进制数),从而改变步进电机的转动步数。

更高要求:(1)在电机停转之后,应使输出为零,即保持电机的电路电流为零,从而达到保护电机不被烧毁的目的。

(2)在电机停转之后,若再次启动旋转,则从上次停止的位置继续旋转,这是符合实际情况的仿真。

(3)在电机停转之后,利用PWM技术对电路进行控制。 3.4

鉴于以上要求,我们组经过一周左右时间利用VHDL语言设计出了符合课题要求的步进电机控制器程序(见附录)。

如下图4所示,为步进电机控制仿真波形图:

3

常熟理工学院课程设计报告

图4

图4中显示的是step_in值分别为10,8,12三种情况(16进制表示)时,Coil_out的输出情况,结果表明波形仿真与设计要求相符。

4. 总结与体会

在编写程序的过程中我们出现了很多这样那样的困难,但我们并没有气馁,而是认真的探讨研究,终于将其一一解决。

在编程的开始我们就遇到了麻烦,输入端口step_in是输入了一个16位的二进制数,为了下面计数简单一点需要将其转换为十进制数。开始我们打算用数据类型转换函数TO_INTEGER将STD_LOGIC_VECTOR转换成INTEGER,这需要调用DATAIO库,可在编译的时候提示找不到DATAIO库,我们只有放弃这一思路,另谋出入。在一次翻阅图书馆资料的时候我无意中发现了一个新思路,就是在实体的说明语句中直接将step_in定义为step_in:IN INTEGER RANGE 65535 TO 0,这样电脑可以将输入的二进制自动转换为十进制的。

步进值输入了,那就要开始计数,本来我们想用加法从0开始计数,但在编程实现这一想法的时候我们发现这样做需要考虑的因素太多了,实现起来也比较困难。所以有人提议我们试着用减法计数,我们照着做了,结果发现这样编确实很简单,而且程序也简洁明了。

4

常熟理工学院课程设计报告

在老师检查我们的程序的时候,老师发现了一个严重的漏洞,就是在转动steps停转后电机仍保持着当前状态,这样长时间通电会导致电机烧坏。我们思考了一会决定给状态机增加一个状态,就是停转的时候不给电机通电,在停转的时候给电机这样一个状态可以起到保护的作用。

在第二次给检查的时候,老师又发现了要改进的地方,那就是在转了一个步进值之后又给电机一个加载信号,使电机进行二次工作,此时应紧接着上一次的状态继续工作,而我们的却从“1000”状态重新开始的。经过反复思考,我们决定增加一个变量before_state,使之保留当前状态,即当current_state处于s0状态时, next_state<=s1,before_state〈=s0。这样我们就解决了这一问题。

在这次编程中还有一个最令人头痛的问题,我们这个课题有很多的输入,要使电机转动有很多的条件,这就用到很多的if语句,可是在嵌套使用的过程中总是有问题,电脑显示太复杂,经过无数次的调整,最后也被我们克服了。

在这次课程设计中,我们学到了关于EDA的很多其他知识点,对EDA有了更深的认识,扩展了知识面。同时我们也有很多的体会,课程设计是四人一组的,这就需要我们有着良好的团队合作意识,正是我们四个人的通力合作才顺利完成了本次课程设计,每个人在这次课程设计中都扮演着重要的角色,每段程序都凝结着我们智慧的结晶,正所谓“三个臭皮匠顶上一个诸葛亮”。我们遇到困难时,并没有退却,而是勇敢的面对,正是这种不怕困难的精神克服了一个又一个难点。老师在选题时曾说过,步进电机是比较有难度的,但这并未成为我们的阻力,反而成了我们不断超越的动力!总而言之,本次课程设计让我们受益匪浅!

5.参考文献

5.1 VHDL电路设计技术 王道宪主编。 5.2 电子技术基础实验 陈大钦等著。

5.3 EDA技术及应用(第二版) 谭会生、张昌凡编著。

5

常熟理工学院课程设计报告

附录:VHDL源程序代码

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY stepmotor IS

PORT(reset,clk,load,en,start:IN STD_LOGIC; step_in:IN INTEGER RANGE 65535 TO 0;

coil_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END stepmotor;

ARCHITECTURE ART OF stepmotor IS

TYPE FWM1 IS(s0,s1,s2,s3,s4);

SIGNAL current_state,next_state,before_state:FWM1; BEGIN

PROCESS(load,clk,en,start)IS

VARIABLE count:INTEGER RANGE 65535 TO 0; BEGIN

IF(load='1')THEN count:=step_in+1; ELSIF(reset='1')THEN current_state<=s4;

ELSIF(CLK'EVENT AND CLK='1')THEN

IF(count>0 AND start='1')THEN count:=count-1; IF(en='1')THEN

current_state<=next_state; END IF;

6

常熟理工学院课程设计报告

IF(count=0)THEN current_state<=s4; END IF; END IF; END IF; END PROCESS;

PROCESS(current_state)IS BEGIN

CASE current_state IS WHEN s0=>coil_out<=\next_state<=s1; before_state<=s0;

WHEN s1=> coil_out<=\next_state<=s2; before_state<=s1;

WHEN s2=>coil_out<=\next_state<=s3; before_state<=s2;

WHEN s3=> coil_out<=\next_state<=s0; before_state<=s3;

WHEN s4=> coil_out<=\next_state<=before_state; END CASE; END PROCESS; END ART;

7

本文来源:https://www.bwwdw.com/article/1kyo.html

Top