三种”顶满轨”的现场取证:CH2 和 CH6 都报 4095,一个重压端子就好,另一个是上拉接到了 5V
上一篇《多路巡检的前置 RC 与串扰辨伪实战》文末留的预告是:探头断线、地电位差、共模超范围,三种”顶满轨”怎么分、怎么取证。这篇一并答完。同时要更正上一篇里的一个数——那个数错得挺关键,先认了再说。
结论先摆出来,五条:
- 单端分压链上,”顶轨”的充要条件是下臂断开。 加进地电位差也一样:要把节点抬到 VREF,需要 ΔVg = VREF,恒等于 3.3V,与温度无关。上一篇写的”−40℃ 只需 80mV”是错的:80mV 是那一温度下到上轨的余量,不是把它吃掉所需的偏移量。两者差 41 倍,方向也反了。
- 地电位差真正的战场在热端,不在冷端。 125℃ 时只要 −0.118V 就把读数打到 0(看起来像探头短路);而 +0.3V 的偏移让 125℃ 读成 77.1℃。冷端要 −132.6V 才打得到底,物理上做不到。
- 开路读数不是恒定 4095。 74HC4051 的关断漏电手册上限就是 ±1µA,10k 上拉上压掉 10mV,读数变成 4083;采样点若还在切换后 1ms,开路只读到 2740——看起来是个 10℃ 的正常探头。
- “并一支 10k”有判决式:开路时读数恒等于
4095·P/(P+Rp),与温度无关。但同时要记住它有两个死角:冷端分辨力天花板只有 99 LSB,对着”上拉错轨”也几乎无分辨力(2068 vs 2048,差 20 LSB)。 - 真正危险的不是全断,是半断。 接触电阻 1kΩ 让 125℃ 读成 77.9℃,而且它不顶轨,任何”顶轨判据”都抓不到它。
工具照例全离线:drafts/_tools/rail_sat_forensics_calc.py,16 个模式、44 项自检断言,文中每个数都能复算。口径与《NTC 采样链路故障》、《BMS 温度门限参数表》、《8 路 NTC 巡检的时序预算》严格一致:B3950 / R25=10k / NTC 在下 / 10k 上拉 3.3V / 12bit 满量程 4095 / 1 LSB=0.806mV;前端 R_s=1k、C_node=80pF、C_f=220nF(τ=(Rp+R_s)(C_node+C_f)=2.421ms);MUX 按 74HC4051(R_on=120Ω、关断漏电 ±1µA)。
一、现场:两个 4095,修法完全不同
去年十二月,同一台 16S 200Ah 离网柜。8 路 NTC,报上来两路顶轨:
| 通道 | 位置 | 读数 | 现场动作 |
|---|---|---|---|
| CH2 | 电芯(第 3 串) | 4095(恒定) | 换过 2 个探头,无效 |
| CH6 | 电芯(第 14 串) | 4095(间歇跳变) | 换过 2 个探头,好两天又犯 |
同一张截图里,其余六路读数都在 3~9℃ 之间,正常。
运维的结论是”这两路的探头都坏了,而且是同一批次的探头有质量问题”。这个结论不对,但也不能怪他们——只看 raw,4095 确实只有一个长相。
分开查的结果:
- CH6 是端子压接不良。冷压端子只压到了绝缘皮,铜丝一根没进。去年冬天就有苗头:日志里这一路在 2049 和 4095 之间来回跳,跳了几十次又”自己好了”——那是拆装线束时把它碰通了。今年彻底开路。
- CH2 是上拉接到了 5V。这批板子改版时把 10k 上拉的供电从 3.3V 挪到了辅助 5V 轨(为了”提高抗扰”),BOM 上没体现。于是这一路的曲线被整体压缩:25℃ 时读数只有 3102,按 3.3V 基准解出来是 1.4℃。夏天有人发现 CH2 恒定比邻路低 23 度,在固件里给它加了个 −23℃ 的偏置“修好”了。
- 到冬天,5V×k 在 k>0.66(也就是 10.8℃ 以下)时超过 3.3V 基准,整段削顶,读数恒 4095。而那个 −23℃ 偏置此时把 4095 解成 −60℃,直接被123 篇的断线判据判成”探头断线”。
修法:CH6 重新压端子(30 秒);CH2 把上拉改回 3.3V、删掉那个 −23℃ 偏置(10 分钟,含改固件参数)。
这两个案例把本篇的题目说全了:同一个 4095,一个是源阻抗无穷大,一个是量程到头。前者要找线,后者要找电源轨。
二、先把数学写死:分压链只有三个数
NTC 在下、10k 上拉到 Vpull、下端的地与板地之间有 ΔVg:
V_out = ΔVg + (Vpull − ΔVg)·R/(R+Rp)
= k·Vpull + (1−k)·ΔVg 其中 k = R/(R+Rp)
raw = 4095·V_out/VREF VREF 是 ADC 基准
反解(已知 raw 求等效下臂电阻):
k = (raw/4095)·VREF/Vpull
R_eff = k/(1−k)·Rp
链路的标称曲线:
| T(℃) | R_ntc(Ω) | k | V_out(V) | raw |
|---|---|---|---|---|
| −40 | 401,860 | 0.9757 | 3.2199 | 3996 |
| −20 | 105,385 | 0.9133 | 3.0140 | 3740 |
| 0 | 33,621 | 0.7708 | 2.5435 | 3156 |
| 25 | 10,000 | 0.5000 | 1.6500 | 2048 |
| 60 | 2,486 | 0.1991 | 0.6571 | 815 |
| 85 | 1,087 | 0.0980 | 0.3235 | 401 |
| 125 | 359 | 0.0346 | 0.1143 | 142 |
注意最后一列:整条曲线从 142 到 3996,两头都够不着轨。0 和 4095 这两根轨,只有非 NTC 的东西才能到达。
三、顶轨的充要条件(更正上一篇)
令 V_out = VREF:
k·VREF + (1−k)·ΔVg = VREF
(1−k)·ΔVg = VREF·(1−k)
ΔVg = VREF
k 被约掉了。 也就是说:在单端分压拓扑里,地电位差要顶到上轨,永远需要 3.3V,跟温度一点关系都没有。
上一篇我给的那张表——”−40℃ 0.080V / −20℃ 0.286 / 0℃ 0.757 / 25℃ 1.650 / 125℃ 3.186″——那是 VREF − V_out,是到上轨还剩多少余量,不是”需要多大的偏移才能顶上去”。两者差一个 (1−k) 的倒数。−40℃ 时 (1−k)=0.0243,差 41 倍。
正确的一张表(单位 V):
| T(℃) | k | 增益 1−k | 顶轨所需 ΔVg | 底轨所需 ΔVg |
|---|---|---|---|---|
| −40 | 0.9757 | 0.0243 | 3.300 | −132.614 |
| −20 | 0.9133 | 0.0867 | 3.300 | −34.777 |
| 0 | 0.7708 | 0.2292 | 3.300 | −11.095 |
| 25 | 0.5000 | 0.5000 | 3.300 | −3.300 |
| 60 | 0.1991 | 0.8009 | 3.300 | −0.820 |
| 85 | 0.0980 | 0.9020 | 3.300 | −0.359 |
| 125 | 0.0346 | 0.9654 | 3.300 | −0.118 |
这张表读出来的东西比上一篇那张狠得多:
- 顶轨那一列是常数,所以”地电位差把读数顶到 4095″在单端拓扑里基本不可能发生。现场真出现了 4095,先查线、查上拉、查基准,不要查地。
- 底轨那一列从 −132V 掉到 −0.118V,跨了三个数量级。热端只要 −118mV 的地电位差,读数就归零;而 −118mV 在同一台柜子上太容易有了(大电流回路共地、屏蔽层两端接地、机柜接地排与采样板地之间有电流走过)。
换句话说:共模/地电位差在单端分压链上是”热端打底轨”的病,不是”冷端顶轨”的病。 方向跟上一篇写反了。
偏移 0.3V 与 −0.1V 的实际后果(表观温度):
| 真实 T(℃) | +0.3V 表观 | 误差 | −0.1V 表观 | 误差 |
|---|---|---|---|---|
| −20 | −21.7 | −1.7 | −19.5 | +0.5 |
| 0 | −2.3 | −2.3 | 0.7 | +0.7 |
| 25 | 20.9 | −4.1 | 26.4 | +1.4 |
| 45 | 37.9 | −7.1 | 47.7 | +2.7 |
| 60 | 48.9 | −11.1 | 64.6 | +4.6 |
| 85 | 63.5 | −21.5 | 97.0 | +12.0 |
| 125 | 77.1 | −47.9 | 218.9 | +93.9 |
0.3V 的偏移,在 −20℃ 只造成 1.7K 误差,在 125℃ 造成 47.9K。同一个硬件缺陷,冬天看不出来,夏天把高温降额门整个废掉——而且方向是”读低”,降额不会动作,电芯会实实在在地热着。
四、三种顶轨的完整分类学
现场说”顶满轨”,实际有七种成因。按”能不能从 raw 上直接分出来”排列:
| 成因 | 机理 | raw 形态 | 能否只靠 raw 判 | 一步验证 |
|---|---|---|---|---|
| 真开路 | 下臂 ∞(探头断/线断/端子未压接) | 4095 死平,或 4083~4095 | 能(贴轨) | 量上拉供电端 3.3V、节点 3.3V |
| 半断 | 串联接触电阻(压接不良/氧化) | 不顶轨,整体偏低,热端塌陷 | 不能 | 拔下量 NTC 阻值 |
| 上拉错轨 | 上拉接 5V/12V,基准还是 3.3V | 冷端 4095,热端曲线压缩 | 不能(同形) | 量上拉供电端 |
| 基准错配 | ADC 基准低于上拉电压(内部 2.5V/1.2V 基准) | 同上 | 不能 | 查 ADC 初始化代码 |
| 钳位 | 节点被 ESD 二极管钳到 VDD+0.7 | 4095 死平,且 3.3V 轨被泵高 | 不能 | 量节点电压 >3.3V |
| 通道坏 | MUX 未闭合/漏电大/通道映射错 | 任意,常为 4095 或 0 | 不能 | 换一支电阻到端子 |
| 短路 | 下臂 0(进水/线间短路) | 0 死平 | 能 | 量节点 0V、上拉端 3.3V |
| 上拉虚焊 | Rp=∞,节点被 NTC 拉到 0 | 0 死平(像短路) | 不能 | 量上拉端是否 0V |
| 负向地偏移 | ΔVg<0,热端明显 | 热端 0,冷端正常 | 不能(像短路) | 冷热两端读数对比 |
九行里只有两行能”看数就定”。这就是为什么现场必须带万用表——不是带示波器,是带万用表。
五、绝对值的分辨力:4095 和 4083 差着什么
反解表(把 raw 换算回等效下臂电阻):
| raw | 等效下臂 R | 若真是 NTC 则 T |
|---|---|---|
| 20 | 49 Ω | 224.9℃ |
| 142 | 359 Ω | 125.0℃ |
| 3996 | 403.6 kΩ | −40.1℃ |
| 4050 | 900 kΩ | −50.6℃ |
| 4083 | 3.40 MΩ | −66.1℃ |
| 4090 | 8.18 MΩ | −75.2℃ |
| 4094 | 40.9 MΩ | −90.0℃ |
| 4095 | ∞ | — |
开路读数的下限由引脚漏电决定。74HC4051 的关断漏电手册上限是 ±1µA,这个电流在 10k 上拉上就是 10mV:
| 引脚漏电 | 节点电压 | raw |
|---|---|---|
| 0 | 3.3000 | 4095 |
| 0.1 µA | 3.2990 | 4094 |
| 0.5 µA | 3.2950 | 4089 |
| 1.0 µA | 3.2900 | 4083 |
| 2.0 µA | 3.2800 | 4070 |
所以:
- 固件里写
raw == 4095判开路,在 74HC4051 上会漏掉一半。芯片温度高一点、漏电大一点,开路就只有 4083。 - 写
raw >= 4089(等价 R ≥ 6.8MΩ)能覆盖 0.5µA 以内的漏电,这是本篇推荐的阈值。 - 123 篇定的 4050 门(等价 900kΩ)更保守,能把 1µA、2µA 的情况都收进去,代价是把 −50℃ 以下的真实低温误判成故障——离网柜不会在 −50℃ 工作,这个代价可以付。继续用 4050,不用改。
顺带说一句数字上的巧合:−40℃ 的 3996 与 4050 门之间只隔 54 LSB,折 7.7K。也就是说断线门离”真实最低温”只有 7.7 度的余量。这条余量在 123 篇算过,本篇不重复。
六、抖动形态:死平、二值、连续
绝对值只回答”到没到轨”,抖动形态回答”是死是活”。三种指纹:
| 形态 | 时间序列长相 | 物理成因 | 现场含义 |
|---|---|---|---|
| 死平 | 全部 4095,去重 1~3 个值 | 源阻抗 ∞,被上拉钉死 | 真断/上拉错轨/钳位 |
| 带噪贴轨 | 4083~4095 之间抖 | 漏电抖动,或无滤波拾噪 | 仍是断,但滤波不足 |
| 二值跳变 | 2048 与 4095 交替,无中间态 | 机械接触(压接/焊点/插头) | 换端子,别换探头 |
| 连续下滑 | 每帧掉几 LSB,无跳变 | 接触电阻氧化/受潮 | 半断,最危险 |
| 大幅抖动 | σ>30 LSB,不到轨 | 悬空拾噪/接地环流 | 查屏蔽与地 |
“二值跳变”这一条值得记住:机械接触的阻值只有两个状态——通(毫欧级)和断(兆欧级),中间的过渡区极窄。所以它在 raw 上表现为两个离散值之间来回跳,中间几乎没有采样点。而传感器漂移、受潮、接触电阻氧化都是连续变化的。这个区别在现场非常好用:看到二值跳变,直接去动端子,不用想别的。
一个够用的分类器(只分形态,不下结论):
typedef enum { RAW_OK, RAW_DEAD_HI, RAW_NOISY_HI,
RAW_BIMODAL, RAW_DEAD_LO } raw_class_t;
raw_class_t classify(const uint16_t *s, uint8_t n)
{
uint8_t hi = 0, lo = 0, jump = 0, i;
for (i = 0; i < n; i++) {
if (s[i] >= 4050) hi++;
if (s[i] <= 20) lo++;
if (i) {
int16_t d = (int16_t)s[i] - (int16_t)s[i - 1];
if (d > 100 || d < -100) jump++;
}
}
if (hi == n) return jump ? RAW_NOISY_HI : RAW_DEAD_HI;
if (lo == n) return RAW_DEAD_LO;
if (jump >= 2) return RAW_BIMODAL;
return RAW_OK;
}
阈值 4050 来自 123 篇,100 LSB 是”机械跳变”与”慢漂”的分界(1 小时掉 100 LSB 已经是 14K@−40℃,不可能是正常工况)。
七、半断比全断更危险
接触电阻串联在下臂,阻值不变,但它和 R_ntc 是串联关系,误差随 R_ntc 变小而放大:
| 真实 T | R_ntc | +10Ω | +100Ω | +1kΩ | +10kΩ |
|---|---|---|---|---|---|
| −20 | 105,385 | −20.0 (−0.0) | −20.0 (−0.0) | −20.2 (−0.2) | −21.5 (−1.5) |
| 0 | 33,621 | −0.0 (−0.0) | −0.1 (−0.1) | −0.6 (−0.6) | −4.8 (−4.8) |
| 25 | 10,000 | 25.0 (−0.0) | 24.8 (−0.2) | 22.9 (−2.1) | 10.2 (−14.8) |
| 45 | 4,348 | 44.9 (−0.1) | 44.4 (−0.6) | 39.8 (−5.2) | 17.1 (−27.9) |
| 60 | 2,486 | 59.9 (−0.1) | 58.9 (−1.1) | 50.8 (−9.2) | 20.1 (−39.9) |
| 85 | 1,087 | 84.7 (−0.3) | 82.2 (−2.8) | 65.0 (−20.0) | 22.7 (−62.3) |
| 125 | 359 | 123.9 (−1.1) | 115.4 (−9.6) | 77.9 (−47.1) | 24.2 (−100.8) |
1kΩ 的接触电阻,在 125℃ 处等于 47 度的误差。 机理很简单:359Ω 里塞进 1kΩ,那就是 74% 的偏差;同样 1kΩ 塞进 402kΩ,只占 0.25%。所以这个病只在热端露头,冷端完全正常。
而它的 raw 形态是:25℃ 时 raw 从 2048 变成 2145(读 22.9℃),125℃ 时从 142 变成 490(读 77.9℃)。整个过程一次都不顶轨,一次都不越界。
这意味着:
- 任何”只看顶轨”的断线判据对半断完全无效;
- 高温降额(122 篇的 45℃/50℃/55℃ 三张门)会被静默旁路——真实 55℃ 读成 36℃,什么都不动作;
- 唯一能抓到它的是相对判据:同一电流段内温升斜率低于柜中位数 30%(123 篇)、或同一面电芯的正/负极端子温差超 3K(124 篇定位工装那一条)。
一句话:全断会被判据抓到,半断只能被”比较”抓到。
八、开路读数的两个陷阱
8.1 漏电把 4095 拉下来
见第五节。1µA 就是 4083。所以别写 == 4095。
8.2 采样点太早,开路看起来是个正常探头
开路之后,节点从上拉经 Rp 向 C_f 充电:
τ = (Rp + R_s)(C_node + C_f) = (10k+1k)(80p+220n) = 2.421 ms
| 距切换 | t/τ | 残差 | 节点 | raw | 表观温度 |
|---|---|---|---|---|---|
| 0.1 ms | 0.041 | 95.95% | 1.717 | 2130 | 23.2℃ |
| 0.5 ms | 0.207 | 81.34% | 1.958 | 2430 | 16.7℃ |
| 1 ms | 0.413 | 66.16% | 2.208 | 2740 | 10.0℃ |
| 2 ms | 0.826 | 43.77% | 2.578 | 3199 | −1.1℃ |
| 5 ms | 2.065 | 12.68% | 3.091 | 3835 | −25.3℃ |
| 10 ms | 4.131 | 1.61% | 3.273 | 4062 | −54.5℃ |
| 25 ms | 10.33 | 0.00% | 3.300 | 4095 | 断 |
(起点取上一路的典型值 1.65V。)
这张表解释了现场一个很常见的怪事:有的柜子探头断了,读数不变 4095,而是显示”某一路比其他路低 15 度”,而且这 15 度还随季节变。 因为它的固件在切换后 1~2ms 就取样了,开路只是把节点拉到一个中间值。
这也把 127 篇的结论补全了:把采样点挪到 slot 尾部(25ms = 10.3τ)之后,开路才会干脆利落地顶到 4095。“开路=4095″不是物理定律,是”等够了”才成立的。
九、并一支电阻:判决式与两个死角
手里没有别的工具时,在节点与板地之间并一支 P,然后看读数。开路时读数只由 P 决定:
raw_open = 4095 · P/(P + Rp) ← 与温度无关
这条是判决式:并 10k → 2048;并 100k → 3723;并 1M → 4091。若量出来的正好是这个值(±1%),说明下臂确实断了,因为没有哪支 NTC 会在任何温度下恰好等于你并上去的那支电阻。
四种工况并 10k 的读数:
| 工况 | 25℃ | 0℃ | −40℃ |
|---|---|---|---|
| 正常(NTC 在下) | 1365 | 1782 | 2022 |
| 探头开路 | 2048 | 2048 | 2048 |
| 探头短路 | 0 | 0 | 0 |
| 上拉接 5V | 2068 | 2701 | 3064 |
两个死角,必须知道:
死角一:对”上拉错轨”几乎没有分辨力。 25℃ 时开路读 2048、5V 错轨读 2068,只差 20 LSB。你会把 CH2 判成断线,然后换探头,然后失败——本案例里运维就是这么绕进去的。判错轨只能量电压。
死角二:冷端分辨力有天花板。 “并阻后读数”与”正常读数”的差值:
| T(℃) | 不并 | 并 10k | 并 100k | 并 1M |
|---|---|---|---|---|
| −40 | 99 | 26 | 83 | 97 |
| −20 | 355 | 93 | 296 | 348 |
| 0 | 939 | 266 | 793 | 922 |
| 25 | 2047 | 683 | 1773 | 2017 |
| 60 | 3280 | 1368 | 2924 | 3240 |
| 125 | 3953 | 1911 | 3582 | 3912 |
−40℃ 时不管并多大,差值都在 99 LSB 以内——因为那一温度下 k 已经是 0.976,开路与正常的电压差本来就只有 80mV。冬天别在冷端用并阻法,用电压表。
十、换一支 10k 到端子:把”板”和”现场”切开
最快的一步,也是最容易被跳过的一步:拔掉探头,在端子上插一支 10k 电阻(功率无所谓,1/4W 足够)。
| 板侧状态 | raw 预期 | 结论 |
|---|---|---|
| 正常分压 | 2048 ± 41 | 板与固件正常,问题在探头/线/端子 |
| 仍然顶轨 | ≥4090 | 板侧:上拉、基准、MUX、通道映射 |
| 仍然为 0 | ≤20 | 上拉虚焊,或节点短地 |
±41 来自两支电阻各 1% 的公差(±2%×2048)。
这一步的价值在于它是唯一能把责任一刀切开的动作。切完之后,问题要么在板上(那就拆板),要么在现场(那就爬梯子)。没有这一步,所有讨论都是猜。
十一、量程错配:整柜在同一温度集体顶轨
这是最容易误判的一类,因为它的现场长相是”好几路同时坏“,而人本能地认为是”这批探头不行”。
削顶的临界温度,就是 Vpull·k = VREF 解出来的温度:
| 上拉供电 | ADC 基准 | 削顶起始温度 |
|---|---|---|
| 5.0V | 3.3V | 10.8℃ 以下 |
| 3.3V | 2.5V(内部基准) | 1.4℃ 以下 |
| 3.3V | 3.0V | −19.1℃ 以下 |
| 3.3V | 1.2V | 38.1℃ 以下 |
| 12.0V | 3.3V | 48.5℃ 以下 |
(最后一行的 12V 上拉不是笑话:24V 系统里从电池直接取电做上拉,很常见。)
上拉 5V / 基准 3.3V 的完整曲线:
| T(℃) | 节点(V) | 未削顶 raw | 实际 raw | 表观温度 |
|---|---|---|---|---|
| −10 | 4.267 | 5295 | 4095 | 顶轨 |
| 0 | 3.854 | 4782 | 4095 | 顶轨 |
| 10 | 3.343 | 4148 | 4095 | 顶轨 |
| 15 | 3.065 | 3803 | 3803 | −23.4℃ |
| 25 | 2.500 | 3102 | 3102 | 1.4℃ |
| 45 | 1.515 | 1880 | 1880 | 28.7℃ |
| 60 | 0.996 | 1235 | 1235 | 45.2℃ |
| 125 | 0.173 | 215 | 215 | 108.3℃ |
25℃ 读 1.4℃,125℃ 读 108.3℃——整条曲线被”压”进了低端,而且低温段顶死。
判据很干脆:如果同一台柜子里有两路以上在同一个温度附近同时顶轨,一定是量程问题,不是探头问题。 探头不会约好同一天坏。
补一句:固件里给某一路加”温度偏置”来修读数,是最危险的一种临时修补。偏置不会改变量程,顶轨之后 4095 + 偏置 会被解成一个更离谱的数(本案是 −60℃),把量程病伪装成断线病。
十二、共模超范围:单端里是同义词,差分里才是独立的病
在单端分压拓扑里,”共模抬升”和”地电位差”是同一个物理量的两个名字——都是 ΔVg,都只能把读数往下推(见第三节)。它们只在”怎么测、怎么修”上分开,不在物理上分开。
真正让”共模超范围”独立成病的,是差分前端(INA 或带 PGA 的差分 ADC)。此时代谢的是输入共模窗口:
CM = (V+ + V−)/2 窗口 ≈ (V−)+0.1V ~ (V+)−0.1V
量 NTC 两端(下臂)时 CM = V_node/2:
| T(℃) | V_node(V) | CM(V) | 判定 |
|---|---|---|---|
| −40 | 3.2199 | 1.6099 | OK |
| 0 | 2.5435 | 1.2717 | OK |
| 25 | 1.6500 | 0.8250 | OK |
| 60 | 0.6571 | 0.3285 | OK |
| 100 | 0.2152 | 0.1076 | 贴边 |
| 125 | 0.1143 | 0.0572 | 低于下窗 |
热端失效点在 102.8℃:R<645Ω 时 CM<0.1V,差模还有 114mV 很好测,但 INA 已经出了共模范围,输出会掉到非线性区或直接钳位。这就是”共模超范围”的典型长相:差模正常,输出不对。
如果你的差分前端是量 Rp 两端(上臂),失效点换到冷端:−26.1℃ 以下,因为 CM=(3.3+V_node)/2 在冷端达到 3.26V,超过 3.3V 供电 INA 的上窗 3.2V。
两个结论:
- 差分前端的共模病在两端,中间是安全的。 设计时把激励电压降到 1.2V(CM 中点 0.6V),或者改成恒流激励(CM 固定),窗口就宽了。
- “差模好测”不等于”能测”。 选 INA 时只看增益和失调,不看共模窗口,就会在 100℃ 以上或者 −25℃ 以下掉进这个坑,而且现象是”读数卡住不动”,很容易被判成探头故障。
十三、钳位不是保护,是往 3.3V 轨灌电流
节点被 5V 上拉抬到 VDD+0.7 以上,ADC 输入的 ESD 二极管开始导通。以 −40℃ 为例:
| T(℃) | 无钳位节点(V) | 单路钳位电流 | 8 路合计 | 实际 raw |
|---|---|---|---|---|
| −40 | 4.879 | 90.0 µA | 720 µA | 4095 |
| −30 | 4.762 | 80.0 µA | 640 µA | 4095 |
| −20 | 4.567 | 62.0 µA | 496 µA | 4095 |
| −10 | 4.267 | 31.3 µA | 251 µA | 4095 |
| 0 | 3.854 | 0(节点仍高于 3.3V) | — | 4095 |
| 25 | 2.500 | 0 | 0 | 3102 |
三件事同时发生:
- 读数恒 4095(与开路同形);
- 720µA 被灌进 3.3V 轨。LDO 大多不能倒灌,轨会被抬起来——抬轨之后所有通道一起偏,于是又多出一个”整柜同向偏”的假象;
- 二极管长期导通会加速老化,几个月后这一路的漏电变大,开路读数从 4095 掉到 4083 以下,判据开始漏判。
钳位区最坑的地方是它掩盖了自己:读数看起来像”探头断了”,实际是”上拉接错”。判据只有一个:量节点电压,超过 3.3V 就是钳位。
十四、现场三步法
一支万用表,不用示波器。三步,按成本从低到高。
第一步:看数(0 成本)
- raw 是否顶轨/打底轨;
- 抖动形态(死平/二值/连续/大抖);
- 与同柜邻路的差(>3K 就要查);
- 是否多路同时(同时 = 量程问题)。
第二步:量压(三个点)
万用表直流档,量三个点对板地:节点(=NTC 上端)、探头地(NTC 下端)、上拉供电端(Rp 上端)。
| 节点(V) | 探头地(V) | 上拉端(V) | 结论 |
|---|---|---|---|
| 3.30 | 0.00 | 3.30 | 下臂开路(探头/线/端子) |
| 3.30 | 0.00 | 5.00 | 上拉接错轨 |
| 3.30 | 0.90 | 3.30 | 地电位差 +0.9V |
| 2.47 | 0.00 | 5.00 | 上拉 5V 但常温:曲线整体偏低 23℃ |
| 0.00 | 0.00 | 3.30 | 下臂短路 |
| 0.00 | 0.00 | 0.00 | 上拉虚焊(像短路,其实不是) |
| 1.65 | 0.00 | 3.30 | 电气正常 → 问题在 MUX/ADC/通道映射 |
(表按 25℃、Rp=10k、VREF=3.3V 计。其他温度下节点电压查第二节的表。)
第三步:换阻(10 秒)
拔探头,端子插 10k:2048±41 → 现场问题;≥4090 → 板侧;≤20 → 上拉虚焊。
现场核对清单
- ☐ 先数有几路顶轨:1 路查线,2 路以上先查量程
- ☐ 看抖动:二值跳变直接动端子,别换探头
- ☐ 量节点电压:>3.3V 是钳位,=3.3V 是开路,<正常值是偏移
- ☐ 量上拉供电端:不是 3.3V 就是错轨,记下来改 BOM
- ☐ 量探头地对板地:>50mV 就要处理,热端 >100mV 已经在打底轨
- ☐ 拔探头插 10k:一次切开”板”与”现场”
- ☐ 查固件里有没有”温度偏置”补丁:有就先删掉再判
- ☐ 查采样点:切换后 <5ms 的,开路可能不顶轨,判据要按第八节放宽
十五、设计评审表
| 项目 | 判据 | 本例取值 | 备注 |
|---|---|---|---|
| 上拉供电 | 必须等于 ADC 基准 | 3.3V / 3.3V | 跨轨是最常见的顶轨成因 |
| 上拉与基准同源 | 同一 LDO 同一走线 | 是 | 免掉一整类量程病 |
| 断线判据 | raw ≥ 4050(R≥900k) | 4050 | 不用 ==4095 |
| 短路判据 | raw ≤ 20(R≤49Ω) | 20 | 上拉虚焊同形,需量电压 |
| 采样点 | ≥10τ(τ=2.421ms) | 25ms | <5ms 时开路不顶轨 |
| 前端漏电 | ≤0.1µA(若用 100k 上拉) | 74HC4051 ±1µA | 100k 上拉必须换低漏 MUX |
| 地电位差 | 热端 ≤10mV | 单点接地 | 热端增益 0.965,几乎 1:1 |
| 差分共模 | 全温区留 0.2V 余量 | 激励降到 1.2V | 冷端/热端两个失效端 |
| 钳位 | 正常工况不导通 | 3.3V 上拉 | 一导通就往轨里灌电流 |
| 偏置补丁 | 禁止 | 0 处 | 会把量程病伪装成断线病 |
| 半断检测 | 相对判据(斜率/一致性) | 123/124 篇 | 顶轨判据抓不到 |
最后收成三句话。
第一,4095 只有两个来源:下臂断了,或者量程到头了。 前者查线,后者查电源轨。地电位差在单端分压链上顶不到上轨——它要 3.3V,而它在热端只要 −118mV 就能把读数打到 0,那才是它该出现的地方。
第二,判据要按”能不能区分”来设计,不是按”好不好写”来设计。 raw == 4095 漏掉一半开路,raw >= 4050 只多付 7.7K 的低温余量;并 10k 在常温好用、在 −40℃ 只有 26 LSB 分辨力;顶轨判据抓得住全断、抓不住半断。每一条判据都有它的失效边界,写进评审表比写进代码更重要。
第三,最贵的错误是”加个偏置修一下”。 本案例里 CH2 的 −23℃ 偏置在夏天让读数看起来正常,在冬天把量程病变成了一条 −60℃ 的断线告警,让两个人换了四个探头。读数不对时,先找物理原因,别找数学原因。
工具:drafts/_tools/rail_sat_forensics_calc.py(16 个模式、44 项自检断言,纯标准库、全离线)。口径:B3950 / R25=10k / NTC 在下 / 10k 上拉 3.3V / 12bit 满量程 4095 / 1LSB=0.806mV;R_s=1k、C_node=80pF、C_f=220nF、R_on=120Ω(74HC4051)、关断漏电按手册上限 ±1µA;INA 共模窗口按 3.3V 供电、上下各留 0.1V 计。文中现场案例是按脚本口径重构的,不是原始录波;具体器件请按自己手上的 datasheet 替换。
另:9 月 26 日那篇《ESD 与浪涌防护实战》里”12.5kV 应为 12.5V”的笔误还没改,等排期。站内至今仍缺《Flash 存储与参数管理》和《固件安全与逆向防护》两个主题,都在待写清单上。
下一篇换个方向,写《固件读出保护与签名固件升级》——从选项字节(RDP/读保护等级)到签名链(哈希、签名、回滚保护),再到产线密钥注入的工装与流程。温度这条线已经连写九篇,该换换脑子了;而”固件被人读出来”这件事,比探头断线贵得多。