4、电子凸轮原理:电子凸轮曲线与ECAM Table

各位好,我是老张。今天咱们聊聊电子凸轮的核心——曲线和表格。说实话,我刚入行那会儿,机械凸轮见得多了,电子凸轮总觉得有点虚。后来亲手调过几台设备,才明白这东西到底有多实用。

电子凸轮,说白了就是用软件模拟机械凸轮的轮廓。你想想看,机械凸轮磨损了要换,加工精度不够就抖,改个曲线还得重新开模。电子凸轮呢?改几个参数就行。我有个项目,客户要求一天换三次产品规格,机械凸轮根本没法搞,上了电子凸轮,半小时搞定切换。

4.1 电子凸轮曲线:三种经典形状

曲线是电子凸轮的灵魂。不同的曲线,决定了从动件的运动特性——速度、加速度、甚至加加速度(Jerk)。我习惯把曲线分成三类:梯形、S型、修正梯形。咱们一个一个说。

4.1.1 梯形曲线(Trapezoidal Curve)

梯形曲线是最简单粗暴的。它的速度曲线像个梯形——匀加速、匀速、匀减速三段。

优点:计算量小,实现容易。早期PLC的算力有限,梯形曲线是主流。

缺点:加速度在拐点处突变。说白了就是有冲击。我在一台高速贴片机上试过,梯形曲线跑到3000rpm,机器抖得跟筛子似的。后来一查,加速度突变产生的冲击力,直接把凸轮从动件的轴承干废了。

适用场景:低速、对冲击不敏感的场合。比如一些简单的搬运、分拣。

4.1.2 S型曲线(S-Curve)

S型曲线就聪明多了。它把加速度也做了平滑处理——加速度本身也是连续变化的。速度曲线像个拉长的S。

优点:加速度连续,没有冲击。加加速度(Jerk)可控。机器运行非常平稳。

缺点:计算复杂,占用CPU资源多。而且同样的行程,S型曲线比梯形曲线花的时间要长一点——因为加减速段更长了。

我记得有个做锂电池卷绕机的项目,要求极片张力波动控制在±1%以内。梯形曲线根本做不到,一加速张力就跳变。换成S型曲线后,张力曲线平滑得像丝绸。嗯,这就是S型的价值。

4.1.3 修正梯形曲线(Modified Trapezoidal)

修正梯形,是我个人比较偏爱的一种。它结合了梯形和S型的优点。

怎么做的呢?在梯形的拐角处,用一段S型曲线做过渡。这样既保留了梯形的高效率(加减速段短),又避免了加速度突变。

说白了就是:梯形曲线的骨架,S型曲线的灵魂。

适用场景:大多数工业场合。尤其是中高速、对平稳性有一定要求,但又不想牺牲太多效率的场景。

我给大家画个对比图,一看就明白:

三种电子凸轮曲线速度对比 梯形曲线 S型曲线 修正梯形 梯形 S型 修正梯形

核心结论:没有最好的曲线,只有最合适的曲线。低速选梯形,高速选S型,中速选修正梯形。这是我多年调试的经验法则。

4.2 电子凸轮表(ECAM Table)的生成

曲线是理论,表格是实践。电子凸轮表,就是把连续的曲线离散化,存成一张表。PLC或者运动控制器查表运行。

为什么要有表?因为控制器是数字的,它只能处理离散的点。你给它一个连续函数,它反而不会算。查表是最快、最确定的方法。

4.2.1 表格的结构

一张标准的ECAM Table,通常包含两列:

主轴位置(Master Position) 从轴位置(Slave Position)
0 mm
30° 10 mm
60° 25 mm
90° 45 mm
... ...
360° 100 mm

主轴位置通常是角度(0-360°)或者编码器脉冲数。从轴位置是你要控制的输出位置。控制器根据主轴当前的位置,查表插值得到从轴的目标位置。

4.2.2 表格的生成方法

生成表格,我一般用两种方法:

  1. 公式计算法:根据曲线公式,按固定步长计算每个点的位置。适合梯形、S型这些有解析表达式的曲线。
  2. 样条插值法:给定几个关键点(比如起点、终点、最高点),用样条曲线插值生成中间点。适合复杂、不规则的曲线。

我曾经在一个项目里,客户给的凸轮曲线是手绘的。我扫描后提取关键点,用三次样条插值生成了ECAM Table。效果出奇的好,比他们原来的机械凸轮还顺滑。

4.2.3 代码示例:生成梯形曲线ECAM Table

下面是我常用的一个Python脚本片段,生成梯形曲线的ECAM Table:

import numpy as np

def generate_trapezoidal_ecam(master_steps=360, slave_max=100, accel_ratio=0.3):
    """
    生成梯形曲线ECAM Table
    master_steps: 主轴步数(通常360对应一圈)
    slave_max: 从轴最大行程
    accel_ratio: 加减速段占总行程的比例
    """
    table = []
    accel_steps = int(master_steps * accel_ratio)
    const_steps = master_steps - 2 * accel_steps
    
    for i in range(master_steps):
        if i < accel_steps:
            # 匀加速段
            pos = 0.5 * (slave_max / (accel_steps * const_steps + accel_steps**2)) * (i**2)
        elif i < accel_steps + const_steps:
            # 匀速段
            pos = (slave_max / 2) + (slave_max / const_steps) * (i - accel_steps)
        else:
            # 匀减速段
            decel_i = i - accel_steps - const_steps
            pos = slave_max - 0.5 * (slave_max / (accel_steps * const_steps + accel_steps**2)) * ((accel_steps - decel_i)**2)
        
        table.append((i, round(pos, 3)))
    
    return table

# 生成表格
ecam = generate_trapezoidal_ecam()
for master, slave in ecam[:10]:  # 打印前10行
    print(f"{master:3d}  {slave:8.3f}")

我的小技巧:生成表格时,步长不要太大也不要太小。步长太大,插值误差大;步长太小,占用内存多。一般360个点(每度一个点)就够用了。如果主轴是编码器,可以按编码器分辨率来定。

4.3 电子凸轮表的存储

表格生成好了,怎么存?这问题看似简单,坑却不少。

4.3.1 存储格式

常见的存储方式有三种:

  • CSV文件:方便查看和修改,但解析慢。适合调试阶段。
  • 二进制文件:解析快,占用空间小。适合量产。
  • PLC内部数组:直接存在PLC的掉电保持区。适合小表格。

我个人习惯:调试用CSV,定型后转二进制。有一次客户现场改参数,我直接用U盘拷CSV进去,PLC自动解析,5分钟搞定。要是用二进制,还得带个转换工具,麻烦。

4.3.2 存储注意事项

我曾经踩过的坑:

  • 精度问题:浮点数存成二进制时,不同平台的精度可能不一样。我建议统一用32位浮点,或者干脆用整数(比如微米为单位)。
  • 边界检查:表格的第一个点必须是起点(0,0),最后一个点必须是终点(360,行程)。否则控制器会报错。
  • 单调性:主轴位置必须严格递增。我曾经手误写错一个数,导致查表时往回走,机器直接撞限位。嗯,从那以后我加了校验。

4.4 小结

电子凸轮的核心就两件事:选对曲线,做好表格。曲线决定了运动品质,表格决定了实现精度。你想想看,机械凸轮加工一个要几百块,改一次要一周。电子凸轮呢?改几个参数,重新生成表格,下载进去就完事了。

我见过太多工程师,一上来就追求复杂的曲线,结果调了三天三夜。其实很多时候,修正梯形就够用了。先跑起来,再优化,这是工程思维。

好了,这一章就到这儿。下一章咱们聊聊电子凸轮在飞剪、追剪这些典型应用里的实战案例。到时候我会拿出我压箱底的项目经验,保证干货满满。


专注资料整理