首页 / 机器人控制

双磁编齿轮多圈绝对值编码器:相位差解圈数与无电池设计

单颗磁编码器芯片只能测 0~360°,不知道转子转了几圈。国产关节模组里常见的"三个齿轮+两颗磁编"结构,就是用齿轮副把多圈位置刻在两个磁编的相位差上——断电不丢、不用电池。本文拆解它的机械结构、相位差解圈数数学、齿数互质条件、标定流程与误差来源,配齿轮组交互仿真和可编译 C 代码。

1. 问题:单颗磁编为什么不够

AS5048 / MT6701 / AS5147 这类磁编码器芯片,内部是一个霍尔阵列检测上方径向充磁磁钢的角度,输出 单圈 0~360° 的绝对值(12~14 bit,约 0.02°~0.09°)。它回答的是"磁钢当前在哪个角度",回答不了"磁钢从开机到现在转了几圈"。

对伺服/关节模组,这就有两个硬伤:

工程上要的是多圈绝对值:上电即知"输出轴当前在第几圈的哪个角度",不需要回零。主流有两条路线。

方案多圈计数原理断电保持成本缺点
电池 + EEPROM/SRAM芯片内置多圈计数器,电池供电维持靠电池电池寿命 5~10 年,换电池要重新标定;低温掉电风险
齿轮副机械多圈(本文)两个磁编经不同齿数比齿轮测相位差,机械位置即多圈记忆机械保持,无电池低(多一颗磁编+齿轮)齿轮回程间隙引入角度误差;需配对标定

2. 历史:齿轮多圈是谁先做的

"齿轮组多圈"不是磁编码器时代的新发明——它是德国海德汉(HEIDENHAIN)在光电编码器时代就确立的经典方案。1964 年,海德汉推出 ROC 系列,是业界第一款真正的绝对式旋转编码器,用一个单圈码盘加一组齿轮减速带动多圈计数盘,实现断电位置记忆。此后海德汉的 EQI 系列至今仍是"齿轮式多圈(gear-based multi-turn)"的代表,机床、伺服领域用了半个多世纪。

磁编码器时代做的事,本质是把"玻璃码盘+光学读数头"换成"径向磁钢+霍尔阵列",再用两颗磁编芯片分别测两个齿数不同的小齿轮相位差——粗精解圈数的数学思想和海德汉的齿轮多圈一脉相承,只是把光学元件换成了磁敏元件,成本从几千元降到几十元。

现代新路线:无电池多圈现在还有第三条技术线——韦根效应(Wiegand):特殊合金丝在磁场翻转时产生一个脉冲,每转一圈计一次脉冲,完全无源、不用齿轮。海德汉、日本多摩川(Tamagawa)的高端伺服编码器已采用;国产磁编芯片也在跟进。齿轮副方案胜在成本极低、结构简单,韦根胜在无机械磨损,两条线在关节模组里并存。

3. 结构识别:三个齿轮 + 两颗磁编

从实物看:中心一个大齿轮(随输出轴转),左右两个小齿轮各带一颗磁钢,PCB 上两颗磁编芯片分别对准两个小齿轮磁钢。这就是齿轮副多圈磁编码器的典型结构。

怎么区分"多圈磁编"和"关节双端磁编":双端磁编是一颗测电机转子(高速)、一颗测输出法兰(低速),中间隔着减速器;多圈磁编是两颗磁编都测同一根主轴,只是通过齿数不同的齿轮耦合。判断方法:两个小齿轮齿数不同(差 1~2 齿),且都只啮合中心大齿轮。

4. 数学原理:相位差解圈数

设主轴齿轮齿数 $Z_0$,两个副轴小齿轮齿数 $Z_1$、$Z_2$(互质),两颗磁编分别测副轴角度:

θ₁ = (Z₀/Z₁)·θ + φ₁
θ₂ = (Z₀/Z₂)·θ + φ₂

其中 θ 是主轴绝对角度(含多圈),φ₁、φ₂ 是安装零位偏移。两颗磁编各自只能输出单圈角度(mod 360°),但它们的相位差

Δθ = (θ₁ − θ₂) mod 360° = Z₀·θ·(1/Z₁ − 1/Z₂) + const

主轴每转一圈,Δθ 变化一个固定步进。因为 $Z_1$、$Z_2$ 互质,这个步进在 $Z_1 \times Z_2$ 圈内不会重复——Δθ 唯一对应"当前是第几圈"。

参数典型值说明
Z₀(主轴)50中心大齿轮
Z₁(副轴1)25磁编1,减速比 2:1
Z₂(副轴2)26磁编2,减速比 50/26≈1.923:1
多圈量程25×26 = 650 圈互质时不模糊圈数(实际取几百圈够用)
单圈分辨率14 bit ≈ 0.022°磁编芯片本身

5. 粗精配对:从两个读数反推绝对角度

控制器上电读到的是两个单圈角度 $r_1$、$r_2$(mod 360°),要反推主轴绝对角度 $\theta$。流程:

  1. 粗(单圈):用磁编1直接给 $\theta \bmod 360°$,精度 0.02° 级。
  2. 精(多圈):枚举圈数 $N$(从 −300 到 +300),对每个 $N$ 算"如果主轴在第 $N$ 圈,两个磁编读数应该是多少",找与实测 $(r_1, r_2)$ 最接近的 $N$。
  3. 合成:$\theta_{abs} = N \times 360° + (\theta \bmod 360°)$。

枚举法计算量极小(600 次浮点比较),在 FOC 主控上微秒级完成。实际产品也可用查表法预计算 Δθ↔N 映射。

6. 交互仿真:拖主轴看相位差

下面仿真 $Z_0=50, Z_1=25, Z_2=26$ 的齿轮组。拖动滑块改变主轴角度(−360° ~ +1080°,即 −1 ~ +3 圈),观察两个小齿轮转速不同步,以及 Δθ 如何随圈数线性变化。

齿轮组双磁编仿真

7. 误差来源与工程对策

误差源量级影响对策
齿轮回程间隙1~5 角分正反转时角度跳变,直接变成位置误差双片弹簧消隙齿轮;预紧小扭矩
磁钢偏心/安装倾斜0.1°~1°单圈角度周期性误差对应本站第 04 篇磁编校准(查表/谐波注入)
齿数不互质Δθ 周期提前重复,多圈解算模糊Z₁、Z₂ 选互质(如 25/26、31/32)
温漂0.05°/10℃零位偏移温补表;出厂两点标定
齿轮啮合侧隙振动噪声、磨损后间隙变大金属粉末冶金齿轮预压;定期复检

8. 与关节双端磁编的区别

方案两个磁编测什么目的典型位置
齿轮副多圈(本文)同一根主轴,两个副轴经不同齿轮比测相位差单芯片无电池多圈绝对值电机尾部/编码器盖内
关节双端编电机端(高速转子)+ 输出端(负载侧)各一个FOC 换相 + 全闭环消减速器间隙/柔度电机前端盖 + 输出法兰

两者不冲突:高端关节模组可能同时用——电机端一颗磁编做 FOC,输出端一颗齿轮副多圈磁编做位置环。

9. C 代码:多圈解算

// dual_encoder_multiturn.c
// 齿轮副双磁编多圈绝对值解算
// Z0=50, Z1=25, Z2=26,量程 650 圈
#include <math.h>

#define Z0 50
#define Z1 25
#define Z2 26
#define MAX_TURNS 300

static float phi1 = 0.0f;  // 磁编1零位偏移(rad)
static float phi2 = 0.0f;  // 磁编2零位偏移(rad)

/* 标定:主轴转到机械零位,调用一次 */
void enc_calibrate(float r1, float r2) {
    phi1 = r1;
    phi2 = r2;
}

/* 解算:输入两个磁编单圈读数(rad, 0~2π),输出主轴绝对角度(rad) */
float enc_decode(float r1, float r2) {
    /* 粗:磁编1直接给单圈角 */
    float coarse = r1 - phi1;
    while (coarse < 0) coarse += 2*M_PI;
    while (coarse >= 2*M_PI) coarse -= 2*M_PI;

    /* 精:枚举圈数 N,找最匹配的 */
    float best_err = 1e9f;
    int best_n = 0;
    for (int n = -MAX_TURNS; n <= MAX_TURNS; n++) {
        float theta = n * 2*M_PI + coarse;
        /* 预测两个磁编读数 */
        float p1 = fmodf(theta * Z0 / Z1 + phi1, 2*M_PI);
        float p2 = fmodf(theta * Z0 / Z2 + phi2, 2*M_PI);
        /* 角度差归一化 */
        float d1 = fabsf(fmodf(p1 - r1 + M_PI, 2*M_PI) - M_PI);
        float d2 = fabsf(fmodf(p2 - r2 + M_PI, 2*M_PI) - M_PI);
        float err = d1 + d2;
        if (err < best_err) { best_err = err; best_n = n; }
    }
    return best_n * 2*M_PI + coarse;
}

仿真验证:主轴 θ=720°(转了 2 圈),磁编1 读数 = 720°×2 = 1440° mod 360° = 0°;磁编2 读数 = 720°×50/26 ≈ 1384.6° mod 360° ≈ 304.6°。枚举 N=2 时预测值与实测吻合,解算输出 720°。

10. 工程避坑清单