PNH3348读头标称0~+12dB AGC,但初始光幅设错,会导致850nm LED老化到25%才触发OAG报警

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

PNH3348读头标称0~+12dB AGC,但初始光幅设错,会导致850nm LED老化到25%才触发OAG报警

我桌上摆着两块读头板。左边是PNH2628,右边是PNH3348。同一个码盘,同一个850nm AlGaAs LED模组,同一套光路,同一个安装条件。真正的区别只有一个:PNH3348有AGC,PNH2628没有。

老化测试跑完以后,我把两组数据放在一起看,突然有点后背发凉。以前看PNH3348的AGC范围,0dB到+12dB,我脑子里第一反应是:哦,多了一个自动增益,信号能稳一点。 但那天我才意识到,12dB不是一个简单的增益指标,它其实是一张LED寿命预算表。

因为+12dB对应的是电压增益4倍。换句话说,当光电流掉到初始值的1/4时,PNH3348刚好可以把增益拉满,把信号幅度补回来。

1/4,就是25%。 也就是-12dB。

这件事听起来很简单,但它的工程含义很狠:只要LED亮度还剩25%以上,AGC就能在芯片内部默默把这个损耗吃掉。你的上位机看到的编码器信号,可能还是挺漂亮的,幅度也正常,角度也能算,系统看起来一切安好。

可一旦LED亮度跌破25%,AGC就没钱了。它已经把能借的增益都借完了。这个时候信号幅度开始往下掉,PNH3348的OAG,也就是光信号告警管脚,才会拉低报警。

所以问题来了:OAG报警的时候,LED不是刚开始老化,而是已经老化到只剩25%左右了。

这就像车子不是油表刚掉一格就提醒你,而是已经快见底了,才在仪表盘上亮灯。你当然可以说它有报警,比没有强。但你要是把它当成“早期预警”,那就容易误判。

12dB到底在替谁兜底

先别急着谈寿命,先把12dB这笔账算清楚。

PNH3348的AGC增益范围是0dB到+12dB。电压增益从1倍到4倍。假设一开始光信号是100%,LED老化以后慢慢变暗,光电流跟着掉。掉到50%的时候,AGC只要补6dB,信号还能回到原来的幅度。掉到25%的时候,AGC要补满12dB,刚好还能撑住。

再低,就撑不住了。

这就是AGC最容易让人误会的地方。它把很多问题藏起来了。LED在变暗,码盘可能在变脏,气隙可能有轻微变化,安装状态也可能慢慢漂,但只要这些变化还在AGC补偿范围内,外面看到的信号就像没事一样。

所以PNH3348比PNH2628强在哪里?不是说它让LED不会老化,也不是说它让光路不会出问题。它只是把这些变化先吞进AGC里面,再在吞不下的时候,通过OAG告诉你:账花完了。

这句话挺关键。

AGC不是消灭老化,AGC只是延迟你看到老化。OAG不是老化开始的铃声,而是AGC预算见底的敲门声。

LED老化这笔账,其实可以粗算

850nm AlGaAs LED有个常见寿命说法叫L70,也就是亮度衰减到初始值70%时所经过的工作时间。这个不是“失效时间”,更像一个行业里常用的标称寿命点。

比如在70℃结温下,假设某类850nm AlGaAs LED的L70大约是15000小时。按一年工作2000小时算,L70大概是7.5年。

但PNH3348的OAG报警阈值,不是70%。 它真正对应的,是AGC补偿到头以后,光信号继续不够了。按12dB来算,大概就是25%附近。

那从100%掉到25%,大概要多久?

可以用一个很粗的指数衰减模型来估:

Φ(t) = Φ₀ × exp(-t/τ)

当Φ/Φ₀ = 0.70,t = 15000小时。反推τ:

τ = 15000 / (-ln0.70) ≈ 42200小时。

再算Φ/Φ₀ = 0.25的时候:

t = -τ × ln(0.25) ≈ 42200 × 1.386 ≈ 58500小时。

也就是接近5.85万小时。按每年2000小时算,大约29年。

看到这个数字,很多人第一反应可能是:那挺好啊,基本不用管了。

正常低温、低应力、光路余量足的情况下,确实可能很久都碰不到OAG。但问题是,编码器读头很少活在理想世界里。你把它塞进电机尾部、关节壳体、机器人轴端、伺服模组里面,温度、散热、灰尘、反射、气隙,全都可能不听话。

如果结温从70℃跑到90℃,很多LED老化模型里会按“温度每升高10℃寿命大约减半”去做工程估算。那L70可能从15000小时压到7500小时,甚至更低。对应掉到25%的时间,也会明显缩短。

这时候OAG就不是几十年后的事情了。对于一些高温、长时间运行的设备,几年后触发并不奇怪。

真正麻烦的不是“它会不会报警”,而是:它报警的时候,你还有没有维护窗口。

初始光幅设在哪里,比很多人想得重要

我以前也有一个直觉:既然PNH3348有AGC,那是不是一开始把信号打得越满越好?LED亮一点,码盘信号大一点,SNR好一点,看起来更稳。

后来发现这事不能这么想。

如果初始信号一上来就贴着满量程,AGC初始增益接近0dB,那确实信号幅度看起来很漂亮。但问题是,信号再往上就没什么空间了。气隙稍微变小一点,反射增强一点,局部光斑强一点,就容易碰到上边界。更重要的是,AGC虽然理论上还有向上补偿的12dB,但你的系统工作点已经非常靠上,它的“动态余量”并不舒服。

反过来,如果你一开始把信号设得太低,比如只有满量程的50%左右,AGC初始就要补大约+6dB。看起来好像上下各留一半,很平衡。可从50%掉到25%,只有一半的衰减空间。也就是说LED只要再衰减6dB,AGC就接近拉满了。对于寿命预算来说,这其实不划算。

我现在更倾向的设计点,是让初始信号幅度落在满量程的65%~75%之间。换成AGC初始增益,大概是+2.5dB到+3.7dB这个区间。

这个位置比较像一个折中点。信号不低,atan2角度噪声不会太难看;同时往下还有大约8.5dB到9.5dB的补偿空间,可以给LED老化、气隙变大、污染、光路衰减留预算。往上也还有一点回退空间,遇到反射增强、局部强光、安装偏差时,不至于一开始就顶死。

这不是说65%~75%就是所有项目的金科玉律。不同码盘、不同LED、不同安装气隙、不同转速、不同温度,最后都要靠实测定。但它至少提醒我一件事:AGC初始值不能只当调试时的一个“看着正常”的数,它是后面寿命曲线的起点。

起点设错了,后面所有报警时间都会跟着错。

PNH2628的问题不是不能用,而是它沉默

再看PNH2628。

PNH2628没有AGC。它不是不能用,很多场景当然可以用。但它的逻辑很朴素:光信号变小,差分信号幅度就跟着变小。幅度变小以后,atan2算角度时,噪声占比就变大。

角度误差可以粗略写成:

εθ ≈ σnoise / A

A是正弦余弦信号幅度,σnoise是电气噪声。信号幅度A从100%掉到70%,同样噪声下,角度误差大约增加43%。如果掉到50%,角度误差差不多翻倍。

这件事在实验室里很好理解,但在设备现场就很讨厌。因为它不一定会突然坏。它可能只是慢慢变差,慢慢抖,慢慢让伺服调起来没那么舒服,慢慢让某个速度段出现异响,慢慢让某个关节定位重复性不如以前。

最烦的是,你不知道它到底是LED老化了,还是码盘脏了,还是气隙跑了,还是线缆噪声上来了。

PNH2628没有AGC,也就没有AGC趋势可以看。没有OAG这种光信号诊断,也就少了一个把问题拉出来的出口。它不是马上让你翻车,它是让你在不知道什么时候,开始多一个排查方向。

PNH3348的优势就在这里。它不是神,它只是愿意把内部正在发生的补偿动作告诉你。只要你能把AGC寄存器读出来,就可以把“信号还正常”这句话拆开看:到底是真的正常,还是AGC在替你硬撑。

ADER9830P读AGC,价值不在报警,而在趋势

我调的这块板子上,PNH3348后面接的是ADER9830P。它可以通过SPI去读PNH3348的AGC寄存器值,拿到当前增益挡位。

这件事比OAG本身更有意思。

因为OAG是结果,AGC趋势是过程。

如果你只看OAG,那它拉低的时候,AGC已经差不多顶到头了。你知道出问题了,但你不一定还有从容处理的时间。可是如果你把AGC值记录下来,每隔一段时间做一次趋势分析,事情就不一样了。

比如一台设备出厂时,PNH3348初始AGC在+3dB附近。运行一年后变成+4dB,两年后变成+5dB,三年后变成+6dB。这个时候系统可能还没有任何报警,角度输出也还算正常,但你已经能看到光链路预算在被消耗。

如果某一天它已经从+3dB爬到+9dB,那你就知道只剩大约3dB缓冲了。这个时候换LED,或者安排维护窗口,是计划维修;等OAG拉低再去处理,就很可能变成现场急救。

工业系统里,计划维修和现场急救,完全是两种成本。

这也是我越来越觉得AGC寄存器值有价值的原因。它不只是调试参数,也不是为了让工程师截图好看。它更像是一个“光路健康度”的长期指标。

当然,这个前提是你得把初始值记下来。没有出厂基线,后面只看一个绝对AGC值,意义会弱很多。+7dB到底是危险,还是本来设计就偏低?不知道。只有知道它从哪里来,才知道它往哪里去。

但我还没想明白灰尘这个问题

说到这里,PNH3348看起来好像已经把问题解决得差不多了:有AGC,有OAG,还能通过ADER9830P读趋势。可我实际调的时候,最让我不舒服的反而不是LED老化,而是灰尘。

LED老化是慢变量。它不会今天100%,明天突然70%。正常情况下,它是慢慢掉,AGC也是慢慢往上爬。

但码盘表面如果有一粒反光灰尘,事情就变得很麻烦。

关节转到某个角度,灰尘刚好进入光路,局部反射突然增强,AGC可能瞬间把增益压低。过了这个角度,反射消失,AGC又恢复。你在寄存器里看到的,就是一次下跳,然后回来。

这类瞬态波动其实还好办。因为它很快,毫秒级,或者只在某一小段角度出现。用时间常数、滑动平均、中位数滤波,基本可以把它从LED老化趋势里剥出去。

真正麻烦的是另一种情况:灰尘不是飘过,而是长期附着在码盘某个扇区。

它每转一圈都来一次。每次到那个角度,信号就局部异常。你如果只按时间去看AGC趋势,就可能看到一串反复波动的数据。更麻烦的是,如果设备长期在某个角度范围内往复运动,而不是整圈旋转,这个局部污染就可能被采样得特别频繁。最后趋势算法可能误以为:光信号在持续恶化。

但这不一定是LED老化。它可能只是码盘某个扇区脏了。

所以我现在更倾向于不要只按时间看AGC,而要把AGC和角度位置绑定起来看。

如果整圈的平均AGC在慢慢上升,而且各个角度位置都差不多一起抬高,那更像LED整体衰减,或者全局光路衰减。 如果只有某几个角度扇区反复出现突变,而其他角度正常,那更像码盘局部污染、局部反射、局部缺陷。 如果AGC变化和温度高度相关,那还要怀疑LED温漂、光电器件响应、模拟前端漂移,而不是直接下结论说LED老化。

这就是这个问题真正有意思的地方:AGC寄存器读出来只是第一步,怎么解释它,才是工程问题。

我在ADER9830P的滤波配置里找过,目前没看到专门针对这种“局部灰尘”和“LED慢老化”区分的现成说明。也可能是我还没翻到,也可能是这个问题本来就需要系统侧自己做诊断策略。

我的直觉是,后面真要做得靠谱,至少要记录三类数据:AGC随时间的慢趋势,AGC随角度位置的分布,AGC随温度的变化。只看一个值,很容易讲故事;三条线放在一起,才比较像诊断。

所以这次测试真正提醒我的是什么

这轮老化测试做完,我对PNH3348的看法有点变了。

以前我会说:PNH3348比PNH2628多了AGC,抗LED衰减能力更好,还有OAG报警。这个说法没错,但太平了,像数据手册复述。

现在我更愿意这样说:

PNH3348的12dB AGC,是把850nm LED从100%衰减到25%之间的那段光强损失,先变成内部增益补偿,再变成可读取的寿命趋势。

但这句话后面还要补一句:

OAG不是早期预警。OAG拉低的时候,AGC预算已经接近花完了。

所以真正要用好PNH3348,不是等OAG报警,而是从一开始就把AGC当成寿命账本来用。

出厂时,把初始光幅和初始AGC记下来。 设计时,别把信号幅度顶得太满,也别压得太低。 运行时,定期读AGC趋势,不要只看角度值正常不正常。 诊断时,把AGC变化和角度、温度、运行时间放在一起看,别一看到增益变化就直接归因LED老化。

PNH2628像一个沉默的读头。LED慢慢暗,信号慢慢小,角度噪声慢慢变大,它不太会主动告诉你。 PNH3348不一样。它会先替你扛一段,再把账单递出来。

但工程上最怕的就是账单递出来太晚。

所以我现在看PNH3348的OAG,不再把它当成一个普通报警脚。它更像一句话:

“我已经帮你撑了12dB,后面该你处理了。”

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

关注公众号「如是有为」

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