4、位置超限保护:软限位与硬限位设计、正负限位信号处理、回零过程中的保护逻辑

位置超限,说白了就是运动部件跑出了我们给它划定的“安全区”。

这个问题我早年吃过亏。有一次调试一台龙门铣床,Z轴因为参数写错,直接撞上了机械硬挡块,丝杠都顶弯了。从那以后,我对限位保护的设计就特别较真。

今天咱们就把软限位、硬限位、信号处理,还有回零时的保护逻辑,一次性讲透。

4.1 软限位 vs 硬限位:两道防线

限位保护分两层:软限位硬限位。它们不是二选一,而是必须同时存在。

类型 实现方式 触发后行为 典型应用
软限位 软件比较当前位置与设定阈值 减速停止 + 报警 所有运动控制系统
硬限位 物理传感器(行程开关、光栅) 急停 + 切断动力 伺服、步进、变频器

核心原则:软限位是“预警”,硬限位是“兜底”。软限位失效时,硬限位必须能扛住。

4.2 软限位设计:位置阈值与回退策略

软限位的设计,我个人习惯分三步走:

  1. 设定正负限位阈值:比如正限位 100.0 mm,负限位 -100.0 mm。
  2. 实时比较:每个控制周期读取当前位置,与阈值比较。
  3. 触发动作:一旦越界,立即触发减速停止,并置位报警标志。

这里有个坑——回退策略。触发软限位后,你只能朝安全方向运动。比如触发了正限位,就只能往负方向走。否则一复位又撞上,形成死循环。

我的习惯:在报警标志里加一个“限位方向锁”。触发正限位后,禁止正向使能;触发负限位后,禁止负向使能。这样操作员只能往反方向回退。

// 软限位检查伪代码
if (current_position > POSITIVE_LIMIT) {
    set_alarm(ALARM_POS_LIMIT);
    disable_positive_direction();
    emergency_stop();
}
if (current_position < NEGATIVE_LIMIT) {
    set_alarm(ALARM_NEG_LIMIT);
    disable_negative_direction();
    emergency_stop();
}

4.3 硬限位信号处理:滤波与去抖

硬限位信号来自物理传感器,最怕的就是抖动误触发

我曾经遇到一个案例:车间振动大,行程开关的触点会瞬间断开又闭合,导致系统误判为限位触发,频繁急停。后来加了软件滤波才解决。

处理硬限位信号,我建议做三件事:

  • 硬件滤波:在传感器输出端并联电容,RC低通滤波。
  • 软件去抖:连续采样 N 次(比如 5 次),全部为有效电平才确认触发。
  • 信号取反:常闭触点比常开触点更安全。断线时系统会误触发限位,而不是失效。

注意:硬限位信号必须接入驱动器的硬件急停输入端,不能只靠软件读取。软件可能死机,但硬件急停是独立工作的。

// 硬限位去抖逻辑
#define DEBOUNCE_COUNT 5

uint8_t debounce_hard_limit(uint8_t raw_signal) {
    static uint8_t stable_count = 0;
    static uint8_t last_state = 0;

    if (raw_signal == last_state) {
        stable_count++;
        if (stable_count >= DEBOUNCE_COUNT) {
            return raw_signal;
        }
    } else {
        stable_count = 0;
        last_state = raw_signal;
    }
    return last_state;
}

4.4 正负限位信号处理:逻辑与优先级

正负限位信号的处理,说白了就是“谁先触发谁优先”。但实际中会有同时触发的情况——比如回零时撞到了正限位,同时负限位也因某种原因被触发。

我的处理逻辑是这样的:

  • 正限位触发:立即停止正向运动,允许负向运动。
  • 负限位触发:立即停止负向运动,允许正向运动。
  • 同时触发:停止所有运动,报“限位冲突”错误。这种情况极少见,但必须处理。

优先级:硬限位 > 软限位 > 用户指令。硬限位一旦触发,软限位和用户指令全部失效。

4.5 回零过程中的保护逻辑

回零是运动控制中最容易出问题的环节之一。为什么?因为回零时位置未知,你不知道当前离限位有多远。

我记得有一次调试一个直线模组,回零方向设反了,电机直接往正限位方向猛冲,撞上了硬限位才停下来。幸好硬限位够硬,不然又得换丝杠。

回零过程中的保护逻辑,我总结了三条:

  1. 回零前检查限位状态:如果已经在限位上,必须先手动脱离,才能开始回零。
  2. 回零过程中启用软限位:虽然位置未知,但可以根据编码器脉冲数估算位置,设定一个“安全窗口”。超出窗口立即停止。
  3. 回零方向与限位方向互斥:如果回零方向是正方向,那么正限位必须被忽略?不对!恰恰相反——正限位必须生效,防止回零超程。

我的做法:回零时,软限位阈值临时缩小到正常值的 80%。比如正常正限位是 100 mm,回零时临时设为 80 mm。这样即使回零方向错了,也有缓冲余地。

// 回零保护逻辑
void homing_protection() {
    // 1. 检查是否已在限位上
    if (hard_limit_triggered()) {
        set_error("Cannot home while on limit");
        return;
    }

    // 2. 临时缩小软限位窗口
    float temp_pos_limit = NORMAL_POS_LIMIT * 0.8;
    float temp_neg_limit = NORMAL_NEG_LIMIT * 0.8;

    // 3. 回零过程中实时检查
    while (!homing_complete()) {
        if (current_position > temp_pos_limit) {
            emergency_stop();
            set_error("Homing overrun: positive");
        }
        if (current_position < temp_neg_limit) {
            emergency_stop();
            set_error("Homing overrun: negative");
        }
        // 正常回零逻辑...
    }
}

4.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你一看就明白:软限位和硬限位如何协同,回零保护又处在什么位置。

位置超限保护知识体系 软限位(软件阈值) 硬限位(物理传感器) 阈值设定 方向锁 去抖滤波 硬件急停 正负限位信号处理(优先级:硬限位 > 软限位 > 用户指令) 回零保护逻辑(限位检查 + 临时窗口 + 方向互斥) 三道防线:软限位预警 → 硬限位兜底 → 回零保护特殊处理

最后提醒一句:限位保护不是写几行代码就完事的。你必须在实际机台上反复测试——故意让电机撞限位,看看系统能不能可靠停止。我见过太多“代码看起来没问题,一跑就飞车”的案例了。


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