2、DDA直线插补原理:时间分割法、进给速度与脉冲当量、累加器与溢出

好,咱们接着聊DDA。上一章我们把DDA的基本概念和数学基础捋了一遍。这一章,我打算深入它的核心——时间分割法、进给速度、脉冲当量,还有那个关键的累加器与溢出机制。

说实话,我刚入行那会儿,看DDA的教科书,总觉得它像个黑盒子。明明就是简单的加法,怎么就能控制机床走出直线呢?后来自己动手调参数,才真正明白里面的门道。今天我就把这些经验掰开揉碎了讲给你听。

2.1 时间分割法:把连续运动切成“时间片”

数控系统是数字的,但机床运动是连续的。怎么用数字去控制连续运动?

答案就是时间分割法。说白了,就是把一段连续的直线运动,按固定的时间间隔切成无数个小段。每一小段里,系统计算一次,输出一个脉冲。

这个固定的时间间隔,我们叫它插补周期,记作 \( T \)。

举个例子。假设我们要走一条从(0,0)到(100,50)的直线。总位移是100个脉冲当量在X轴,50个在Y轴。如果我们把插补周期设为1毫秒,总时间设为100毫秒,那就意味着我们要在100个周期内走完。

每个周期里,X轴走1个脉冲当量,Y轴走0.5个?不对,脉冲必须是整数。所以DDA用累加器来解决这个问题。这个我们后面细说。

时间分割法的核心思想就是:

  • 固定时间间隔:每个插补周期的时间长度是固定的,由系统时钟决定。
  • 周期性计算:在每个周期内,系统计算一次各轴应该移动的步数。
  • 累积效应:通过多个周期的累积,最终合成出平滑的直线轨迹。

重要概念:插补周期 \( T \) 的选择非常关键。周期太短,CPU负担重;周期太长,运动不平滑,会有明显的“阶梯感”。我一般建议根据系统的主频和精度要求来选,通常在1ms到10ms之间。

2.2 进给速度与脉冲当量:两个“冤家”

进给速度 \( F \) 和脉冲当量 \( \delta \),这两个参数是DDA里的一对“冤家”。它们直接决定了机床跑得快不快、走得准不准。

脉冲当量,就是每个脉冲对应的物理位移。比如一个脉冲,丝杠转一圈,工作台走5mm。那脉冲当量就是5mm/脉冲。当然,实际中我们常用微米级,比如0.001mm/脉冲。

进给速度,就是刀具相对于工件的移动速度,单位通常是mm/min或mm/s。

它们之间的关系很简单:

进给速度 \( F \) = 脉冲频率 \( f \) × 脉冲当量 \( \delta \)

你看,脉冲频率 \( f \) 就是每秒发出的脉冲数。这个频率,就是由DDA的累加器溢出频率决定的。

我在一个项目中遇到过一个问题:客户要求进给速度达到10m/min,但我们的脉冲当量是0.001mm。算下来,脉冲频率需要达到 \( 10 \times 1000 / 60 / 0.001 \approx 166667 \) Hz。这个频率对当时的CPU来说已经很高了。我们不得不优化算法,或者降低脉冲当量(比如改成0.005mm),但精度又下降了。这就是一个典型的权衡。

我的建议:设计系统时,先确定你需要的最高进给速度和最小脉冲当量。然后反推需要的脉冲频率。如果频率太高,要么换更快的CPU,要么适当放宽脉冲当量。没有完美的方案,只有最适合的方案。

2.3 累加器与溢出:DDA的“心脏”

好了,终于到核心了。累加器与溢出,这是DDA直线插补的“心脏”。

为什么需要累加器?因为很多时候,每个插补周期内,各轴需要移动的步数不是整数。比如前面说的,X轴每周期走1步,Y轴每周期走0.5步。但脉冲必须是整数,怎么办?

DDA的做法是:用一个累加器来“攒”小数部分。当小数部分累积到超过1时,就输出一个脉冲,同时把整数部分减掉,小数部分保留继续累加。

这个过程,就是溢出。

具体来说,DDA直线插补的算法是这样的:

  1. 初始化:设X轴总步数为 \( \Delta X \),Y轴总步数为 \( \Delta Y \)。设累加器初始值为0。设累加器容量为 \( M \)(通常取 \( 2^n \),n为寄存器位数)。
  2. 每个插补周期
    • 将 \( \Delta X \) 加到X轴累加器上。
    • 将 \( \Delta Y \) 加到Y轴累加器上。
    • 检查X轴累加器是否溢出(即累加值 ≥ M)。如果溢出,则X轴输出一个脉冲,并将累加器减去M。
    • 同样检查Y轴累加器是否溢出。如果溢出,则Y轴输出一个脉冲,并将累加器减去M。
  3. 重复:直到所有轴都走完总步数。

你看,这个算法里,每个周期只做一次加法和一次比较。效率极高。这也是DDA能在早期低性能CPU上广泛应用的原因。

下面我用一个简单的例子来演示。假设我们要走一条从(0,0)到(3,2)的直线。总步数 \( \Delta X = 3 \),\( \Delta Y = 2 \)。累加器容量 \( M = 4 \)(2位寄存器)。

周期 X累加器 X溢出? Y累加器 Y溢出? 实际走步
0 0 0 (0,0)
1 0+3=3 0+2=2 (0,0)
2 3+3=6 → 6-4=2 2+2=4 → 4-4=0 (1,1)
3 2+3=5 → 5-4=1 0+2=2 (1,0)
4 1+3=4 → 4-4=0 2+2=4 → 4-4=0 (1,1)

最终,4个周期后,X轴走了3步,Y轴走了2步,完美到达终点(3,2)。

你想想看,这个算法是不是很巧妙?它用简单的加法,就实现了小数步数的分配。而且,累加器容量 \( M \) 的选择,直接影响了插补的精度和速度。

注意:我曾经在调试一个高速加工中心时,发现插补出来的直线有轻微的“抖动”。查了半天,发现是累加器容量 \( M \) 选得太小,导致溢出频率过高,脉冲分布不均匀。后来把 \( M \) 从8位改成16位,问题就解决了。所以,\( M \) 的选择要综合考虑精度和速度。

2.4 知识体系图:DDA直线插补核心逻辑

为了让你更直观地理解,我画了一张流程图。它展示了DDA直线插补的完整逻辑。

DDA直线插补核心逻辑流程图 开始插补 初始化:ΔX, ΔY, 累加器=0, M 每个插补周期:累加 ΔX, ΔY 累加器 ≥ M ? 输出脉冲,累加器 -= M 走完? 插补结束

这张图把整个流程串起来了。从初始化开始,每个周期做累加,判断溢出,输出脉冲,直到走完。逻辑非常清晰。

2.5 总结与避坑

好了,这一章的内容就这些。我们来总结一下:

  • 时间分割法:把连续运动切成固定时间间隔的小段,每个周期计算一次。
  • 进给速度与脉冲当量:两者通过脉冲频率关联,是系统设计的核心参数。
  • 累加器与溢出:DDA的心脏,用简单的加法实现了小数步数的分配。

避坑指南:我曾经在调试一个五轴机床时,发现DDA插补出来的直线在终点附近有“过冲”。后来发现是累加器溢出后,没有正确处理余数,导致最后一步多走了。记住,溢出后一定要把累加器减去M,保留余数,这样才能保证精度。

嗯,这一章就到这里。下一章我们聊聊DDA圆弧插补,那又是另一番天地了。


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