逐点比较法:直线插补原理、圆弧插补原理、速度控制与误差分析

各位搞运动控制的朋友,今天我们来聊聊逐点比较法。说实话,这算法在数控领域算是老前辈了,但你别因为它老就小看它。我在调试三轴雕刻机时遇到过不少情况,用DDA算法搞不定的低频振动,换成逐点比较法反而稳得很。说白了,这算法最大的优点就是——简单、可靠、实时性好。

一、直线插补原理

逐点比较法的核心思想,我总结成八个字:每走一步,比较一次。你想想看,加工一条直线,刀具当前位置和理想直线之间肯定有偏差。我们每走一步,就判断一下偏差的方向,然后决定下一步往哪走。

具体怎么判断?我们引入一个偏差函数。假设要插补第一象限的直线,起点在原点O(0,0),终点在E(Xe,Ye)。当前刀具在点P(x,y),那么偏差函数定义为:

F = y * Xe - x * Ye

这个公式怎么理解?我习惯这么记:F的正负决定了刀具在直线的哪一侧

  • F = 0:刀具正好在直线上
  • F > 0:刀具在直线上方
  • F < 0:刀具在直线下方

那下一步怎么走?规则很简单:

  • F ≥ 0:向+X方向走一步
  • F < 0:向+Y方向走一步

嗯,这里要注意,每次走完一步,偏差函数要重新计算。但直接算乘法太慢了,我教你们一个技巧——递推公式

假设当前偏差为F,向+X走一步后,新坐标(x+1, y),新偏差:

F_new = y * Xe - (x+1) * Ye = F - Ye

向+Y走一步后,新坐标(x, y+1),新偏差:

F_new = (y+1) * Xe - x * Ye = F + Xe

你看,每次只需要做一次加减法,连乘法都省了。这就是逐点比较法能在老式步进电机系统上跑得飞起的原因。

重要提示:实际加工中,终点判断不能光看坐标相等。我建议用总步数来判断——先算出X方向和Y方向的总步数N = |Xe| + |Ye|,每走一步计数器减1,减到0就停。这样比比较坐标值更可靠,不会因为累积误差而跑过头。

二、圆弧插补原理

圆弧插补的思路和直线类似,但偏差函数换成了点到圆心的距离平方差。假设要加工第一象限逆圆,圆心在原点,半径为R,当前点在P(x,y),偏差函数为:

F = x² + y² - R²

判断规则:

  • F ≥ 0:点在圆外或圆上,向-X方向走一步
  • F < 0:点在圆内,向+Y方向走一步

递推公式同样可以优化。向-X走一步后:

F_new = (x-1)² + y² - R² = F - 2x + 1

向+Y走一步后:

F_new = x² + (y+1)² - R² = F + 2y + 1

这里有个坑,我曾经踩过——象限切换。不同象限的进给方向完全不同。比如第一象限逆圆是-X和+Y,到了第二象限逆圆就变成-X和-Y了。我建议你们在代码里用查表法,把四个象限的进给方向事先存好,运行时根据当前象限直接查表,省得每次判断。

个人经验:圆弧插补的终点判断,我习惯用角度增量法。先算出圆弧对应的圆心角,每走一步角度增加一个步长,累计角度达到目标值就停止。这种方法比坐标比较法更抗干扰,尤其在加工大圆弧时优势明显。

三、逐点比较法的速度控制

速度控制说白了就是控制进给脉冲的频率。逐点比较法每走一步都要做一次偏差计算和判断,这个计算时间基本固定。所以速度控制的关键在于:如何均匀地发出进给脉冲

我常用的方法有两种:

  1. 定时中断法:设置一个定时器,每隔固定时间触发一次中断,在中断服务程序里执行一步插补计算。这种方法实现简单,但速度调节范围有限。
  2. 可变频率法:根据目标速度动态调整定时器的初值。速度高时频率快,速度低时频率慢。我建议用查表法,把速度和定时器初值的对应关系事先算好,运行时直接查表,避免在线计算的开销。

这里有个实际问题——加减速控制。直接给高速脉冲,电机容易丢步。我一般用梯形加减速曲线:启动时频率逐渐升高,到达目标速度后匀速运行,快要结束时频率逐渐降低。加减速的步数通常取总步数的10%~20%,具体数值要根据电机惯量和负载来调。

注意:加减速过程中,每一步的脉冲间隔要平滑变化。我曾经见过有人用线性加减速,结果在速度切换点出现明显的振动。后来改用S形加减速曲线,振动问题才解决。如果你对实时性要求高,可以预先算好加减速表,运行时直接查表输出。

四、误差分析

逐点比较法的误差主要来自两个方面:逼近误差累积误差

逼近误差是算法本身带来的。因为刀具只能沿坐标轴方向走,走出来的轨迹是折线,和理想直线或圆弧之间肯定有偏差。最大偏差不超过一个脉冲当量。对于直线插补,最大偏差为:

δ_max = (Xe + Ye) / √(Xe² + Ye²) * Δ

其中Δ是脉冲当量。你看,当直线与坐标轴夹角为45°时,误差最大。我一般会建议在45°附近适当加密脉冲当量,或者改用最小偏差法来优化。

累积误差是多次插补后误差的叠加。逐点比较法有个好特性——误差不会累积。因为每一步的进给方向都是根据当前偏差决定的,偏差大就往直线方向多走一步,偏差小就少走一步,始终把误差控制在±1个脉冲当量内。这一点比DDA算法强,DDA的累积误差会随着加工时间增长而变大。

误差类型 产生原因 最大误差 是否累积
逼近误差 折线逼近曲线 ≤1个脉冲当量
累积误差 多次插补叠加 ≤1个脉冲当量

你看这个表,逐点比较法的误差控制能力确实不错。但要注意,这是理论值。实际加工中还有机械间隙、电机丢步、丝杠螺距误差等因素,这些都会放大最终的位置误差。我建议在系统联调时,用激光干涉仪实测一下定位精度,然后做反向间隙补偿和螺距误差补偿。

避坑指南:我曾经在一个五轴机床上遇到过奇怪的问题——小圆弧加工精度很好,大圆弧反而误差大。查了半天才发现是圆弧插补的象限切换点处理不当。在象限切换处,进给方向突变,如果速度控制没做好,容易产生过冲。我的解决办法是在象限切换点前后各加一个减速点,让刀具平稳过渡。

知识体系总览

下面这张图是我整理的逐点比较法知识结构,你可以对照着复习:

逐点比较法知识体系 直线插补原理 偏差函数:F = y·Xe - x·Ye 进给规则:F≥0走+X,F<0走+Y 递推公式:F±Xe 或 F±Ye 圆弧插补原理 偏差函数:F = x² + y² - R² 进给规则:F≥0走-X,F<0走+Y 递推公式:F±2x+1 或 F±2y+1 速度控制 定时中断法 可变频率法 加减速控制(S形曲线) 误差分析 逼近误差:≤1个脉冲当量 累积误差:不累积 核心优势:算法简单、实时性好、误差不累积

好了,逐点比较法的核心内容就这些。说白了,这算法就是用简单的加减法替代复杂的乘除法,用递推替代直接计算。虽然现在处理器性能越来越强,但在高速加工场景下,算法的简洁性依然有它的价值。我建议你在实际项目中,先把逐点比较法跑通,再根据需求考虑是否升级到更复杂的算法。


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