第二章 数控系统基础:CNC系统架构、运动控制卡原理、伺服驱动接口

各位同学,咱们今天聊聊数控系统的基础。说实话,很多做FPGA加速的工程师,一上来就扎进插补算法里,结果连CNC系统长什么样都没搞清楚。我个人觉得,这就像盖房子不看地基——迟早要出问题。

我在做第一个运动控制项目时,就犯过这个错。当时只顾着优化插补速度,结果发现伺服驱动器根本不响应我的脉冲指令。后来一查,原来是接口时序没对上。嗯,从那以后,我养成了一个习惯:先搞懂系统架构,再动手写代码。

2.1 CNC系统整体架构

一个典型的CNC系统,说白了就是三个层次:

  • 上位机层:负责G代码解析、人机交互、路径规划。通常是PC或者嵌入式工控机。
  • 运动控制层:这是咱们FPGA工程师的主战场。负责插补计算、位置控制、速度规划。
  • 伺服驱动层:把控制信号转换成电机转动。包括伺服驱动器、编码器反馈。

你想想看,这三个层次之间是怎么通信的?上位机通过PCIe或以太网把G代码发给运动控制卡,控制卡算好插补点,再通过脉冲或总线发给伺服驱动器。驱动器带着电机转,编码器再把实际位置反馈回来。

核心要点:FPGA在运动控制层扮演的角色,就是做那个"算得快"的引擎。CPU算插补太慢,FPGA刚好补上这个短板。

下面这张图是我自己画的系统架构图,你可以看到数据流的走向:

上位机层 G代码解析 路径规划 运动控制层 插补计算(FPGA) 位置控制 伺服驱动层 电机驱动 编码器反馈 位置反馈 G代码 脉冲/总线 CNC系统三层架构数据流 FPGA位于运动控制层,负责高速插补计算 G代码解析 插补计算 伺服驱动 位置反馈 ← 实时性要求越来越高 →

2.2 运动控制卡原理

运动控制卡,其实就是一块专门干"算位置"活儿的板卡。我见过很多方案,有基于DSP的,有基于ARM的,但真正要跑高速插补,还得是FPGA。

为什么?因为插补算法本质上是个迭代计算过程。CPU做一次迭代可能要几十个时钟周期,FPGA用流水线做,一个时钟周期就能出一个结果。你想想看,在100MHz的时钟下,这差距有多大。

我的经验:在项目中,我习惯把运动控制卡分成三个模块:

  1. 通信模块:接收上位机的指令,解析G代码参数
  2. 插补引擎:这是FPGA的核心,做直线、圆弧、样条插补
  3. 脉冲输出模块:把插补结果转换成伺服驱动器能识别的脉冲信号

这里有个关键点——插补周期。一般运动控制卡的插补周期在1ms到10ms之间。但用FPGA做,我可以把周期压到微秒级。我曾经在一个五轴联动项目中,把插补周期做到了500ns,加工出来的曲面光洁度明显好了一个等级。

2.3 伺服驱动接口

伺服驱动接口,说白了就是运动控制卡和伺服驱动器之间的"翻译官"。常见的接口类型有:

接口类型 信号形式 最高频率 适用场景
脉冲+方向 差分/单端 4MHz 通用伺服、步进电机
ABZ编码器 差分 10MHz 位置反馈
EtherCAT 差分 100Mbps 高速多轴联动
Mechatrolink 差分 50Mbps 工业机器人

避坑指南:我曾经在一个项目中,直接用单端信号连伺服驱动器,结果现场干扰大得离谱,电机一直在抖。后来换成差分信号,问题就解决了。记住:工业现场,能用差分就别用单端。

脉冲接口的时序,是FPGA工程师必须掌握的。以最常见的脉冲+方向接口为例:

// 脉冲输出时序要求
// 脉冲宽度:最小2.5us
// 方向建立时间:脉冲上升沿前至少5us
// 方向保持时间:脉冲下降沿后至少5us

always @(posedge clk) begin
    if (pulse_en) begin
        pulse_out <= 1'b1;
        #2.5us;  // 保持高电平
        pulse_out <= 1'b0;
        #2.5us;  // 保持低电平
    end
end

嗯,这里要注意:不同品牌的伺服驱动器,对脉冲宽度的要求可能不一样。我建议你在选型时,先查一下驱动器的数据手册,把时序参数记下来。别像我第一次那样,拿着通用的参数去配,结果死活调不通。

2.4 编码器反馈接口

编码器反馈,是闭环控制的关键。没有反馈,你都不知道电机实际转到了哪里。常见的编码器类型有:

  • 增量式编码器:输出A、B、Z三相信号。A和B相差90度,用来判断方向。Z相是零位信号。
  • 绝对式编码器:通过SSI或BiSS协议输出绝对位置。掉电不丢失。
  • 正余弦编码器:输出模拟信号,精度更高,但需要ADC采样。

我个人比较喜欢用增量式编码器,因为接口简单,FPGA处理起来也快。但要注意:增量式编码器上电后需要找零位,否则位置是未知的。

核心技巧:在FPGA中处理编码器信号,一定要做去抖处理。我曾经见过一个案例,因为没去抖,一个脉冲被采样成两个,位置误差越积越大。去抖的方法很简单:连续采样三次,取多数值。

好了,这一章的内容就到这里。数控系统的基础,说白了就是搞清楚"谁在干什么"。上位机负责动脑子(解析G代码),运动控制卡负责算得快(插补),伺服驱动器负责干得准(执行)。FPGA在中间这个环节,刚好发挥它的并行计算优势。

下一章,我们会深入插补算法的数学原理。到时候我会带着大家,从直线插补开始,一步步把算法搬到FPGA上。嗯,那才是真正有意思的部分。