1. 中断系统概述:CNC系统中中断的定义、作用与分类
各位工程师朋友,咱们今天聊聊CNC系统的中断。说实话,中断这东西,刚入行时觉得它挺神秘,好像CPU突然被什么东西“打断”了。其实没那么玄乎——你正在写代码,突然电话响了,你接完电话再回来继续写。这个电话,就是中断。
1.1 中断的定义:CPU的“紧急通道”
在CNC系统里,中断是指CPU正在执行主程序时,突然收到一个紧急信号。CPU会暂停当前任务,转去处理这个信号,处理完再回来接着干。我习惯把中断理解成“硬件级别的紧急插队”。
为什么需要中断?你想想看,CNC系统要同时干多少事:
- 实时读取编码器位置
- 控制伺服电机加减速
- 监控急停按钮状态
- 处理G代码解析
- 刷新屏幕显示
如果CPU一个一个轮询,效率太低了。中断机制让CPU能“按需响应”——没事时专心干活,有事时立刻处理。
核心要点:中断的本质是“事件驱动”。CPU平时执行主循环,只有特定事件发生时才会跳转到中断服务程序。这比轮询节省了大量CPU资源。
1.2 中断的作用:为什么CNC离不开它?
我在项目中遇到过一台老式铣床,没有用中断,全靠主循环轮询。结果呢?主轴转速一高,编码器脉冲就丢。加工出来的零件表面粗糙度完全不合格。后来改成中断方式,问题立刻解决。
中断在CNC系统里主要干这几件事:
- 实时响应:比如急停信号,必须在微秒级内响应。轮询做不到,中断可以。
- 多任务处理:CPU可以一边算插补,一边收编码器数据,一边刷新屏幕。中断让这些任务“看起来”在同时进行。
- 提高效率:没有中断时,CPU得不停检查各个外设。有了中断,外设主动“喊”CPU,CPU不用空等。
- 保证确定性:CNC加工对时间要求很苛刻。中断的响应时间是确定的,这对轨迹控制至关重要。
个人经验:我建议在设计CNC中断系统时,把最紧急的中断(比如急停、伺服报警)放在最高优先级。曾经有个同事把编码器中断优先级设低了,结果急停时编码器还在抢CPU,差点撞刀。
1.3 中断的分类:三种“打断”方式
CNC系统的中断,按来源可以分为三类。我画了一张图,方便大家理解:
1.4 外部中断:来自“外界”的呼唤
外部中断,说白了就是芯片引脚上的电平变化触发的。在CNC系统里,最常见的外部中断有:
| 中断源 | 触发方式 | 典型应用 |
|---|---|---|
| 急停按钮 | 下降沿触发 | 紧急停止所有轴运动 |
| 限位开关 | 电平触发 | 防止超程撞刀 |
| 编码器Z信号 | 脉冲触发 | 寻找机械原点 |
| 伺服报警 | 电平触发 | 驱动器故障上报 |
嗯,这里要注意:外部中断的响应速度直接受硬件影响。我曾经调试一个项目,急停信号加了RC滤波,结果响应延迟了2毫秒——差点出事故。后来我直接把滤波电容改小,才满足要求。
1.5 内部中断:芯片“自己”的事
内部中断是CPU内部模块产生的,不需要外部引脚。在CNC系统里,内部中断用得最多的是定时器中断。
你想想看,CNC的插补周期通常是1ms或0.5ms。这个周期怎么来的?就是靠定时器中断。定时器每1ms触发一次中断,CPU在中断里计算下一个插补点,输出给伺服驱动器。
关键点:内部中断的优先级通常可以软件配置。我建议把定时器中断设为最高优先级(仅次于急停),因为插补周期一旦抖动,加工表面就会出现振纹。
其他常见的内部中断还有:
- DMA传输完成中断:批量数据搬移完成后通知CPU
- ADC转换完成中断:模拟量采集完成后处理数据
- 看门狗中断:程序跑飞时触发复位
- 算术溢出中断:计算结果超出范围时报警
1.6 软件中断:程序“主动”请求
软件中断是程序自己触发的。在ARM Cortex-M系列芯片里,常用的是SVC(系统服务调用)指令。在CNC系统里,软件中断主要用于:
- 系统调用:用户程序请求操作系统服务,比如创建任务、申请内存
- 异常处理:除零错误、未定义指令等异常情况
- 任务切换:RTOS中触发上下文切换
举个例子,在CNC的G代码解释器里,如果遇到未定义的M代码,可以触发一个软件中断,让异常处理程序统一处理。这样主程序不用到处检查错误,代码更干净。
避坑指南:我曾经在项目里滥用软件中断,把一些简单的函数调用也写成软件中断。结果中断嵌套太深,栈空间爆了。后来我定了个规矩:只有需要切换到特权模式的操作,才用软件中断。普通函数调用别凑热闹。
1.7 中断优先级:谁先谁后?
中断多了,就得排个先后顺序。CNC系统里,我习惯这样分配优先级:
| 优先级 | 中断类型 | 说明 |
|---|---|---|
| 最高 | 急停/伺服报警 | 必须立即响应,否则可能损坏设备 |
| 高 | 插补定时器 | 周期抖动直接影响加工精度 |
| 中 | 编码器位置捕获 | 丢失脉冲会导致位置误差 |
| 低 | 串口通信/屏幕刷新 | 可以容忍一定延迟 |
说白了,优先级分配的原则就一条:对时间越敏感的中断,优先级越高。这个道理简单,但实际项目中经常有人搞反。我见过把串口中断优先级设得比插补还高的,结果一收数据,电机就抖。
1.8 中断嵌套:小心“叠罗汉”
中断嵌套是指一个中断正在处理时,另一个更高优先级的中断来了。CPU会暂停当前中断,去处理更高优先级的那个。处理完再回来继续。
在CNC系统里,中断嵌套是常态。但要注意:
- 嵌套层数不宜过多,一般不超过3层
- 每个中断服务程序要尽量短,别在里面做复杂计算
- 中断里不要调用printf、malloc等不可重入函数
警告:我曾经调试一个五轴CNC系统,中断嵌套了5层,结果栈溢出,程序直接跑飞。后来我把所有中断服务程序都控制在50条指令以内,复杂的处理放到任务级去执行。这个教训让我养成了“中断只做最必要的事”的习惯。
1.9 小结
中断是CNC系统的“神经反射”。没有中断,CPU就得像无头苍蝇一样到处轮询。有了中断,CPU才能精准地响应每一个紧急事件。
记住三点:
- 外部中断处理“突发事件”(急停、限位)
- 内部中断处理“周期任务”(插补、采样)
- 软件中断处理“系统服务”(异常、调用)
下一节我们会深入中断向量表和中断服务程序的编写细节。到时候我会拿一个实际的CNC中断代码来拆解,看看中断到底是怎么“跑”起来的。