【译】步进电机速度的实时控制

1,517 阅读10分钟

摘要

一种关于步进电机加速度计算的新算法。该算法可以将电机的速度参数化并进行实时计算。利用简单的定点数算法,该算法可以在低端MCU上运行,且不需要使用查找表。在加速度确定的情况下,该算法通过对基于时间的线性趋势进行精确近似,为电机加减速进行控制。


注意

  1. 这是一篇翻译。
  2. 原文链接在这里
  3. 需要读者了解步进电机的基础知识,比如步进、微步、转矩等。可以参考这里(繁体中文)Stepper Motor

正文

       一般认为步进电机的速度与时间之间线性趋势过于复杂,难以进行实时计算。方程8就是关于步进时延的计算。以往的解决方法之一是使用数组来存储预先计算好的线性关系数据。然而该方法缺乏弹性且占用过多内存。另一个解决方法是使用功能更强的器件,比如高端的MCU或电机控制IC,当然价格也更贵。本文提出的算法通过C语言和定点数(24.8格式)算法,提供了可以在中端PIC控制器上运行的实现。

       通常MCU都集成了一个16位的时钟模块,可以用来产生周期性信号以驱动电机产生步进(或微步)。这样就将电机步进(以及步进时间)与时钟(以及时钟分辨率)相关。对于混合式步进电机,一个步进产生的转角是固定值:1.8°(也有0.9的,更精细,更平稳,当然也更贵)。这意味电机转动一圈所需要的步进为:

       Steps Per Rotation

也即发出200个步进脉冲可以驱使电机转动一圈。

       时钟频率应该尽可能的高,同时也要在电机从静止开始加速这一时间内,为电机提供足够长的时延(保证有足够长时间的步进驱动信号,信号延续时间太短的话,电机没有足够的能量做出动作)。比如可以使用频率为1MHz的时钟。这样一个最大速度为 300 rpm (每分钟转速)的电机需要一个等效为 1000 的时延(也即累积1000个时钟脉冲信号)方才产生一个驱动信号。为了使高速运转的电机仍能平滑的加速,一个较高的时钟频率是非常有必要的。

注意

  1. 关于步进电机加速度控制的实现,请参考:AccelStepper(C++)

基本方程

方程1:脉冲的时间

产生 c 个时钟脉冲所需要的时间为:

       Equation 1          方程1

ƒ:时钟频率,单位为赫兹(Hz)。 c:时钟脉冲个数。

例子 ƒ = 1MHz c = 1000 则所需时间为:        Example 1

方程2:电机的速度

电机的速度通常使用角速度来描述(因为电机运动模式是转动)。角速度单位为 弧度每秒rad/s。在 c 个时钟脉冲内,电机的角速度 ω 方程为:

       Equation 2          方程2

α:电机步进角,单位为弧度:rad。 1 rad = 180 / π = 57.3° 1 rad/s = 30 / π = 9.55 rpm

方程3:加速度

在两个连续驱动脉冲 c1c2 内,加速度 ω’ (单位为rad/s2) 为:

       Equation 3          

例子 c1=1000 c2=2000 ƒ=1000000MHz        Example 2-1 则加速度为:        Example 2-1

对于一个线性变化的速度/时间关系,为便于计算,方程3假定在每一个步进脉冲间隔内,电机是均速转动的(实际上并不是),这个速度取自间隔的中间点。如图1所示:

Figure 1

         图1:线性关系:移动距离:m =12 steps。

注意 ω’ 与速度直方图成反比关系。

方程4:速度线性趋势的精确计算

在速度的线性趋势图中,加速度 ω’ 为常量。某一时刻的速度为:ω(t)=ω’ t。结合电机某时刻已转过的角度 θ(t),有:

       Equation 4

同样,亦有:

       Equation 4-1

其中,n≥0,为实际情况下的步进数。此时电机位于角度θ=nα。结合两式,则可推导出方程5

方程5:步进所用的时间

驱动电机逐行 n 个步进所用的时间为:

       Equation 5

方程6:两次步进之间的时钟脉冲数量

在第 n 个(n≥0)与第 n+1 个步进信号之间,间隔的时钟脉冲数量为:

Euqation 6

方程7:第一个步进需要的时钟脉冲

初始时钟脉冲 c0 由方程7得出。

       Equation 7

方程8:第n步进需要的时钟脉冲

       Equation 8

注意 c0 设置了加速度,等比于Equation 8

在实际情况下,在每一次步进时都要使用方程8进行平方根计算,这会有精度损失,并且方程中的减法会进一步导致精度下降。

方程9:连续两次步进之间的线性关系

对线性趋势进行近似,根据 方程8 比较前后两个步进所需时钟脉冲,得到:

       Equation 9

方程10:泰勒级数

后续会使用泰勒级数对方程9进行近似计算。

       Equation 10

方程11:近似

使用方程10方程9进行二次近似,得到方程11:

       Equation 11

注意 关于近似理论,请参考这里

方程12

为便于计算,对方程11进行移项,得到方程12

       Equation 12

方程13

最终,对方程12进行整理,建立与实际物理意义无关的一般意义方程:方程13。方程中使用 i 表示从 0 开始的第 n 个步进。对于给定的加速度,n决定了第 i 次的速度增量。当从静止开始加速时,ni=i, i=1, 2, ...

       Equation 13

方程14

n值取负表示减速。特别地,对于方程14,当 ni=i-m,在总计m个步进中,可以用于减速直到停止。

       Equation 14

方程15:近似算法的精度问题

近似算法的精度可见下表:

步进n精确(方程9)近似(方程11)相对误差
10.41420.60000.4485
20.76730.77780.0136
30.84300.84620.00370
40.88100.88240.00152
50.90410.90487.66E-4
60.91960.92004.41E-4
100.95110.95129.42E-5
1000.99500.99509.38E-8
1,0000.99950.99959.37E-11

表1:近似算法的精度 表1显示近似算法是精确的,即使是在步进 n 较小时。并且,相对误差以 n3 的速度缩小。然而,当 n=1 时误差则相当大。可以使用以下两个方法来减小 n=1 的误差:

  • n=1 作为特殊情况处理。使用 c1=0.4056⋅c0 作为不精确的起始值,并且使用方程7来计算 c0
  • 忽略 n=1 的不准确性。用方程15来代替方程7。        Equation 14

疑问 如何得到0.4056和0.676这两个常数?是通过不断尝试、比较,还是使用了魔法?

前一种方法测能够得到几乎完美的线性趋势。
后一种方法则能更快的启动。好处是能帮助电机运转:步进电机依靠0-1脉冲产生步进,由此获得转矩,当然转角误差也随之而来。同时可以在16位时钟上允许更大范围的加速度,并且还有简单方便的优势。因此,推荐使用这种方式,并忽略 **n=1** 时的不精确(`这样做真的好么?`)。

       Figure 2 图2:步进电机速度趋势

       Figure 3 图3:趋势上行开始时

       Figure 4 图4:趋势上行结束时

图2到图4是应用以上几种方法对目标电机在 1 秒内从 0 rpm 加速到 120 rpm的比较。为清楚起见,基于方程2计算并展示了步进在速度上变化。理想的趋势应该接近一条直线。

在方程12中,2.c/(4.n+1) 可以近似为 c/(2.n) 。这样产生的效果就是: - 算法的趋势仍旧是线性的。 - c0 更接近方程7显示的“真实值”:对于同样的加速度,c0 为真实值的88.6%,原来是66.7%。 - 加、减速计算不能再使用单个方程比如方程13

方程16:计算步进数的函数

方程4方程5可得到根据速度和加速度计算步进数 n 的函数:

       Equation 16

方程17

方程16,得到方程17,并推断达到某一给定速度所需要的步进数是反比例于加速度的:

       Equation 17

这使得在某一时间点改变加速度成为可能:通过改变方程13中的步进数 n。更进一步,使用带符号的 ω’ 值使得带符号的步进值 n 可得到正确的计算结果。此时仅有 ω’=0 时需要特殊处理。这样就可以加减速了。

方程18

方程17提供的步进值 ntn 是正确的.然而,cn 本身就是间隔 tn...tn+1 内的平均值。故而,虽然方程17已足够精确,但在步进值 n 上加一个半步长可以获得更精确的结果:

       Equation 18

表2显示了改变加速度引起的数值变化:从 105 又在第200步时到 -20。这是一种对复杂变化进行分段分析的方法:

步进inici(方程13)ω’(方程3)备注
1981982,813.067c199
199199
398.5
-100.25
2,806.00810c200
200399.52,803.4985c200   etc
201400.52,799.0015同上
200-99.252,820.180-20c200)   etc
201-98.252,834.568-20同上

方程19:减速

在加减速的线性趋势中,当进行 m 步的短距离移动时,如果加速时(趋势上行)某点 ω’1 与减速时(趋势下行)某点 ω’2 重合,而此时电机尚未达到最大速度,也即,加速到中途就需要减速,此时,根据方程17,得到方程19来计算减速所需要的步数:

       Equation 19

ω’1:加速度。 ω’2:减速度(负的加速度)。 对 n 取整,套用方程14可计算出 cn...cm-1

  • 其它情况 对于其它情况,可用方程17方程18进行这样的计算: 电机在某一加速度 ω’1 下运行了n1 步后达到某一速度,此时开始使用减速度 ω’2,求电机从运行到停止所需要的步进数 n2。对 n2 取整并应用 方程14 可计算出 c1...cm-1

Good Luck.