4、位置超限保护:软限位与硬限位设计、正负限位信号处理、回零过程中的保护逻辑
位置超限,说白了就是运动部件跑出了我们给它划定的“安全区”。
这个问题我早年吃过亏。有一次调试一台龙门铣床,Z轴因为参数写错,直接撞上了机械硬挡块,丝杠都顶弯了。从那以后,我对限位保护的设计就特别较真。
今天咱们就把软限位、硬限位、信号处理,还有回零时的保护逻辑,一次性讲透。
4.1 软限位 vs 硬限位:两道防线
限位保护分两层:软限位和硬限位。它们不是二选一,而是必须同时存在。
| 类型 | 实现方式 | 触发后行为 | 典型应用 |
|---|---|---|---|
| 软限位 | 软件比较当前位置与设定阈值 | 减速停止 + 报警 | 所有运动控制系统 |
| 硬限位 | 物理传感器(行程开关、光栅) | 急停 + 切断动力 | 伺服、步进、变频器 |
核心原则:软限位是“预警”,硬限位是“兜底”。软限位失效时,硬限位必须能扛住。
4.2 软限位设计:位置阈值与回退策略
软限位的设计,我个人习惯分三步走:
- 设定正负限位阈值:比如正限位 100.0 mm,负限位 -100.0 mm。
- 实时比较:每个控制周期读取当前位置,与阈值比较。
- 触发动作:一旦越界,立即触发减速停止,并置位报警标志。
这里有个坑——回退策略。触发软限位后,你只能朝安全方向运动。比如触发了正限位,就只能往负方向走。否则一复位又撞上,形成死循环。
我的习惯:在报警标志里加一个“限位方向锁”。触发正限位后,禁止正向使能;触发负限位后,禁止负向使能。这样操作员只能往反方向回退。
// 软限位检查伪代码
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 回零过程中的保护逻辑
回零是运动控制中最容易出问题的环节之一。为什么?因为回零时位置未知,你不知道当前离限位有多远。
我记得有一次调试一个直线模组,回零方向设反了,电机直接往正限位方向猛冲,撞上了硬限位才停下来。幸好硬限位够硬,不然又得换丝杠。
回零过程中的保护逻辑,我总结了三条:
- 回零前检查限位状态:如果已经在限位上,必须先手动脱离,才能开始回零。
- 回零过程中启用软限位:虽然位置未知,但可以根据编码器脉冲数估算位置,设定一个“安全窗口”。超出窗口立即停止。
- 回零方向与限位方向互斥:如果回零方向是正方向,那么正限位必须被忽略?不对!恰恰相反——正限位必须生效,防止回零超程。
我的做法:回零时,软限位阈值临时缩小到正常值的 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