第四节:电子凸轮曲线类型
好,咱们今天聊聊电子凸轮的核心——曲线类型。说实话,我刚入行那会儿,觉得凸轮曲线不就是一条线嘛,能有多复杂?直到第一次调试设备,电机在拐点处“哐”地一声巨响,我才意识到:选错曲线,后果很严重。
电子凸轮的本质,就是让从轴跟随主轴运动。而这条跟随路径,就是凸轮曲线。不同的曲线,决定了运动的平滑度、加速度冲击、甚至设备的寿命。我习惯把曲线分成四类:多项式、三角函数、修正梯形,还有自定义。咱们一个一个说。
4.1 多项式曲线:3次、5次、7次
多项式曲线,说白了就是用多项式函数来拟合运动轨迹。为什么用多项式?因为它的数学性质好,求导方便,能精确控制边界条件。
3次多项式是最基础的。它只保证位置和速度连续,加速度是跳变的。你想想看,加速度突变意味着什么?意味着冲击力。我在一个贴片机上用过3次曲线,结果吸嘴在换向时总把元件弹飞。后来换成5次,问题就解决了。
5次多项式就靠谱多了。它保证位置、速度、加速度都连续。数学上需要6个边界条件:起点和终点的位置、速度、加速度。公式长这样:
s(t) = a0 + a1*t + a2*t^2 + a3*t^3 + a4*t^4 + a5*t^5
解这个方程组,就能得到系数。我一般用Python的numpy来算,几行代码搞定。
7次多项式更进一步,连加加速度(Jerk)都连续。这玩意儿在高速高精度场合特别有用。比如半导体封装设备,动辄每分钟几百次动作,Jerk不连续的话,振动能把机器震散架。
经验之谈:3次曲线适合低速、对冲击不敏感的场合;5次是万金油,大多数场景都能用;7次留给那些“娇贵”的高速设备。别一上来就用7次,计算量大,而且过拟合反而不好。
4.2 三角函数曲线
三角函数曲线,最常见的是正弦加速度曲线。它的加速度是正弦波,没有突变,运动特别平滑。我记得有一次做印刷机,客户要求套印精度±0.01mm,我试了好几种曲线,最后用正弦加速度曲线才达标。
它的位移公式是:
s(t) = h * (t/T - sin(2πt/T) / (2π))
其中h是总行程,T是运动周期。这个曲线的特点是:启动和停止时加速度为零,中间加速度最大。说白了,就是“温柔起步,平稳加速,温柔刹车”。
但要注意,三角函数曲线的最大加速度比多项式曲线高。我做过对比,同样行程和速度下,正弦加速度曲线的峰值加速度比5次多项式高约10%。所以电机选型时要留足余量。
小技巧:如果你需要极致的平滑性,可以试试摆线曲线(Cycloidal)。它其实是三角函数曲线的一种变体,加速度更均匀。我在精密转台上用过,效果不错。
4.3 修正梯形曲线
修正梯形曲线,这个名字听起来有点怪。它其实是梯形加速度曲线的“改良版”。
原始的梯形加速度曲线,加速度在拐角处是跳变的。修正梯形用圆弧或正弦段把这些拐角“磨圆”了。这样一来,既保留了梯形曲线加速度利用率高的优点,又避免了冲击。
我举个例子:一个搬运机械手,要求节拍越快越好。用5次多项式,加速度利用率只有70%左右;用修正梯形,能到85%以上。说白了,同样的电机,用修正梯形能跑得更快。
修正梯形的参数有三个:加速段比例、匀速段比例、减速段比例。我一般设成1:2:1,也就是加速占25%,匀速占50%,减速占25%。当然,具体要看工况。
注意:修正梯形曲线的计算比多项式复杂。你需要分段定义函数,还要保证各段连接处连续。我曾经在代码里漏了一个边界条件,结果曲线在连接点处速度突变,电机直接报警。嗯,调试了整整一个下午才找到问题。
4.4 自定义曲线
有时候,标准曲线满足不了需求。比如,你要在某个位置精确停留,或者要避开机械共振点。这时候就得自己定义曲线。
自定义曲线的方法有很多:
- 样条插值:给定几个关键点,用B样条或三次样条拟合出平滑曲线。我常用scipy.interpolate来做。
- 分段多项式:把运动分成几段,每段用不同的多项式。比如启动段用5次,中间段用匀速,结束段用5次。
- 数据驱动:从实际运行数据中提取曲线。我在一个老设备改造项目中,直接录了操作工手动操作的数据,然后拟合出凸轮曲线。效果出奇的好。
这里给个简单的样条插值代码示例:
import numpy as np
from scipy.interpolate import CubicSpline
# 定义关键点:位置和对应的主轴角度
angles = np.array([0, 45, 90, 135, 180, 225, 270, 315, 360])
positions = np.array([0, 10, 30, 50, 70, 50, 30, 10, 0])
# 三次样条插值
cs = CubicSpline(angles, positions, bc_type='clamped')
# 生成平滑曲线
fine_angles = np.linspace(0, 360, 1000)
fine_positions = cs(fine_angles)
这段代码生成了一条从0到70再到0的平滑曲线。注意我用了bc_type='clamped',这保证了起点和终点的速度为零。不然的话,曲线可能在端点处“翘起来”。
避坑指南:自定义曲线一定要检查加速度和Jerk。我曾经做过一条曲线,位置看起来挺平滑,但加速度有尖峰。结果一跑起来,电机嗡嗡响,像在唱歌。后来用matplotlib画了加速度曲线才发现问题。
4.5 如何选择曲线类型?
说了这么多,到底怎么选?我总结了一张表:
| 应用场景 | 推荐曲线 | 理由 |
|---|---|---|
| 低速搬运(< 0.5m/s) | 3次多项式 | 简单够用,计算量小 |
| 中速通用(0.5~2m/s) | 5次多项式 | 平衡平滑性和效率 |
| 高速高精度(> 2m/s) | 7次多项式或修正梯形 | 控制Jerk,减少振动 |
| 需要极致平滑 | 三角函数/摆线 | 加速度连续无突变 |
| 特殊要求 | 自定义曲线 | 灵活应对非标需求 |
最后说一句:没有最好的曲线,只有最合适的。我见过有人用7次多项式做低速传送带,纯粹是杀鸡用牛刀。也见过有人用3次多项式做高速冲床,结果设备三个月就坏了。选曲线,先看需求,再算参数,最后上机验证。这个顺序,别搞反了。