第四节:电子凸轮原理——凸轮曲线定义、主从轴位置映射、凸轮表生成与加载

各位好,我是老张。今天咱们聊聊电子凸轮。说实话,我刚入行那会儿,一听到“凸轮”两个字,脑子里全是机械加工车间里那种铁疙瘩。后来做了几个项目才发现,电子凸轮这东西,说白了就是用软件模拟机械凸轮的运动规律。它比机械凸轮灵活太多了,改个曲线参数就行,不用重新车一个凸轮盘出来。

嗯,咱们这一节要讲四个核心点:凸轮曲线怎么定义、主从轴怎么映射、凸轮表怎么生成、以及怎么加载到驱动器里。我尽量用我踩过的坑来帮大家理解。

一、凸轮曲线的定义——不是随便画条线就行

电子凸轮的核心,就是一条曲线。这条曲线描述了从轴位置跟随主轴位置的关系。你想想看,主轴转一圈,从轴要走一个特定的轨迹,这个轨迹就是凸轮曲线。

我在项目里见过有人直接用直线段拼凑曲线,结果机器一跑起来,振动大得吓人。为什么?因为曲线不光滑,加速度突变,机械结构受不了。

常见的凸轮曲线类型有这么几种:

曲线类型 特点 适用场景
梯形曲线 速度有突变,加速度无限大 低速、对冲击不敏感的场合
修正梯形 加速度有限,但仍有拐点 中速包装机械
正弦曲线 速度、加速度连续,无冲击 高速、高精度场合
多项式曲线 可自定义阶数,灵活性高 特殊运动规律要求

我个人习惯,只要速度超过每分钟300转,一律用正弦曲线或者5次多项式。别问我为什么,问就是吃过亏。有一次调试一台高速贴标机,用的修正梯形,结果标签飞得到处都是。换成正弦曲线后,问题立马解决。

核心原则:凸轮曲线的二阶导数(加速度)必须连续。一阶导数(速度)可以有不连续点,但加速度绝对不能跳变。

二、主从轴位置映射——搞清楚谁跟着谁

电子凸轮里,主轴和从轴的关系不是简单的比例关系。比如主轴转一圈,从轴可能前进一段、后退一段、再停顿一段。这种映射关系,就是通过凸轮曲线来定义的。

我画了一张图,帮大家理解这个映射逻辑:

主轴位置(角度/脉冲) 从轴位置 加速段 匀速段 减速段 电子凸轮主从轴映射关系

这张图里,横轴是主轴位置,纵轴是从轴位置。曲线上的每个点,都对应一个主轴位置和一个从轴位置。比如主轴走到200这个位置时,从轴应该在150这个位置。

这里有个容易搞混的地方:主轴位置不一定是角度,也可以是脉冲数、毫米、甚至时间。我见过有人把主轴设成时间轴,结果同步精度一塌糊涂。记住,主轴一定要用物理位置,不要用时间。

我的经验:主轴最好用编码器反馈的实时的位置,不要用指令位置。因为指令位置和实际位置之间有跟随误差,用指令位置做主轴,从轴会跟着抖。

三、凸轮表的生成——把曲线变成数据

曲线定义好了,怎么让驱动器知道这条曲线呢?答案是:把曲线离散化,生成一张表。这张表就是凸轮表。

凸轮表本质上是一个数组,数组的索引是主轴位置,数组的值是从轴位置。比如主轴每走1个脉冲,查一次表,得到从轴应该在哪。

生成凸轮表的步骤:

  1. 确定分辨率:主轴一圈分成多少份。我一般用3600份,也就是0.1度一份。分辨率太高了占用内存,太低了精度不够。
  2. 计算每个点的从轴位置:根据凸轮曲线公式,算出每个主轴位置对应的从轴位置。
  3. 平滑处理:检查相邻点的速度变化,如果变化太大,需要插值或者调整曲线参数。
  4. 格式转换:把数据转换成驱动器能识别的格式,通常是整数或者浮点数。

下面是一个简单的凸轮表生成代码示例,用Python写的:

# 生成正弦凸轮表
import numpy as np

# 参数设置
master_resolution = 3600  # 主轴一圈3600份
slave_stroke = 100        # 从轴行程100mm
phase_angle = 180         # 凸轮作用角度180度

# 生成凸轮表
cam_table = []
for i in range(master_resolution):
    # 主轴位置归一化到0~1
    master_pos = i / master_resolution
    
    # 判断是否在作用区内
    if master_pos <= phase_angle / 360:
        # 归一化到0~1
        t = master_pos * 360 / phase_angle
        # 正弦曲线:从轴位置 = stroke * (1 - cos(pi * t)) / 2
        slave_pos = slave_stroke * (1 - np.cos(np.pi * t)) / 2
    else:
        # 非作用区,从轴保持不动
        slave_pos = slave_stroke
    
    cam_table.append(slave_pos)

# 输出前10个点检查
print("前10个凸轮点:", cam_table[:10])

这段代码生成了一张正弦凸轮表。主轴在0到180度范围内,从轴从0走到100mm;180度到360度,从轴停在100mm不动。

注意:凸轮表的第一个点和最后一个点必须平滑衔接。如果曲线是周期性的,最后一个点的位置和速度必须等于第一个点。否则机器每转一圈就会产生一次冲击。

四、凸轮表的加载——把数据灌进驱动器

表生成了,怎么加载到驱动器里?不同品牌的驱动器方法不一样,但原理大同小异。

我常用的加载方式有三种:

  • 直接写入:通过通讯总线(EtherCAT、CANopen等)把凸轮表数据写入驱动器的指定地址。这种方式灵活,但通讯时间较长。
  • 文件导入:把凸轮表保存成CSV或TXT文件,通过驱动器的配置软件导入。适合批量生产,一次导入永久使用。
  • 在线生成:有些高端驱动器支持在内部生成凸轮表,只需要传入曲线参数(类型、幅值、相位等)。这种方式最快,但灵活性稍差。

我曾经在一个项目里踩过坑:用直接写入方式加载凸轮表,结果通讯周期是1ms,凸轮表有3600个点,加载一次要3.6秒。机器启动时,主轴已经转了好几圈了,从轴还没跟上。后来改成文件导入,开机时一次性加载,问题解决。

加载完成后,一定要做两件事:

  1. 校验数据:读回凸轮表数据,和原始数据对比,确保传输没有错误。
  2. 试跑验证:让主轴低速转一圈,观察从轴运动是否平滑。我习惯用手轮慢慢摇主轴,同时看从轴位置反馈。

避坑指南:我曾经遇到过凸轮表加载成功,但机器一跑就报错。查了半天,发现是凸轮表的第一个点和最后一个点不连续,导致驱动器计算速度时出现无穷大。从那以后,我每次生成凸轮表都会检查首尾衔接。

好了,电子凸轮的核心内容就这些。从曲线定义到主从映射,再到表生成和加载,每一步都有讲究。你想想看,机械凸轮要改一个运动规律,得重新设计、加工、装配,至少一周时间。电子凸轮改几个参数,重新生成一张表,几分钟搞定。这就是数字化的力量。

下次调试的时候,如果遇到同步精度问题,不妨先从凸轮曲线入手检查一下。很多时候,问题就出在曲线不够平滑上。


公众号:蓝海资料掘金营,微信deep3321