第四节:电子凸轮表(Cam Table)
好,咱们今天聊聊电子凸轮表。这东西说白了,就是电子凸轮的大脑。你前面把曲线算得再漂亮,最后都得落到一张表里,控制器才能读懂、才能执行。
我个人习惯把凸轮表比作一本「字典」。电机走到哪个角度,应该输出什么位置,全在这本字典里查。没有它,你的凸轮就是一堆数学公式,没法用。
凸轮表的结构
先看结构。一个标准的凸轮表,其实就两列数据:
- 主轴角度:通常是 0° 到 360°,或者 0 到 一圈的脉冲数
- 从轴位置:对应每个角度下,从轴应该到达的位置
我见过很多新手上来就问:「表里要存多少行数据?」这个问题没有标准答案。取决于你的控制器精度和曲线复杂度。
| 主轴角度(°) | 从轴位置(mm) |
|---|---|
| 0 | 0.0 |
| 30 | 12.5 |
| 60 | 50.0 |
| 90 | 100.0 |
| ... | ... |
| 360 | 0.0 |
嗯,这里要注意:起点和终点必须闭合。如果你做的是周期运动,0° 和 360° 的位置必须一致。否则每转一圈就会跳一下,机器会抖得厉害。
我曾经犯过一个低级错误:在生成表时,0° 存了 0.0,360° 存了 0.001。结果机器每转一圈就有一个微小的冲击。找了三天才找到原因。所以,首尾数据一定要严格相等。
角度与位置的映射关系
映射关系,说白了就是「怎么查表」。控制器运行时,主轴在高速旋转,它需要实时知道:我现在是 45.3°,从轴应该在哪?
这里有两种做法:
- 直接映射:表里刚好有 45.3° 这个点,直接读出来。但现实中几乎不可能,因为角度是连续的。
- 插值映射:找到 45° 和 46° 两个点,然后线性插值算出 45.3° 对应的位置。
我建议你使用线性插值。为什么?因为大多数控制器的 CPU 算不了太复杂的插值。你想想看,电机每毫秒都要查一次表,如果每个点都用三次样条去算,CPU 早烧了。
核心原则:凸轮表里存的是「骨架点」,实际运行时靠插值算出「肉」。骨架点越密,插值误差越小,但表也越大。一般 1° 一个点就够用,精度要求高的可以 0.1° 一个点。
数据点生成
数据点怎么来?不是手敲的,是用算法生成的。我一般分三步走:
- 确定运动规律:是等速、摆线、修正梯形,还是自定义曲线?
- 离散化:把连续曲线按角度步长切成离散点
- 量化输出:把浮点数转成控制器能识别的整数(比如脉冲数)
举个例子,生成一个摆线运动的数据点:
// 伪代码:生成摆线凸轮表
for angle = 0 to 360 step 1:
// 摆线公式:s = h * (t - sin(2πt) / 2π)
t = angle / 360.0
position = total_stroke * (t - sin(2 * PI * t) / (2 * PI))
save_to_table(angle, position)
这段代码看着简单,但实际项目里坑不少。我在项目中遇到过一个问题:当步长取 1° 时,在速度突变的地方(比如起点和终点),插值误差会偏大。后来我把步长加密到 0.5°,问题就解决了。
一个小技巧:生成数据点后,一定要做一次「反向验证」。就是把表里的点重新拟合成曲线,看看和原始曲线差多少。如果误差超过 0.01mm,说明步长太粗了。
知识体系总览
下面这张图,是我自己总结的凸轮表设计流程。你看一眼,心里就有谱了:
实际项目中的避坑指南
做了这么多年运动控制,我总结了几条关于凸轮表的血泪教训:
- 表不要太大:有些控制器 RAM 有限,一张表几万个点,下载都下不进去。我一般控制在 3600 点以内(0.1° 步长)。
- 注意数据类型:很多控制器只支持 32 位整数。你算出来的浮点数位置,要乘以一个比例因子再存。我曾经因为忘记转换,导致位置全偏了。
- 做一份「空跑」测试:把凸轮表下载进去后,先让电机空转一圈,用手摸一下有没有异常振动。有振动说明曲线不光滑,赶紧检查数据。
最后说一句:凸轮表不是一次生成就完事的。调试阶段,你可能要反复修改运动规律、调整步长、重新生成。所以,写一个自动生成凸轮表的脚本,比手动改数据要靠谱得多。
好了,凸轮表这部分就聊到这儿。你只要把结构搞明白、映射关系理清楚、生成流程走一遍,后面用起来就顺手了。