3. 编码器信号质量优化:信号抖动(Jitter)的来源与抑制
编码器信号抖动,说白了就是边沿位置在时间轴上的随机漂移。你想想看,电机每转一圈,编码器本该在精确的机械角度输出跳变沿,结果每次跳变的位置都差了那么几微秒甚至几十微秒。换相时机一乱,电流波形就跟着扭曲,轻则效率下降,重则电机直接啸叫、抖动。
我早年调试一个伺服项目时,电机在低速运行时总有一阵一阵的“咔咔”声。用示波器一抓编码器A/B通道,好家伙,上升沿的抖动幅度接近1微秒。当时我以为是编码器坏了,折腾了两天才发现——是布线问题和电源噪声叠加出来的。从那以后,我对信号抖动这件事就特别敏感。
3.1 信号抖动的来源
抖动不是凭空冒出来的。我把它归纳为三大类:
| 抖动类型 | 根本原因 | 典型表现 |
|---|---|---|
| 随机抖动 | 热噪声、1/f噪声、半导体散粒噪声 | 边沿位置呈高斯分布,无法彻底消除 |
| 确定性抖动 | 电源纹波、串扰、阻抗不匹配、反射 | 边沿偏移与时钟或PWM开关频率相关 |
| 占空比失真 | 驱动器上升/下降时间不对称、磁滞差异 | 高电平宽度与低电平宽度不一致 |
关键认知:随机抖动是物理极限,我们只能接受;确定性抖动才是优化的主战场。我见过太多工程师花大价钱换高精度编码器,结果布线一塌糊涂,抖动反而更大了。
具体到电机控制场景,最常见的抖动来源有:
- 电源噪声耦合:电机驱动器的PWM开关频率(通常8-20kHz)通过寄生电容和电感耦合到编码器信号线上。我在一个项目中测到,PWM开关瞬间编码器信号上会叠加一个200mV的尖峰,直接导致施密特触发器误触发。
- 长线传输反射:编码器信号频率不高(通常几百kHz到几MHz),但传输线超过1米时,如果阻抗不匹配,反射波会叠加在原始信号上,造成边沿位置偏移。我习惯用特性阻抗100Ω的差分对,并在接收端并联120Ω终端电阻。
- 地电位差:编码器与控制器之间如果存在地环路,地电位差会直接叠加在信号上。我曾经遇到过编码器外壳接地不良,导致共模电压达到2V,信号完全没法看。
3.2 差分信号布线要点
差分信号是抑制共模噪声的利器。但差分线不是简单地把两根线走在一起就完事了。我总结了几条硬规矩:
- 等长原则:差分对的两根线长度差控制在5mm以内。长度差会导致共模噪声转化为差模噪声,抵消差分传输的优势。我习惯在PCB布局时先走一对线,然后用蛇形线补偿长度差。
- 紧耦合:差分线间距保持在3倍线宽以内(通常5-8mil)。间距越大,抗共模干扰能力越差。我见过有人把A+和A-分开走,中间还穿了一根电源线——这种走法还不如单端传输。
- 远离噪声源:差分线不要平行于PWM信号线、功率管栅极驱动线。如果必须交叉,采用垂直交叉(90度)。我在一个项目中把编码器线走在功率层正上方,结果抖动从200ps飙升到800ps。
- 阻抗控制:差分阻抗控制在100Ω±10%。如果PCB厂家不支持阻抗控制,至少保证线宽和介质厚度一致。我习惯用JLC2313叠层,4层板,差分线宽6mil,间距6mil,参考层为GND。
- 终端匹配:在接收端(通常是MCU或FPGA的编码器接口)并联100-120Ω电阻。这个电阻能吸收反射波,显著降低抖动。我测试过,不加终端电阻时抖动约500ps,加上后降到150ps。
我的布线习惯:编码器差分线走内层(被GND和VCC层夹着),外层只走短距离的引出线。内层走线能提供完整的参考平面,阻抗更稳定,抗干扰能力也更强。如果只能用两层板,那就把差分线两侧都铺地铜,并打满过孔。
3.3 施密特触发器整形电路设计
即使布线做到极致,信号经过长线传输后,边沿还是会变缓。施密特触发器的作用就是把缓变的边沿重新“削”成陡峭的数字电平。它有两个关键参数:
- 正向阈值电压(VT+):输入电压上升时,输出从低跳变到高的阈值。
- 负向阈值电压(VT-):输入电压下降时,输出从高跳变到低的阈值。
- 迟滞宽度(ΔV = VT+ - VT-):这个差值决定了抗噪声能力。迟滞宽度越大,抗抖动能力越强,但也会引入更大的相位延迟。
我常用的施密特触发器芯片是SN74LVC1G17(单通道)和SN74LVC14(六反相器)。它们的迟滞宽度典型值为0.4V(3.3V供电时),对于编码器信号来说足够了。
注意:施密特触发器不是万能的。如果信号上的噪声幅度超过迟滞宽度,输出仍然会抖动。我曾经在一个项目中,编码器信号上叠加了1V的噪声,而施密特触发器的迟滞宽度只有0.4V,结果输出端仍然有毛刺。后来加了RC低通滤波器才解决。
下面是一个典型的施密特触发器整形电路:
// 编码器信号整形电路(以A通道为例)
// 输入:编码器差分信号经AM26LS32转换为单端信号
// 输出:整形后的数字信号送入MCU的TIM_CHx引脚
// 电路连接:
// 1. 差分接收器输出 -> 100Ω串联电阻 -> 施密特触发器输入
// 2. 施密特触发器输入对GND接10pF电容(滤除高频噪声)
// 3. 施密特触发器输出 -> 22Ω串联电阻 -> MCU引脚
// 元件选型:
// U1: SN74LVC1G17DBVR (SOT-23-5)
// R1: 100Ω ±1% 0402
// R2: 22Ω ±1% 0402
// C1: 10pF ±5% 0402 NP0
我习惯在施密特触发器输入端加一个小电容(10-47pF),与串联电阻构成一个低通滤波器。截止频率设置在编码器信号最高频率的3-5倍。比如编码器最高输出频率为500kHz,截止频率就设在1.5-2.5MHz。这样既能滤除高频噪声,又不会过度影响信号边沿。
3.4 知识体系总览
下面这张图把编码器信号质量优化的核心逻辑串起来了:
这张图把三个优化维度串在了一起。我个人习惯的排查顺序是:先用示波器抓信号,看抖动幅度和频率特征;如果抖动与PWM开关频率同步,优先查电源去耦和布线;如果抖动是随机的,检查施密特触发器的迟滞宽度是否足够。嗯,按这个顺序走,大部分抖动问题都能在半小时内定位。