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形曲线分七个阶段:
- 加加速段:加速度从0线性增加到最大加速度 \(a_{max}\)
- 匀加速段:加速度保持 \(a_{max}\)
- 减加速段:加速度从 \(a_{max}\) 线性减到0
- 匀速段:速度保持 \(v_{max}\)
- 加减速段:加速度从0线性减到 \(-a_{max}\)
- 匀减速段:加速度保持 \(-a_{max}\)
- 减减速段:加速度从 \(-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形两条路,最后都归结到位置-速度的数学关系上。
3.7 避坑指南
最后,分享几个我踩过的坑:
- 加速度太大:我曾经设了一个很大的加速度,结果电机直接过流保护。后来我加了一个加速度限幅,问题解决。
- 减速距离不够:梯形曲线减速时,如果距离太短,速度还没减到0就到位置了。这时候要么提前减速,要么用S形曲线。
- FPGA溢出:累加位置时,如果位宽不够,会溢出。我建议位置寄存器至少用32位,速度用16位。
我的习惯:在FPGA里实现速度曲线时,我会先做仿真,把速度曲线和位置曲线画出来看看。确认没问题了再上板。这一步能省很多调试时间。
好了,这一章的内容就到这里。梯形和S形曲线是运动控制的基础,理解了它们,后面的位置环、速度环就好办了。记住,平滑是王道,计算要高效。