首页 / 驱动算法 / 高级篇

磁编码器非线性校准:偏心、正交误差与角度补偿

磁编码器的角度读数并不精确:偏心、正交误差、磁场谐波都会让读数"说谎"。本文讲清误差从哪来、对 FOC 影响多大,以及不依赖外部设备的校准与补偿方法。

1. 磁编码器是怎么测角度的?

磁编码器(Magnetic Encoder)由两部分组成:磁铁(径向或轴向充磁,安装在电机转轴上)和编码器芯片(定子侧)。芯片内部集成霍尔或 AMR/TMR 磁阻敏感单元,输出两个正交的磁场分量(x/y 或 sin/cos),最终通过反正切算出角度:

磁编码器测角原理

θ = atan2(y, x)

理想情况下,输出角度应严格等于转子的机械角度。但现实中,由于安装、磁铁、芯片等环节的偏差,输出角度与真实机械角之间存在随位置变化的偏差——这就是磁编码器的非线性误差

💡 芯片内部不是没有线性化

主流磁编芯片(如 MT6816、AS5047P、TLE5012B、MA730)内部都带有 CORDIC 反正切和线性化校准单元。但芯片内校准只补偿敏感单元自身的失配,无法补偿装配(偏心、轴向间隙)和磁铁(充磁不均、谐波)引入的误差——这部分必须靠系统级校准。

2. 角度误差从哪来?

磁编码器的角度误差来源可以归纳为六类,每一类都有自己典型的谐波阶次特征:

误差来源 典型谐波阶次 成因与说明
磁铁偏心 1 次(一圈一次) 磁铁圆心与转轴不同心,磁场分布不对称
正交误差 / 通道失配 2 次(一圈两次) 芯片两通道增益、偏置、正交不完美,磁场矢量轨迹呈椭圆
充磁不均 / 方向偏 1 次、2 次为主 磁铁磁化方向偏离、磁化强度不均匀
磁场谐波 3 次及以上 磁铁本身含高次空间谐波
轴向窜动 / 端跳 随机构,位置相关 轴向间隙变化使磁场强度变化,误差波动
外部杂散磁场 / 温漂 低频 / 缓变 周围磁源干扰、温度使磁铁剩磁变化

工程上,偏心(1 次谐波)和正交误差(2 次谐波)占主导,二者通常贡献 80% 以上的角度误差。典型误差量级 1°~5°,取决于装配质量。

3. 角度误差对 FOC 的影响

FOC 的每一次坐标变换都依赖转子角度 θ:Clarke/Park 变换(电流反馈)和反 Park 变换(电压指令)都要用到它。角度误差会直接"带偏"整个 dq 坐标系:

⚠️ 反馈通路的误差,不能靠环路增益硬扛

齿槽转矩是"转矩通路"的扰动,可以用前馈抵消;角度误差是"反馈通路"的误差——增大环路增益不但消不掉它,反而可能把误差放大甚至引发振荡。这类误差只能靠校准

4. 误差的数学模型:谐波级数

磁编码器测的是机械角度,误差以机械圈为周期(磁铁+传感器的几何每转一圈重复一次),因此误差可以展开为机械角度的谐波级数:

磁编码器角度误差模型

Δθ(θmech) = Σn=1 An · sin(n·θmech + φn)

⚠️ 机械圈周期 vs 电角度周期

这一点和上一篇的齿槽转矩完全不同:齿槽转矩以电角度为周期(一个电周期内波动 6/12/18 次),而磁编码器误差以机械圈为周期。所以校准表要覆盖 0~360° 机械角度,补偿完再乘以极对数 p 换算成电角度用于 FOC。用错周期,补偿反而帮倒忙。

5. 如何校准?四种方法对比

先澄清一个概念:零位校准(磁轴对齐)≠ 非线性校准。上电时给两相通电把转子拉到已知位置、记下编码器零位——这只能消除固定偏差(offset),位置相关的非线性(偏心、正交误差)一点都没动。要做非线性校准,需要逐点或逐谐波地标定。

方法一:高精度参考对比法(研发台架)

用光栅编码器、激光干涉仪或机械分度台作为基准,让被测磁编与基准同轴,逐角度对比读数,采集误差表。精度最高,是研发基准,但需要台架设备,不适合产线。

方法二:反电动势过零法(无需外部设备)

电机的反电动势(BEMF)与转子位置直接相关:某相 BEMF 过零时,转子电角度处于已知位置(如 0°、180°)。做法:

  1. 电机以很低速度旋转(开环弱电流,或由另一台电机拖动),避免饱和
  2. 采集三相反电动势,检测过零时刻
  3. 记录同一时刻的编码器读数,得到"已知电角度 ↔ 编码器读数"样本点
  4. 转满一圈,用这些样本拟合谐波系数或建误差表

优点:不需要外部基准;缺点:需要能稳定产生反电动势、转速低,样本点数量受极对数限制。

方法三:恒定速度积分法(产线快速标定)

让电机以恒定角速度旋转(外部转台,或假设电机自身匀速),则理想角度 = θ0 + ω·t。误差 = 编码器读数 − 理想角度(去掉直流)。转几圈取平均,就能得到一圈的误差曲线。速度快,适合产线。

方法四:电流纹波最小化自校准(在线,产品级)

角度误差会让 id/iq 之间产生耦合纹波。做法:低速匀速运行,观测 iq(或 id)中的 1 次、2 次谐波分量,用 RLS / LMS 在线辨识角度误差的谐波系数,并实时更新补偿。无需任何外部设备,可跟随温度/磨损自动调整,是产品级推荐方案。

方法 是否需要外部设备 精度 适用场景
高精度参考对比 是(光栅/分度台) 最高 研发基准、出厂抽检
反电动势过零 较高 研发 / 小批量标定
恒定速度积分 视情况(转台可选) 中高 产线快速标定
电流纹波最小化自校准 较高且可在线更新 产品量产、长期运行

6. 交互式演示:角度误差与补偿

下面演示磁编码器的角度误差模型。左侧是转子与编码器指针动画:橙色为真实角度,蓝色为编码器读数(偏差已放大显示);右侧是 0~360° 机械角的误差波形。你可以单独调节一次(偏心)、二次(正交)、三次谐波的幅值,看各阶谐波对误差形状的影响,以及补偿后的效果。

磁编码器非线性误差与角度补偿演示
最大原始误差 3.24° · 补偿后 0.08° · 抑制比 40:1

观察要点:

7. 补偿实现

7.1 补偿在 FOC 环中的位置

补偿在角度域做一次就够了:先用原始读数查误差,算出补偿后的角度,再把它喂给 Park / 反 Park 变换:

角度补偿

θcomp = θraw − Δθ(θraw),  之后 θelec = θcomp × p

💡 为什么用原始读数做索引?

我们不知道真实角度,只有原始读数 θraw。补偿表存的是"θraw 处的误差",所以用 θraw 查表,再减掉误差即得补偿后角度。误差较小时这种索引方式足够准。

7.2 查表补偿(C语言)

/* 磁编码器角度误差查表补偿:机械角度 0~360°,每 1° 一点 */ #define ENC_CAL_LEN 360 typedef struct { float err_table[ENC_CAL_LEN]; /* 误差(度):err = θ_raw - θ_true,由标定得到 */ } enc_cal_lut_t; /* 按原始读数查表 + 线性插值,返回补偿后角度(机械角,度) */ float enc_cal_apply(const enc_cal_lut_t *cal, float theta_raw_deg) { float x = fmodf(theta_raw_deg, 360.0f); if (x < 0.0f) x += 360.0f; int i0 = (int)x; int i1 = (i0 + 1) % ENC_CAL_LEN; float frac = x - i0; float err = cal->err_table[i0] * (1.0f - frac) + cal->err_table[i1] * frac; return theta_raw_deg - err; } /* FOC 中使用:theta_elec = enc_cal_apply(&enc_cal, theta_raw) * POLE_PAIRS; */

7.3 谐波补偿(C语言)

/* 磁编码器角度误差谐波补偿 */ #define ENC_HARM_MAX 4 typedef struct { uint8_t order[ENC_HARM_MAX]; /* 谐波阶次,如 1, 2, 3, 4 */ float amp[ENC_HARM_MAX]; /* 幅值(度) */ float phase[ENC_HARM_MAX]; /* 相位(rad) */ uint8_t n; /* 使用的阶数 */ } enc_cal_harm_t; float enc_cal_harmonic(const enc_cal_harm_t *h, float theta_raw_deg) { float theta = theta_raw_deg * (float)(M_PI / 180.0); float err = 0.0f; for (uint8_t i = 0; i < h->n; i++) { err += h->amp[i] * sinf(h->order[i] * theta + h->phase[i]); } return theta_raw_deg - err; }

7.4 标定数据采集(恒定速度法)

/* 恒定速度法:匀速旋转,理想角度 = theta0 + omega*t,误差 = 读数 - 理想值 */ for (i = 0; i < N; i++) { theta_ideal[i] = theta0 + omega * t[i]; /* 理想角度(度) */ err[i] = theta_raw[i] - theta_ideal[i]; /* 单圈误差 */ err[i] -= mean(err); /* 去掉直流(零位偏差另用磁轴对齐处理) */ } /* 多圈取平均后,按角度分箱入库或做 FFT 拟合谐波系数 */

8. 工程要点与常见误区

要点 1:校准不能替代装配精度

先把磁铁偏心、轴向窜动这些机械问题做好,再谈校准。校准只能补偿残余误差,过度依赖校准会掩盖机械问题,且误差大时查表/谐波都难以干净补偿。

要点 2:采样点数与平均

查表建议每 1°(360 点)或每 0.5°(720 点)机械角一点;标定时多转几圈取平均,抑制随机噪声。谐波法通常取到 3~4 阶即可覆盖 90% 以上的误差能量。

要点 3:温度会改变误差

磁铁剩磁随温度变化,偏心/谐波幅值随之漂移。工作温度范围大时,用在线自校准(方法四)或分段标定,避免标定值慢慢失配。

要点 4:先校角度,再做转矩补偿

齿槽转矩补偿、死区补偿都建立在角度准确的前提上。流程建议:先做磁编非线性校准(角度准了),再做齿槽转矩补偿(转矩准了)——顺序反了会越补越乱。

要点 5:验证方法

校准后低速匀速运行,观察 iq 纹波应明显下降、三相电流波形更接近正弦、位置环定位误差减小。用这些"行为指标"确认校准有效,而不只是看误差表本身。

误区 1:磁编码器是数字输出,所以精确

数字输出只是接口形式,角度是 atan2 算出来的,受磁场谐波、偏置、安装影响,误差照样存在。

误区 2:只校准零位(offset)就够了

磁轴对齐只消固定偏差。偏心、正交误差这类位置相关非线性依旧在,低速/位置控制的脉动和误差不会改善。

误区 3:误差表用电角度索引

磁编误差是机械圈周期,表要覆盖 0~360° 机械角度;换算电角度在补偿之后做(×极对数)。与齿槽转矩(电角度周期)完全相反,别混。

误区 4:磁编校准 = 齿槽转矩补偿

前者是反馈通路的角度误差(带偏 dq 坐标系),后者是转矩通路的扰动(叠加在电磁转矩上)。补偿位置不同、实现不同,但都会表现为转矩脉动——调试时注意区分。

误区 5:校准一次永久有效

温度、磁铁老化、机械松动、装配应力都会改变误差。产品级方案应支持周期性重标定或在线自适应。

误区 6:只补偿一次谐波就够

一次谐波(偏心)只是最大的一项,二次(正交)、三次谐波占比可能不小。先做 FFT 看误差频谱,再决定补偿到几阶,别一刀切。

9. 小结

  1. 磁编码器角度误差是机械圈周期的谐波叠加,1 次(偏心)、2 次(正交误差)占主导,典型 1°~5°
  2. 误差直接带偏 Park / 反 Park 变换,造成 id/iq 错误、转矩脉动、位置不准——反馈通路的误差不能靠增益消除,只能校准
  3. 校准四法:高精度参考对比、反电动势过零、恒定速度积分、电流纹波自校准;产线用恒速法,产品级用在线自校准
  4. 补偿两种实现:查表(机械角每 1° 或 0.5° 一点,插值)与谐波注入(1~4 阶,可在线自适应)
  5. 顺序:先做好装配 → 磁编非线性校准 → 齿槽转矩补偿,角度准了转矩补偿才准

下一篇我们将进入无感 FOC 观测器,看看没有编码器时,如何从反电动势和电流里"估计"出转子角度——那是角度获取的另一种路径。