电感编码器高速掉精度,为什么?

首发于公众号「如是有为」 · 查看原文

电感编码器高速掉精度,为什么?

同步误差不是处理延迟

电感编码器高速掉精度,别把锅背错了

公司里讨论电感编码器高速精度的时候,经常会出现一种熟悉的场面。

有人说:“这个高速误差是不是同步没做好?”

另一个人说:“那我们把同步相位再校一下?”

第三个人接一句:“是不是滤波太慢?”

然后会议室里开始热闹了。大家都在说“误差”,也都在说“相位”,甚至都能扯到相干解调、同步检波、低通滤波、延迟补偿。听上去好像在讨论同一个问题,实际上已经分成两条完全不同的路了。

同步误差,是解调时本振相位没对准。处理延迟,是角度结果算出来的时候已经晚了。

这两个问题名字像,现象也都可能表现成“角度不准”,但来源、表现和补偿方法完全不一样。混着叫,最大的麻烦不是术语不严谨,而是调试方向会被带偏。明明应该压处理延迟,结果跑去校同步相位;明明是本振相位偏差,结果拼命改滤波器群延迟。最后参数调了一堆,问题没解决,工程师还互相怀疑人生。

先把相干解调说成人话

电感编码器不像磁编码器那样直接读磁场方向。它通常要先给线圈一个高频激励信号,再从接收线圈里读回变化。金属转子的位置不同,线圈之间的耦合关系就不同,接收信号的幅度和相位也会跟着变。芯片或系统再把这个变化解调出来,最后算成角度。

这里面有一个核心动作,叫相干解调,也叫同步检波。

这名字听着挺玄,其实可以用一个很简单的比喻理解:你在一堆高频震动里,想把真正有用的慢变化信号捞出来。怎么捞?用一个和它节奏一致的参考信号去“对拍子”。对上拍子,有用信号就能被提出来;拍子偏了,提出来的幅度就会打折。

所以相干解调最怕的第一件事,就是本振参考信号没有和接收信号里的载波对齐。这个偏差,就是同步误差。

但这只是“解调那一刻对没对准”的问题。它不是整个信号链花了多少时间的问题。

整个信号链从接收线圈、模拟前端、ADC、滤波、数字处理,到最后 atan2 算角度,每一步都要花时间。这个时间加起来,才是处理延迟。

所以一开始就要分清楚:

同步误差问的是:你解调时拍子对没对上。处理延迟问的是:你把结果算出来时,转子是不是已经转到别处去了。

同步误差:本振相位偏了,信号幅度会变小

先看同步误差。

假设接收信号是:

x(t)=s(t)cos⁡(ωct).x(t)=s(t)\cos(\omega_c t).

这里的 s(t)s(t) 是我们真正关心的低频信号,也就是和转子位置相关的那部分信息。cos⁡(ωct)\cos(\omega_c t) 是高频载波。

同步检波时,我们拿一个本振信号去乘它:

r(t)=cos⁡(ωct+Δφ).r(t)=\cos(\omega_c t+\Delta\varphi).

这里的 Δφ\Delta\varphi 就是本振相位相对于接收载波相位的偏差,也就是同步误差。

两者相乘后:

x(t)r(t)=s(t)cos⁡(ωct)cos⁡(ωct+Δφ).x(t)r(t)=s(t)\cos(\omega_c t)\cos(\omega_c t+\Delta\varphi).

利用积化和差公式,可以得到:

x(t)r(t)=s(t)2[cos⁡Δφ+cos⁡(2ωct+Δφ)].x(t)r(t)=\frac{s(t)}{2}\left[\cos\Delta\varphi+\cos(2\omega_c t+\Delta\varphi)\right].

后面那一项是高频项,会被低通滤波器滤掉。最后留下的是:

y(t)=s(t)2cos⁡Δφ.y(t)=\frac{s(t)}{2}\cos\Delta\varphi.

这条公式非常关键。

如果 Δφ=0\Delta\varphi=0,说明本振和载波完全同步,输出就是 y(t)=s(t)/2y(t)=s(t)/2。

如果 Δφ≠0\Delta\varphi\ne0,输出就会乘上一个 cos⁡Δφ\cos\Delta\varphi。也就是说,同步误差主要造成的是幅度缩放。

它不是把角度直接往后拖,也不是让角度误差随着转速越来越大。它更像是把信号整体拧小了一点。

比如 Δφ\Delta\varphi 比较小的时候,cos⁡Δφ\cos\Delta\varphi 接近 1,幅度损失不大;但如果本振相位偏得明显,解调出来的有用信号就会被压低,信噪比也会变差。

这时候你看到的问题可能是幅度变小、增益不一致、信号裕量下降、噪声相对变大,但它的根子在“本振相位对不准”。

处理延迟:角度没坏,只是已经过期了

处理延迟是另一类问题。

它不是本振相位没对准,而是信号从接收端进来,到最后算出角度值,需要经过一整条链路:模拟前端、ADC 采样、低通滤波、数字滤波、解调计算、坐标变换、atan2 运算、接口输出。

每一步都要花时间。这个总时间,就是处理延迟 τ\tau。

如果真实角度是 θ(t)\theta(t),那么编码器输出的结果更接近:

θout(t)=θ(t−τ).\theta_{\mathrm{out}}(t)=\theta(t-\tau).

这句话翻译成人话就是:你现在读到的角度,其实是 τ\tau 之前的角度。

静止时,这个问题几乎看不出来。因为转子不动,过去的角度和现在的角度一样。

低速时,这个问题也不明显。因为在 τ\tau 这么短的时间里,转子只转了一点点。

但高速时,事情就变了。转子转得越快,同样一个延迟时间里,它已经跑得越远。于是输出角度就会明显落后真实角度。

如果机械角速度是 ωm\omega_m,那么由延迟引起的机械角度滞后量近似是:

Δθm≈ωmτ.\Delta\theta_m\approx\omega_m\tau.

如果电感编码器内部有 NN 个电周期,那么电角度滞后量会被放大成:

Δθe≈Nωmτ.\Delta\theta_e\approx N\omega_m\tau.

这就是高速下电感编码器精度下降特别容易被放大的地方。

不是信号链“不会算”,而是它算得再准,算出来也是过去的角度。转速越高,过去和现在差得越远;电周期数越多,这个差异在电角度上越显眼。

一个影响幅度,一个影响新鲜度

同步误差和处理延迟最核心的区别,可以压成一句话:

同步误差影响的是幅度,处理延迟影响的是新鲜度。

同步误差的典型结果是:

它让信号整体乘了一个系数。这个系数如果稳定,就更像增益误差。它可能影响后面的信噪比和幅度一致性,但它不会天然随着转速线性增长。

处理延迟的典型结果是:

它让输出角度落后真实角度。转子不动时不明显,转子越快越明显。它带来的误差与速度成正比。

这两个问题在示波器上、算法结果里、系统调试中,可能都表现成“角度不准”。但一拆开看,完全不是同一个病。

同步误差像是拍照时曝光没调好,画面整体暗了一点。

处理延迟像是摄像头画面有延迟,你看到的人还在门口,其实他已经走到楼梯口了。

前者调曝光,后者降延迟。你拿调曝光的方法去治画面延迟,当然没用。

为什么这件事在电感编码器里特别重要

电感编码器的信号链比很多磁编码器更长。

磁编码器很多时候是传感器直接读磁场,再经过比较直接的模拟或数字处理输出角度。电感编码器则通常涉及高频激励、线圈耦合、同步解调、低通滤波、数字处理等环节。

链路越长,越容易出现两个问题:

一是同步检波对参考相位有要求。

二是滤波和数字处理会带来延迟。

所以电感编码器高速性能不能只盯着静态精度,也不能只盯着分辨率。静态条件下,信号慢慢变化,延迟问题不明显;一旦高速旋转,信号链的时间成本就会变成角度误差。

这也是为什么讨论“电感编码器高速降精度”时,不能简单说一句“同步误差导致的”。

同步误差当然要管,但高速误差里真正和转速线性相关的,往往是处理延迟。

补偿方法也完全不同

同步误差要怎么补?

核心是让本振相位和接收载波更准地对上。方法包括改进时钟链路、优化本振相位、做相位校准、提高相位稳定性、减少通道间相位偏差。

它的目标是让 Δϕ 尽量接近 0,让 cos⁡Δϕ 尽量接近 1。

处理延迟要怎么补?

核心是让角度结果别那么“旧”。方法包括提高模拟带宽、减少滤波群延迟、优化数字滤波器阶数、缩短计算链路、提高采样和处理速度,或者在算法上根据速度做预测补偿。

如果已经知道延迟是 Td,并且能估算当前角速度 ω,那么可以做一个简单的前推:

这就是延迟补偿最朴素的想法:既然你输出的是过去的角度,那我根据速度把它往现在推回来。

当然,真实系统里速度估计有噪声,加速度变化也会带来误差,补偿不能乱加。但方向是清楚的:处理延迟靠压延迟和预测补偿,不是靠校本振相位。

别把锅背错

同步误差和处理延迟都重要,但它们不是一个东西。

同步误差是“解调时没对准”,处理延迟是“算出来时已经晚了”。

同步误差主要造成幅度衰减,处理延迟主要造成角度滞后。

同步误差不随转速线性增长,处理延迟会随着转速升高而放大。

同步误差靠相位校准,处理延迟靠带宽、链路优化和预测补偿。

这件事说白了并不复杂,但在工程现场特别容易被混着叫。因为大家看到的都是“角度不准”,嘴上说的都是“误差”,手里调的又都是信号链参数,于是越讨论越容易串。

电感编码器要想在高速场景里站稳,不能只把静态精度做漂亮,也不能只把相干解调公式推对。真正难的是把每一个误差源拆清楚:谁影响幅度,谁影响相位,谁影响动态滞后,谁会随速度放大。

否则,调试就会变成玄学。

最后一句话最关键:

同步误差是拍子没对齐,处理延迟是消息来晚了。一个该校相位,一个该压延迟。别把两个问题混成一锅粥。

应作如是观
公众号「如是有为」二维码

关注公众号「如是有为」

微信扫一扫,新文章先在公众号发出。