4. 单轴运动控制基础:点位运动、JOG运动、相对运动与绝对运动

单轴运动控制,说白了就是让一个电机按照你的想法动起来。听起来简单,但这里面的门道不少。我带过不少新人,发现很多人一上来就搞多轴同步,结果单轴都没玩明白,最后调试现场一团糟。所以,咱们先把单轴的基础打牢。

这一章,我会把四种最基础的运动模式讲清楚:点位运动、JOG运动、相对运动和绝对运动。这四种模式,你会在实际项目中反复用到。

核心观点: 单轴运动控制是所有多轴同步的基础。如果单轴都调不稳,多轴同步就是空中楼阁。

4.1 四种运动模式概览

先看一张图,把这四种模式的关系理清楚。

单轴运动控制模式分类 单轴运动控制 点位运动 JOG运动 相对运动 绝对运动 说明: • 点位运动:点到点移动,不关心路径,只关心终点位置。 • JOG运动:手动点动,按住动,松开停,常用于调试和回零。 • 相对运动:基于当前位置,移动一段指定的距离。 • 绝对运动:基于原点,移动到指定的坐标位置。

4.2 点位运动(Point-to-Point Motion)

点位运动,也叫PTP运动。它的特点很直接:从A点跑到B点,中间怎么跑的不重要,只要最终停在B点就行。

我刚开始做自动化时,觉得点位运动太简单了,不就是发个目标位置嘛。结果有一次在贴片机上,因为加减速时间没设好,电机到位后还在那抖,贴片位置偏了0.1mm。嗯,从那以后我再也不敢小看点位运动了。

4.2.1 关键参数

参数名 说明 典型值
目标位置 最终要停的位置(脉冲数或工程单位) 10000 pulse
最大速度 运动过程中的最高速度 500 r/min
加速度 从0加速到最大速度的速率 1000 r/s²
减速度 从最大速度减速到0的速率 1000 r/s²
停止精度 到位后的允许误差范围 ±1 pulse

我的习惯: 加速度和减速度一般设成一样。但如果负载有惯性,比如大转盘,我会把减速度设得比加速度小20%,防止过冲。

4.2.2 代码示例

// 点位运动示例(伪代码)
void PointToPointMove(int targetPos, int maxVel, int acc, int dec)
{
    // 设置运动参数
    SetTargetPosition(targetPos);
    SetMaxVelocity(maxVel);
    SetAcceleration(acc);
    SetDeceleration(dec);

    // 启动运动
    StartMotion();

    // 等待运动完成
    while(IsMotionBusy())
    {
        delay(1);
    }

    // 检查到位状态
    if(CheckInPosition() == TRUE)
    {
        printf("点位运动完成,位置:%d\n", GetCurrentPosition());
    }
    else
    {
        printf("警告:到位超差!\n");
    }
}

4.3 JOG运动(点动运动)

JOG运动,说白了就是手动控制。你按住按钮,电机就动;你一松手,电机就停。这玩意儿在调试阶段特别有用。

我记得有一次调试一个六轴机器人,客户非要看每个轴能不能单独动。我直接用JOG模式,一个一个轴点动给他看,顺便把每个轴的限位和原点都确认了一遍。要是没有JOG,那天估计得折腾到半夜。

4.3.1 JOG的两种模式

  • 连续JOG: 按住一直跑,松开立即停止。适合长距离移动。
  • 增量JOG: 按一次跑一段固定距离,比如按一下走10个脉冲。适合微调。

我曾经踩过的坑: 连续JOG模式下,如果速度设得太高,松开按钮后电机可能因为惯性停不下来。后来我养成了一个习惯:JOG速度不要超过额定速度的30%,安全第一。

4.3.2 代码示例

// JOG运动示例(伪代码)
void JogMove(int direction, int speed, int mode)
{
    if(mode == JOG_CONTINUOUS)
    {
        // 连续JOG:设置速度后启动
        SetJogVelocity(direction * speed);
        StartJogMotion();
    }
    else if(mode == JOG_INCREMENTAL)
    {
        // 增量JOG:每次移动固定距离
        int step = 100;  // 每次100个脉冲
        SetTargetPosition(GetCurrentPosition() + direction * step);
        SetMaxVelocity(speed);
        StartMotion();
    }
}

// 停止JOG
void StopJog()
{
    StopMotion();
    printf("JOG停止,当前位置:%d\n", GetCurrentPosition());
}

4.4 相对运动与绝对运动

这两个概念,我见过太多人搞混了。其实很简单:

  • 相对运动: 从你现在站的位置,往前走5步。
  • 绝对运动: 从你现在站的位置,走到第10级台阶那里。

你想想看,如果原点没找对,绝对运动就会跑偏。而相对运动呢,它不管原点在哪,只关心你当前在哪。

4.4.1 对比表格

特性 相对运动 绝对运动
参考点 当前位置 系统原点(Home)
适用场景 重复走固定步长,如传送带步进 需要精确坐标定位,如点胶机
原点依赖 不依赖原点 必须回零后才能使用
累计误差 会累积误差 每次定位到固定坐标,不累积
代码实现 目标位置 = 当前位置 + 偏移量 目标位置 = 固定坐标值

4.4.2 代码示例

// 相对运动示例
void RelativeMove(int offset, int speed)
{
    int currentPos = GetCurrentPosition();
    int targetPos = currentPos + offset;

    SetTargetPosition(targetPos);
    SetMaxVelocity(speed);
    StartMotion();

    printf("相对运动:从 %d 移动到 %d\n", currentPos, targetPos);
}

// 绝对运动示例
void AbsoluteMove(int targetPos, int speed)
{
    // 绝对运动前必须确认已回零
    if(IsHomeDone() == FALSE)
    {
        printf("错误:请先执行回零操作!\n");
        return;
    }

    SetTargetPosition(targetPos);
    SetMaxVelocity(speed);
    StartMotion();

    printf("绝对运动:移动到坐标 %d\n", targetPos);
}

实战建议: 在同一个项目中,我习惯把相对运动和绝对运动混合使用。比如,先绝对运动到安全位置,再用相对运动做微调。这样既保证了定位精度,又灵活。

4.5 四种模式的选型指南

你可能会问,这么多模式,我到底该用哪个?我一般按这个逻辑来选:

  1. 手动调试、回零、点动测试 → 用JOG模式
  2. 只需要从A到B,不关心路径 → 用点位运动
  3. 重复走固定距离,比如每次进给10mm → 用相对运动
  4. 需要精确定位到某个坐标,比如回到原点 → 用绝对运动

我的一个小技巧: 在调试阶段,先用JOG把轴移动到大概位置,记下坐标值。然后切换到绝对运动,用这个坐标值做精确定位。这样既快又准。