这篇应用笔记描述怎样去实现步进电机的线速度控制,步进电机是一个电磁设备将数字脉冲转换为机械轴转动,使用这种电机有很多优点,例如因为没有电刷与触点存在所以使用跟简单、低成本、高可靠性、低速时转矩大、运动精度高,许多具有步进电机的系统在改变速度的时候需要控制加速度/减速度,这个应用笔记提供一个演示程序,能够控制减速度以及位置和速度
这种线性速度控制是基于2005年1月“嵌入式系统编程”提出的一种算法,D. Austin的一篇“实时生成步进电机速度曲线”文章。该算法只使用简单的定点算术运算没有数据表,可以实时地进行参数化和计算。
本应用笔记涵盖了步进电机线速度斜坡控制原理以及控制器本身的实现,假定读者熟悉基本的步进电机操作,但将给出最相关主题的摘要,更多关于步进电机的内容可以在“D. W. Jones,步进电机控制.”找到
两种常见的步进电动机类型是双极电动机和单极电动机。双极和单极电机是相似的,除了单极在每个绕组上有一个中心抽头,如下图所示
双极型步进电机需要电流在两个方向上通过绕组驱动,需要一个完整的桥驱动器,如下图,单极步进电机允许一个更简单的驱动电路,如下图,限制电流向一个方向流动,单极步进电机的主要缺点是有限的能力去激励所有的绕组,导致较低的扭矩,单极步进电机可以通过断开中心抽头当做双极步进电机使用
步进电机使用全步进模式逐次上电每个绕组,这样有四种不同的设置,在下表中Full-stepping行显示,通过同时驱动两个绕组,步进电机被困在全步的中间位置,也就是我们所知的半步,这给出了8个位置,如下表中的Half-stepping行显示,当为两个绕组供电时,转矩比一个绕组高出约1.4倍,但是以两倍的功耗为代价,一个机械周期通常包括一系列电气周期
步进电机的一个缺点是高速时转矩有限,因为步进电机的转矩随着速度的增加而减小,步进电机在达到谐振速度时转矩也会降低,如下图,谐振速度取决于步进电机的驱动方案和负载(T=转矩,w=速度)
为了使步进电机转动,通过绕组的电流必须以正确的顺序改变,当输入脉冲(步进电机脉冲)和方向信号时输出以正确的脉冲序列
为了使步进电机以恒定的速度旋转,必须以稳定的速率产生脉冲,如下图
一个计数器用于产生这些脉冲,运行频率:f [HZ]
计数器c产生延时:
步进电机的角度、位置、速度由以下公式计算:
spr是一圈的步数,n是单钱步数,1弧度/秒=9.55转
为了平稳的启动和停止步进电机,需要对其进行加减速控制,下图显示了加速度、速度与位置之间的关系,使用恒定的加/减速给出了一个线性速度剖面图
步进电机脉冲之间的延时δt控制转动速度,为了使步进电机尽可能的接近速度斜坡,必须计算这些时间延时
离散步控制步进电机的运动,并且这些步骤之间的时间延迟的精度是由定时器的频率给出的
第一个计数器延迟C0以及后续的计数器延迟CN,由(详见附录)提供:
微控制器的计算能力有限,计算两个平方根是耗费时间的。因此考虑减小计算复杂度
计数值为n时,使用泰勒级数近似的步骤间的延迟(见附录详细):
这种计算要比平方根快的多,但在n=1时引入了0.44的误差。一种补偿这个误差的方法是把C0乘0.676
如附录所示,加速度由C0和n给出,如果加速度(或减速度)发生变化,必须计算一个新的n
时间Tn和n:
合并这些方程:
这表明,到达给定速度所需的步数与加速度成反比:
这意味着通过改变n来改变加速度
移动给定数量的步数,减速必须以正确的步数开始,以零速度结束。下面的公式是用来寻找n1
一个用C编写的工作实现包含在这个应用笔记中。源代码和编译信息可以通过打开包含源代码的“自述文件”来找到。
应用程序演示了步进电机的线性速度控制。用户可以通过串口发出不同的命令来控制步进电机的速度曲线,AVR将相应地驱动连接的步进电机。
演示程序分为三个主要模块,如下图所示。每个块有一个文件
main.c:有一个菜单和一个命令接口,让用户通过连接到串行线的终端控制步进电机。
speed_cntr.c:计算需要的数据并产生步进脉冲使步进电机按照预期的速度运动
sm_driver.c:计算步数和输出控制步进电机的正确信号
为了控制步进电机,需要描述速度曲线的四个参数,速度曲线以零速度开始,并加速到给定的速度。这个速度保持恒定,直到开始减速。最后,电机在给定数量的步数内减速到零速。速度曲线如图
描述速度曲线参数:
要使用演示应用程序,用户必须将终端连接到AVR的串行端口。UART设置为19200波特、8位数据、无奇偶校验和1位停止位。任何终端仿真程序都应该工作。使用终端,用户可以提供不同的命令来控制步进电机,并从演示应用程序中获取信息。
UART接收中断程序(uart.c)存储接收到的字符到缓冲区。当接收到(ASCII代码13)时,主程序读取缓冲区并执行给定的命令。
开始时发送“?”命令,将提供帮助信息:
在显示菜单或执行命令之后,显示信息行:
演示应用程序给出当前步进电机的位置、加速、减速和速度,以及移动的步数。
有三种不同的方法可以使步进电机移动:
速度控制器计算并生成速度曲线。速度控制器的框图如图所示。为了运行步进电机速度控制器通过调用函数move()设置。
函数move()首先计算所需的所有参数然后存储在结构体中,使能定时器中断,定时器按照所需的速度斜坡产生中断,每个中断调用函数step_counter()移动步进电机
在演示应用程序中,为每个命令计算速度参数,和小的延迟作为步进电机移动的开始。在实际应用中,如果只需要对速度曲线进行有限的更改则可能不需要如此。在这种情况下,参数可以预先计算
为了使代码运行更快,避免使用浮点运算,因此变量的精度对保持准确是很重要的
预编译常数也被用来简化算法,可以在smdriver h头文件中找到:
计算曲线有两种不同的方案:
3.2.1.1. 加速到期望的速度
减速开始前达到期望的速度
max_s_lim:是需要加速到期望速度的步数。
accel_lim:减速开始前的步数(不计期望的速度)。
如果max_s_lim小于accel_lim加速被期望速度所限制,decel_val计算如下
3.2.1.2. 期望的速度到达前减速
如果max_s_lim>accel_lim,加速被减速开始所限制,decel_val计算:
定时器中断产生“步进脉冲”(调用StepCpinter()),并且只有在步进电机运行时才运行。定时器中断将按照速度曲线运行在四种不同的状态下,如图
以上的状态由定时器中断中的状态机实现,如下图
当应用程序开始或者步进电机停止时状态机保持在STOP状态,当计算完成一个新的状态被设置,定时器中断被使能,当移动多余1步时状态机进入ACCEL状态,如果只移动1步,则进入DECEL状态
当处于ACCEL状态时,步进电机加速直到达到期望的速度进入RUN或者必须开始减速进入DECEL,当处于RUN状态时,步进电机保持在恒定的速度,直到必须开始减速进入DECEL状态
保持在DECEL状态直到在期望的步数下减速至0进入STOP状态
3.2.2.1. 计算和计数
对于加速和减速过程中的每一步,必须有一个新的时间延迟。
这个计算包括一个除法给余数,并且为了提高精度,这个余数被保留,并包含在下一个计算中。
为了跟踪位置和何时改变状态,需要一些计数变量,如下图。
步进电机驱动生成正确的序列信号移动步进电机向要求的方向,步进电机驱动如下图
步数计数器递增或递减,在每一次调用step_counter()时。当使用fullstep,计数器的值从0到3,使用时halfstep,从0到7。这个值等于步进电机在一个电循环中的不同位置。用作步骤表的索引,并且给出正确的信号。
完整的演示代码使用4K的程序存储器,速度控制和步进电机驱动占用1.5K。删除使用预先计算的参数将进一步减少代码大小。
当调用Move(),定期器启动前完成计算,大概有1.5ms的延迟从调用到步进电机的启动,定时器中断在加速减速的过程中执行运算每一次大概需要200us,在恒定的速度运行时,需要更少的时间大概35us即可,然后最大的速度受到加速减速的限制,对于一个一圈400步的步进电机来说,最大速度:
在其他应用程序中实现此代码时,必须考虑其他中断。如果步进电机的定时器中断被另一个ISR阻断,这将使步进电机速度不同(不是恒定加速度)。在给定的应用程序中,它可能不是关键的,但是尽可能使代码健壮和确定是一件好事。
官方代码+文档:http://download.csdn.net/detail/u010650845/9923879