1. 中断系统概述:CNC系统中中断的定义、作用与分类

各位工程师朋友,咱们今天聊聊CNC系统的中断。说实话,中断这东西,刚入行时觉得它挺神秘,好像CPU突然被什么东西“打断”了。其实没那么玄乎——你正在写代码,突然电话响了,你接完电话再回来继续写。这个电话,就是中断。

1.1 中断的定义:CPU的“紧急通道”

在CNC系统里,中断是指CPU正在执行主程序时,突然收到一个紧急信号。CPU会暂停当前任务,转去处理这个信号,处理完再回来接着干。我习惯把中断理解成“硬件级别的紧急插队”。

为什么需要中断?你想想看,CNC系统要同时干多少事:

  • 实时读取编码器位置
  • 控制伺服电机加减速
  • 监控急停按钮状态
  • 处理G代码解析
  • 刷新屏幕显示

如果CPU一个一个轮询,效率太低了。中断机制让CPU能“按需响应”——没事时专心干活,有事时立刻处理。

核心要点:中断的本质是“事件驱动”。CPU平时执行主循环,只有特定事件发生时才会跳转到中断服务程序。这比轮询节省了大量CPU资源。

1.2 中断的作用:为什么CNC离不开它?

我在项目中遇到过一台老式铣床,没有用中断,全靠主循环轮询。结果呢?主轴转速一高,编码器脉冲就丢。加工出来的零件表面粗糙度完全不合格。后来改成中断方式,问题立刻解决。

中断在CNC系统里主要干这几件事:

  1. 实时响应:比如急停信号,必须在微秒级内响应。轮询做不到,中断可以。
  2. 多任务处理:CPU可以一边算插补,一边收编码器数据,一边刷新屏幕。中断让这些任务“看起来”在同时进行。
  3. 提高效率:没有中断时,CPU得不停检查各个外设。有了中断,外设主动“喊”CPU,CPU不用空等。
  4. 保证确定性:CNC加工对时间要求很苛刻。中断的响应时间是确定的,这对轨迹控制至关重要。

个人经验:我建议在设计CNC中断系统时,把最紧急的中断(比如急停、伺服报警)放在最高优先级。曾经有个同事把编码器中断优先级设低了,结果急停时编码器还在抢CPU,差点撞刀。

1.3 中断的分类:三种“打断”方式

CNC系统的中断,按来源可以分为三类。我画了一张图,方便大家理解:

CNC系统中断分类结构图 CPU 核心 外部中断 急停、限位、编码器 内部中断 定时器、DMA、溢出 软件中断 系统调用、异常处理 GPIO、外部设备信号 定时器、ADC、看门狗 SWI、SVC、Trap指令 图1: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系统里,软件中断主要用于:

  1. 系统调用:用户程序请求操作系统服务,比如创建任务、申请内存
  2. 异常处理:除零错误、未定义指令等异常情况
  3. 任务切换:RTOS中触发上下文切换

举个例子,在CNC的G代码解释器里,如果遇到未定义的M代码,可以触发一个软件中断,让异常处理程序统一处理。这样主程序不用到处检查错误,代码更干净。

避坑指南:我曾经在项目里滥用软件中断,把一些简单的函数调用也写成软件中断。结果中断嵌套太深,栈空间爆了。后来我定了个规矩:只有需要切换到特权模式的操作,才用软件中断。普通函数调用别凑热闹。

1.7 中断优先级:谁先谁后?

中断多了,就得排个先后顺序。CNC系统里,我习惯这样分配优先级:

优先级 中断类型 说明
最高 急停/伺服报警 必须立即响应,否则可能损坏设备
插补定时器 周期抖动直接影响加工精度
编码器位置捕获 丢失脉冲会导致位置误差
串口通信/屏幕刷新 可以容忍一定延迟

说白了,优先级分配的原则就一条:对时间越敏感的中断,优先级越高。这个道理简单,但实际项目中经常有人搞反。我见过把串口中断优先级设得比插补还高的,结果一收数据,电机就抖。

1.8 中断嵌套:小心“叠罗汉”

中断嵌套是指一个中断正在处理时,另一个更高优先级的中断来了。CPU会暂停当前中断,去处理更高优先级的那个。处理完再回来继续。

在CNC系统里,中断嵌套是常态。但要注意:

  • 嵌套层数不宜过多,一般不超过3层
  • 每个中断服务程序要尽量短,别在里面做复杂计算
  • 中断里不要调用printf、malloc等不可重入函数

警告:我曾经调试一个五轴CNC系统,中断嵌套了5层,结果栈溢出,程序直接跑飞。后来我把所有中断服务程序都控制在50条指令以内,复杂的处理放到任务级去执行。这个教训让我养成了“中断只做最必要的事”的习惯。

1.9 小结

中断是CNC系统的“神经反射”。没有中断,CPU就得像无头苍蝇一样到处轮询。有了中断,CPU才能精准地响应每一个紧急事件。

记住三点:

  • 外部中断处理“突发事件”(急停、限位)
  • 内部中断处理“周期任务”(插补、采样)
  • 软件中断处理“系统服务”(异常、调用)

下一节我们会深入中断向量表和中断服务程序的编写细节。到时候我会拿一个实际的CNC中断代码来拆解,看看中断到底是怎么“跑”起来的。


专注资料整理