3. 运动控制核心算法:梯形速度曲线、S形速度曲线、加减速控制原理、位置与速度的数学关系

各位同学,今天我们来啃运动控制里最核心的一块骨头——速度曲线规划。说白了,就是让电机怎么跑、怎么停、跑多快的问题。我做了这么多年FPGA运动控制,发现很多新手一上来就写位置环、速度环,结果电机一跑就抖,一停就过冲。为什么?因为加减速没处理好。

这一章,我会把梯形速度曲线、S形速度曲线、加减速原理,还有位置和速度的数学关系,掰开了揉碎了讲清楚。嗯,咱们开始。

3.1 为什么需要加减速控制?

先问一个问题:电机能不能直接从一个速度跳到另一个速度?

理论上可以,但现实中不行。你想想看,电机有转动惯量,负载有惯性。如果你让电机从0直接跳到1000rpm,那瞬间的加速度是无穷大。结果是什么?要么电机丢步,要么机械结构被冲击损坏。我在一个贴片机项目里就吃过这个亏——直接跳速度,结果皮带都崩断了。

所以,加减速控制的核心目的就两个:

  • 平滑运动:避免速度突变带来的冲击
  • 精准定位:在指定位置准确停下来,不超调

核心思想:速度不能跳变,加速度也不能跳变。越平滑,系统越稳。

3.2 梯形速度曲线

梯形速度曲线,是最简单、最常用的加减速方式。它的速度曲线长什么样?像个梯形——先匀加速,再匀速,最后匀减速。

3.2.1 数学描述

梯形曲线分三个阶段:

  • 加速段:加速度为常数 \(a\),速度从0线性增加到目标速度 \(v_{max}\)
  • 匀速段:速度保持 \(v_{max}\),加速度为0
  • 减速段:加速度为 \(-a\),速度从 \(v_{max}\) 线性减到0

位置和速度的关系,其实就是积分关系:

加速段:v(t) = a * t
         p(t) = 0.5 * a * t²

匀速段:v(t) = v_max
         p(t) = v_max * t

减速段:v(t) = v_max - a * t
         p(t) = v_max * t - 0.5 * a * t²

我个人习惯用FPGA实现时,把这些公式离散化。比如加速段,每个时钟周期加一个固定的速度增量。这样计算量小,适合硬件流水线。

3.2.2 梯形曲线的优缺点

优点 缺点
实现简单,计算量小 加速度突变,有冲击
适合短距离、低速场景 高速时容易过冲
FPGA资源占用少 柔性不够,不适合精密定位

我的经验:梯形曲线适合步进电机的简单点位运动。如果你做的是伺服电机或者要求高精度的场景,建议用S形曲线。

3.3 S形速度曲线

S形曲线,说白了就是让加速度也平滑变化。梯形曲线的加速度是跳变的,S形曲线把加速度的跳变变成了连续的斜坡。这样速度曲线看起来像个S形,所以叫S形曲线。

3.3.1 七段式S形曲线

标准的S形曲线分七个阶段:

  1. 加加速段:加速度从0线性增加到最大加速度 \(a_{max}\)
  2. 匀加速段:加速度保持 \(a_{max}\)
  3. 减加速段:加速度从 \(a_{max}\) 线性减到0
  4. 匀速段:速度保持 \(v_{max}\)
  5. 加减速段:加速度从0线性减到 \(-a_{max}\)
  6. 匀减速段:加速度保持 \(-a_{max}\)
  7. 减减速段:加速度从 \(-a_{max}\) 线性回到0

你可能会问:为什么搞这么复杂?

因为在实际系统中,加速度的突变会产生冲击力,导致机械振动。S形曲线把加加速度(jerk)也控制住了,运动更平滑。我在一个高精度点胶机项目里,从梯形换成S形后,胶点的一致性提升了30%。

3.3.2 数学关系

S形曲线的数学稍微复杂一点。这里给出加加速段的公式:

加加速度 j = 常数(jerk)
加速度 a(t) = j * t
速度 v(t) = 0.5 * j * t²
位置 p(t) = (1/6) * j * t³

你看,位置变成了时间的三次函数。这就是为什么S形曲线也叫三次曲线规划。

注意:S形曲线计算量比梯形大很多。在FPGA里实现时,我建议用查找表或者CORDIC算法来加速。别直接用乘法器算三次方,资源扛不住。

3.4 位置与速度的数学关系

这部分其实很简单,但很重要。位置、速度、加速度、加加速度,它们之间是微分/积分关系:

  • 位置 p(t):对速度积分
  • 速度 v(t):位置的导数,对加速度积分
  • 加速度 a(t):速度的导数,对加加速度积分
  • 加加速度 j(t):加速度的导数

用数学公式表达:

v(t) = dp/dt
a(t) = dv/dt = d²p/dt²
j(t) = da/dt = d³p/dt³

反过来:

p(t) = ∫v(t)dt
v(t) = ∫a(t)dt
a(t) = ∫j(t)dt

这个关系在FPGA里怎么用?我举个例子。假设你要做位置闭环,你从编码器读到位置,然后对位置求导得到速度。但直接求导噪声很大,我一般会用一阶低通滤波或者滑动平均。

关键点:在数字系统中,微分用差分近似,积分用累加近似。FPGA做累加特别快,一个时钟周期就能完成。

3.5 梯形 vs S形:怎么选?

我经常被问到这个问题。我的建议是:

场景 推荐曲线 原因
步进电机、短距离 梯形 简单、够用
伺服电机、长距离 S形 平滑、精度高
高速点位运动 S形 减少振动和过冲
资源受限的FPGA 梯形 节省逻辑单元

嗯,这里有个坑。我曾经在一个项目中,为了追求平滑,强行上了S形曲线。结果FPGA资源不够,时序跑不满。后来改成梯形加一个小的滤波,效果也还行。所以,别盲目追求高级算法,适合的才是最好的。

3.6 本章知识体系

下面这张图,是我画的本章知识结构。你可以看到,从加减速原理出发,分出了梯形和S形两条路,最后都归结到位置-速度的数学关系上。

运动控制核心算法知识体系 加减速控制原理 梯形速度曲线 S形速度曲线 匀加速段 匀速段 匀减速段 加加速段 匀加速段 减加速段 位置与速度的数学关系 微分:v=dp/dt, a=dv/dt, j=da/dt | 积分:p=∫vdt, v=∫adt, a=∫jdt

3.7 避坑指南

最后,分享几个我踩过的坑:

  • 加速度太大:我曾经设了一个很大的加速度,结果电机直接过流保护。后来我加了一个加速度限幅,问题解决。
  • 减速距离不够:梯形曲线减速时,如果距离太短,速度还没减到0就到位置了。这时候要么提前减速,要么用S形曲线。
  • FPGA溢出:累加位置时,如果位宽不够,会溢出。我建议位置寄存器至少用32位,速度用16位。

我的习惯:在FPGA里实现速度曲线时,我会先做仿真,把速度曲线和位置曲线画出来看看。确认没问题了再上板。这一步能省很多调试时间。

好了,这一章的内容就到这里。梯形和S形曲线是运动控制的基础,理解了它们,后面的位置环、速度环就好办了。记住,平滑是王道,计算要高效。


专注资料整理