1. 问题:单颗磁编为什么不够
AS5048 / MT6701 / AS5147 这类磁编码器芯片,内部是一个霍尔阵列检测上方径向充磁磁钢的角度,输出 单圈 0~360° 的绝对值(12~14 bit,约 0.02°~0.09°)。它回答的是"磁钢当前在哪个角度",回答不了"磁钢从开机到现在转了几圈"。
对伺服/关节模组,这就有两个硬伤:
- 上电不知道绝对位置:如果电机转子已经转了 3.5 圈,磁编只读到 180°,控制器不知道该把 180° 当成 180° 还是 1260°——FOC 换相会错,位置环会跑飞。
- 断电位置丢失:普通增量式编码器靠 Z 相回零;单圈绝对值磁编断电后,下次上电必须重新找零。
工程上要的是多圈绝对值:上电即知"输出轴当前在第几圈的哪个角度",不需要回零。主流有两条路线。
| 方案 | 多圈计数原理 | 断电保持 | 成本 | 缺点 |
|---|---|---|---|---|
| 电池 + 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₂)·θ + φ₂
其中 θ 是主轴绝对角度(含多圈),φ₁、φ₂ 是安装零位偏移。两颗磁编各自只能输出单圈角度(mod 360°),但它们的相位差:
主轴每转一圈,Δθ 变化一个固定步进。因为 $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直接给 $\theta \bmod 360°$,精度 0.02° 级。
- 精(多圈):枚举圈数 $N$(从 −300 到 +300),对每个 $N$ 算"如果主轴在第 $N$ 圈,两个磁编读数应该是多少",找与实测 $(r_1, r_2)$ 最接近的 $N$。
- 合成:$\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. 工程避坑清单
- 齿数必须互质:Z₁、Z₂ 有公因数会导致 Δθ 提前重复,多圈解算出现模糊圈。
- 齿轮间隙是头号误差源:选双片弹簧消隙齿轮,否则正反转 1~5 角分跳变直接进位置环。
- 两个磁编要同型号:温度漂移方向一致,温补才好做。
- 标定只做一次:机械装配后把主轴转到已知零位,记录 φ₁、φ₂ 存入 EEPROM。
- 磁钢偏心校准:单圈角度误差用本站第 04 篇的查表/谐波注入法补偿。