3. 弦高误差模型
做圆弧插补,绕不开一个核心问题:误差从哪来?
说白了,数控系统是走直线的。你要画一个完美的圆,系统只能用无数小直线段去逼近。这个逼近过程,必然产生误差。我刚开始做运动控制时,总觉得只要步长够小,误差就能忽略。直到有一次加工一个精密光学镜片模具,圆弧表面出现了肉眼可见的波纹……嗯,从那以后,我再也不敢小看这个误差模型了。
3.1 弦高误差的定义
先看一个直观的场景:
你有一条圆弧,弧上取两个点A和B。用直线段AB(也就是弦)去代替弧AB。那么,弧上离弦最远的那个点,到弦的垂直距离,就是弦高误差(也叫弓高误差)。
用数学语言说:
- 圆弧半径为 R
- 弦AB对应的圆心角为 θ
- 弦高误差 δ = R - R·cos(θ/2)
这个 δ,就是你的插补精度上限。你想想看,如果 δ 超过了零件公差,那加工出来的圆弧就是「多边形」,不是圆。
3.2 几何推导——从圆到弦
推导其实不复杂。我习惯用几何法,比代数法更直观。
看一个圆,圆心O,半径R。弧上取两点A、B,弦AB的中点为M。连接OM,延长交弧于C点。
那么:
- 弦高误差 δ = CM = OC - OM
- OC = R(半径)
- OM = R·cos(θ/2)(直角三角形关系)
所以:
δ = R - R·cos(θ/2)
= R · [1 - cos(θ/2)]
用半角公式展开:
δ = 2R · sin²(θ/4)
这个形式,我个人觉得更实用。因为 sin(θ/4) 在 θ 很小时,可以直接用 θ/4 近似。
当 θ 很小(比如小于10°),有:
δ ≈ 2R · (θ/4)² = R · θ² / 8
这个近似公式,我在项目里用了无数次。它让你一眼就能看出误差和哪些参数有关。
3.3 误差与步长/半径的关系
这才是重点。弦高误差不是孤立的,它和两个参数强相关:步长 L 和 半径 R。
3.3.1 步长 L 的影响
步长 L 就是弦AB的长度。从几何关系:
L = 2R · sin(θ/2)
代入误差公式:
δ = R - √(R² - (L/2)²)
当 L 远小于 R 时,近似为:
δ ≈ L² / (8R)
这个公式太重要了。它告诉你:
- 误差和步长的平方成正比——步长翻倍,误差变成4倍
- 误差和半径成反比——半径越大,误差越小
我曾经在一个项目中,为了赶效率把步长从0.1mm调到0.2mm,结果圆弧表面粗糙度直接超差。后来老老实实按公式算回去,才解决问题。
3.3.2 半径 R 的影响
同样步长下,半径越小,误差越大。这个道理很直观:
- 大圆弧(R很大):弦和弧几乎重合,误差很小
- 小圆弧(R很小):弦和弧差异明显,误差很大
举个例子:
| 半径 R (mm) | 步长 L (mm) | 弦高误差 δ (μm) |
|---|---|---|
| 100 | 1.0 | 1.25 |
| 10 | 1.0 | 12.5 |
| 1 | 1.0 | 125 |
看到没?半径从100降到1,误差差了100倍。所以加工小半径圆弧时,必须大幅减小步长。
3.4 误差控制策略
知道了关系,控制策略就清晰了:
- 设定最大允许误差 δ_max(比如零件公差要求1μm)
- 反算最大允许步长:L_max = √(8R · δ_max)
- 插补时保证步长 ≤ L_max
实际代码中,我习惯这样写:
// 根据弦高误差限制计算最大步长
double calcMaxStepLength(double radius, double maxError) {
if (radius <= 0 || maxError <= 0) return 0;
return sqrt(8.0 * radius * maxError);
}
// 插补时动态调整步长
double stepLen = calcMaxStepLength(currentRadius, 0.001); // 1μm误差
if (stepLen > maxFeedPerCycle) {
stepLen = maxFeedPerCycle; // 还要考虑伺服能力
}
嗯,这里要注意:算出来的步长不能超过伺服系统每个插补周期能走的最大距离。否则会丢步。
3.5 知识体系总览
下面这张图,是我做培训时常用的。它把弦高误差的来龙去脉串在了一起:
这张图把整个逻辑串起来了。你从定义出发,经过几何推导,得到误差公式,然后分析关系,最后落到控制策略。每一步都有明确的数学支撑。
我个人习惯,在项目初期就会把 δ_max 定下来,然后反推所有参数。这样后期调试时,心里有底,不会慌。
好了,这一节就到这里。记住:误差不可怕,可怕的是你不知道误差从哪来、怎么控。