第三节:梯形速度曲线参数计算
给定总位移、最大速度、加速度,怎么算出加速时间、匀速时间、减速时间?
这个问题,说白了就是梯形曲线最核心的「三板斧」。我当年刚入行时,被这个看似简单的问题坑过好几次。今天咱们一次性把它讲透。
3.1 先搞清楚:我们到底在算什么?
梯形速度曲线,形状像个梯形——先加速、再匀速、最后减速。三个阶段的参数,就是我们要算的。
已知条件只有三个:
- 总位移 S(单位:mm 或 pulse)
- 最大速度 Vmax(单位:mm/s 或 pulse/s)
- 加速度 A(单位:mm/s² 或 pulse/s²)
要算的是:
- 加速时间 t_acc
- 匀速时间 t_const
- 减速时间 t_dec
嗯,这里要注意:减速阶段,我一般默认加速度大小和加速阶段相同。如果不同,公式会复杂一些,但思路完全一样。
3.2 核心公式推导
先算加速时间。这个最简单:
t_acc = Vmax / A
为什么?因为从0加速到Vmax,加速度是A,时间自然就是速度除以加速度。我在项目中遇到过有人把单位搞混,mm/s 和 m/s² 直接除,结果差了1000倍。所以,单位一定要统一。
加速阶段的位移:
S_acc = 0.5 * A * t_acc²
减速阶段,如果加速度大小相同,那减速时间和加速时间一样:
t_dec = t_acc
S_dec = S_acc
那么,匀速阶段的位移就是总位移减去两头:
S_const = S - S_acc - S_dec
匀速时间:
t_const = S_const / Vmax
完整公式一览:
t_acc = Vmax / A
t_dec = Vmax / A
S_acc = 0.5 * A * t_acc²
S_dec = S_acc
S_const = S - S_acc - S_dec
t_const = S_const / Vmax
3.3 一个真实案例
我记得有一次调试一个贴片机,要求:
- 总位移 S = 200 mm
- 最大速度 Vmax = 100 mm/s
- 加速度 A = 500 mm/s²
算一下:
t_acc = 100 / 500 = 0.2 s
S_acc = 0.5 * 500 * 0.2² = 10 mm
S_dec = 10 mm
S_const = 200 - 10 - 10 = 180 mm
t_const = 180 / 100 = 1.8 s
总时间 = 0.2 + 1.8 + 0.2 = 2.2 秒。
当时现场调试,我按这个参数设进去,运动平滑,定位精准。但如果你把加速度设得太小,比如 A = 100 mm/s²,那加速时间就变成1秒,加速位移50mm,两头加起来100mm,匀速段只剩100mm,总时间变成3秒。效率差很多。
3.4 避坑指南:三角形曲线
我曾经遇到过一种情况:算出来的 S_acc + S_dec 竟然大于总位移 S。
为什么会这样?
说白了,就是还没加速到最大速度,就已经该减速了。这时候梯形曲线退化成三角形曲线。
判断条件:
如果 S_acc + S_dec > S,则无法达到 Vmax
这时候需要重新算:
实际最大速度 V_actual = sqrt(A * S) // 注意:这里假设加减速对称
加速时间 t_acc = V_actual / A
匀速时间 t_const = 0
重要提醒: 很多新手直接套梯形公式,结果匀速时间为负数。代码里一定要加这个判断!我吃过这个亏,那次是写一个通用运动库,没考虑短距离情况,结果电机直接冲过头。
3.5 代码实现示例
下面是一个简单的 Python 函数,你直接拿去用:
def calc_trapezoid(S, Vmax, A):
t_acc = Vmax / A
S_acc = 0.5 * A * t_acc ** 2
S_dec = S_acc
if S_acc + S_dec >= S:
# 三角形曲线
V_actual = (A * S) ** 0.5
t_acc = V_actual / A
t_const = 0
t_dec = t_acc
else:
S_const = S - S_acc - S_dec
t_const = S_const / Vmax
t_dec = t_acc
return t_acc, t_const, t_dec
3.6 知识体系一览
我把整个计算逻辑画成了流程图,方便你理解:
3.7 几个实用技巧
- 先判断能否达到 Vmax:这是最常见的坑。我习惯在代码里先算 S_acc + S_dec,再决定走梯形还是三角形。
- 加减速不对称怎么办?:如果加速和减速的加速度不同,那就分开算。公式一样,只是 t_acc 和 t_dec 不同。
- 浮点数精度:嵌入式系统里,float 运算要小心。我遇到过 t_const 算出来是 -0.000001,直接导致电机报错。加个阈值判断就好。
我的个人习惯: 在运动控制库里,我会把梯形曲线计算封装成一个独立函数,输入 S、Vmax、A,输出三个时间。这样上层调用时完全不用关心内部逻辑。调试时也方便单独测试。
好了,这一节的内容就这些。你想想看,其实核心就是那几个公式,加上一个三角形曲线的判断。下次遇到类似问题,直接套用就行。