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直线插补的算法是这样的:
- 初始化:设X轴总步数为 \( \Delta X \),Y轴总步数为 \( \Delta Y \)。设累加器初始值为0。设累加器容量为 \( M \)(通常取 \( 2^n \),n为寄存器位数)。
- 每个插补周期:
- 将 \( \Delta X \) 加到X轴累加器上。
- 将 \( \Delta Y \) 加到Y轴累加器上。
- 检查X轴累加器是否溢出(即累加值 ≥ M)。如果溢出,则X轴输出一个脉冲,并将累加器减去M。
- 同样检查Y轴累加器是否溢出。如果溢出,则Y轴输出一个脉冲,并将累加器减去M。
- 重复:直到所有轴都走完总步数。
你看,这个算法里,每个周期只做一次加法和一次比较。效率极高。这也是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直线插补的完整逻辑。
这张图把整个流程串起来了。从初始化开始,每个周期做累加,判断溢出,输出脉冲,直到走完。逻辑非常清晰。
2.5 总结与避坑
好了,这一章的内容就这些。我们来总结一下:
- 时间分割法:把连续运动切成固定时间间隔的小段,每个周期计算一次。
- 进给速度与脉冲当量:两者通过脉冲频率关联,是系统设计的核心参数。
- 累加器与溢出:DDA的心脏,用简单的加法实现了小数步数的分配。
避坑指南:我曾经在调试一个五轴机床时,发现DDA插补出来的直线在终点附近有“过冲”。后来发现是累加器溢出后,没有正确处理余数,导致最后一步多走了。记住,溢出后一定要把累加器减去M,保留余数,这样才能保证精度。
嗯,这一章就到这里。下一章我们聊聊DDA圆弧插补,那又是另一番天地了。
公众号:蓝海资料掘金营,微信deep3321