NTC 采样链路故障在线判据实战:探头松了三个月监控上一切”正常”,受潮让 0℃ 禁充门悄悄变成 5℃——断线、短路、卡死、漂移四类故障,判据、余量、误报率和故障注入一次配齐

2026年10月22日 0 By admin

上一篇《BMS 温度门限参数表实战》里,我把 23 处门限收成了一张表,其中 NTC 断线判据只给了一种:raw 落在合法窗 142~3996 之外、连续 5 次确认。文末预告了本期——因为那只覆盖了四类故障里最”响”的两类。

剩下两类恰恰是最危险的:不报警、不越界,只是让读数悄悄错几度。一次巡检拆开 12 台柜子里的 3 台,发现两台柜子的 2 号模块 NTC 探头已经松脱——顶在安装孔的气隙上,跟了环境温度三个月。监控上这三个月”一切正常”,因为读数没越窗、没跳变,只是每次充电温升都比别的模块”温和一点”,没人把这当故障。另一台柜子更典型:端子受潮,等效并联了约 100kΩ 漏电阻,0℃ 的电芯读出来是 4.8℃,低温禁充门整个冬天一次都没触发过。

这篇就把四类故障——开路、短路、卡死、漂移(受潮/接触电阻/上拉老化)加上探头的”第五类:松脱”——的在线判据、余量账、误报率和故障注入测试一次配齐。链路口径与上篇完全一致:B3950 / R25 10k / 上拉 10k / 3.3V / 12-bit ADC,NTC 在下(接地侧)。本文所有数字都可以用我发布的离线脚本复算,方法同《多簇并联环流》篇,先给工具后讲道理。

一、为什么”窗口判据”只够两类故障

先把四类故障按”raw 信号指纹”分个类,你就知道窗口为什么不够用:

故障 raw 指纹 越不越窗
开路(插头脱落/线断) 冲到 4095(贴上轨) 越
短路(引脚短接/对地) 掉到 0(贴下轨) 越
卡死(ADC/MUX 冻结) 停在任意合法值不动 不越
漂移(受潮/接触电阻/上拉老化) 沿曲线整体平移几 K 不越
松脱(探头离面) 动态响应变钝,静置读数正常 不越

窗口判据(上篇的 142~3996)本质上只回答一个问题:这个 raw 值物理上可不可能由某个真实温度产生。卡死、漂移、松脱三类产生的 raw 全部落在合法窗内,窗口对它们是盲的。所以判据体系必须是分层的:窗口管”信号在不在”,卡死判据管”信号动不动”,相对判据(双探头/整柜对比)管”信号对不对”。

这三层和上篇的参数表是什么关系?上篇的门限是”拿温度做决策”的消费侧,本篇是”确认温度可不可信”的生产侧。生产侧判掉的通道,进消费侧之前就先降级,门限表根本不该拿它当输入——这个衔接在第十一节讲。

二、先复算基准:整条链路在不同温度下的分辨率

所有判据的参数都要从链路的分辨能力里推出来,先把基准表算出来(脚本 ntc 模式,口径与上篇逐位对齐):

T(℃) R(Ω) V(V) raw dV/dT(mV/K) K/LSB
-40 401860 3.2199 3996 -5.68 0.142
-20 105385 3.0140 3740 -16.10 0.050
0 33621 2.5435 3156 -30.87 0.026
25 10000 1.6500 2048 -36.66 0.022
45 4348 1.0000 1241 -27.20 0.030
60 2486 0.6571 815 -18.73 0.043
85 1087 0.3235 401 -8.98 0.090
125 359 0.1143 142 -2.75 0.293

几个锚点和上篇对得上:raw(25℃)=2048、raw(-40℃)=3996、raw(125℃)=142、0℃ 处 1 LSB=0.806mV 折 0.026K、dV/dT(0℃)=-30.87mV/K。灵敏度最好的区间在 10~40℃(0.022~0.027K/LSB),两端差一个数量级——低温端 0.14K/LSB,高温端 0.29K/LSB。这个”两端变钝”的特性后面反复用到:窗口判据在两端天然迟钝,漂移的影响却在两端放大。

三、第一类:开路与短路——判据阈值不是合法窗的平移

上篇给的判据是 raw 大于 4050 判开路、小于 20 判短路。这两个数怎么来的?把阈值反解成等效电阻和等效温度(脚本 margin 模式):

  • 4050 ⇔ 900kΩ ⇔ -50.6℃:比规格下限 -40℃ 只留了 54 LSB ≈ 7.7K 的余量;
  • 20 ⇔ 49Ω ⇔ 224.9℃:比规格上限 125℃ 留了 122 LSB ≈ 35.7K 的余量。

两侧余量差近 5 倍,这是分压拓扑决定的:NTC 在下、越冷阻值越大、V 越逼近上轨,但逼近是渐近的,任何有限温度都到不了满码——脚本算过,-60℃ 时 raw 也只有 4074,160℃ 时 raw 还有 65。真正的 4095 只有一种产生方式:NTC 支路彻底断开,输入端被上拉直接顶到 VDD。所以开路判据本质是”离上轨的距离”,余量天然薄;短路侧 0 是硬轨,余量天然厚。

这带来两条工程结论:

  1. 判据阈值不能照抄别人的。如果你的产品规格是 -40℃ 存储没问题,4050 够用;如果柜子要进东北户外、规格写到 -55℃(raw 约 4063),4050 会把正常冷端读数当开路——阈值必须从自己的规格端反推,公式就是上面的等效温度。
  2. 窗口和判据之间要留”灰区”。合法窗(142~3996)和故障判据(20/4050)之间不是非黑即白:raw 3997~4050 说明”已经冷到规格外,但还不像断线”;raw 20~141 说明”已经热到规格外,但还不像短路”。灰区的正确处置是降级而不是报故障:按规格边界截断使用(低温段限放 0.2C),同时记事件,等它自己走到轨上或者退回来。直接判开路会把寒潮误报成硬件故障,运维半夜白跑一趟。

四、第二类:卡死——”信号在,但不动了”

卡死的来源很杂:MUX 切换卡在某一通道、ADC 保持寄存器没刷新、前端运放输出钳死、甚至软件把缓存指针写死。指纹高度一致:raw 长时间纹丝不动。

判据写起来一行:连续 N 个采样周期 raw 零变化即判卡死。N 怎么定?算误报概率(脚本 stuck 模式)。关键物理量是”相邻两次采样 raw 完全相等”在正常状态下的概率 p:正常温度永远在慢变,加上量化噪声抖动,p 远小于 1。按正态离散近似,噪声 σ=1 LSB 时 p≈0.47(量化边界附近抖一格算变了),σ=2 LSB 时 p≈0.15:

  • 连续 30 次全相等:σ=1LSB 时误报 1.1e-10,σ=2LSB 时 9.7e-26;
  • 连续 60 次(1Hz 采样即 1 分钟):σ=1LSB 时 1.3e-20。

取 N=60、采样 1Hz,误报率每通道每天远低于 1e-9 次,而检测延迟只有 1 分钟——这账好算,放心用。

但这个判据有一个致命前提:必须打在 raw 层。 我见过一个实现把温度先量化到 0.1K 再做卡死检测——LFP 平台段温度本来就半天不变 0.1K,量化后相邻样本天然全等,60 次判据在正常柜子上天天误报。查了半天以为是探头问题,其实是判据放错了层。凡是要看”信号活不活泼”的判据,一律放在最原始的数据上。

还有个容易被忽略的联动:如果驱动里有”连续 N 次相同则丢弃、沿用上次值”的抗抖滤波(IIR 死区),它会把卡死指纹洗掉。卡死判据要接在滤波之前,或者干脆禁止温度链路用这种滤波——上篇的误差预算里温度本来就不缺分辨率。

五、第三类:漂移的三个来源,各自的账

漂移是四类里最阴的:不越窗、不卡死,只是所有门限悄悄失效。来源有三个,量级差很远,得一本一本算(脚本 leak / series / pullup 模式)。

5.1 受潮漏电——最大头,低温端放大

端子排受潮、助焊剂没洗干净、柜内凝露,都等效于在 NTC 两端并联了一个漏电阻 Rp。它把等效阻值往小拉,读数偏高(显示更热)。Rp=100kΩ 时:

真实温度 显示平移
-20℃ +8.3K
0℃ +4.8K
25℃ +2.1K
45℃ +1.1K
60℃ +0.7K

0℃ 的电芯读出 4.8℃——低温禁充门整个冬天静默失效,这就是开头那台柜子的事故机理。更麻烦的是方向:显示偏高,看起来”比实际暖”,运维直觉上觉得”还挺正常”,没有任何报警会响。

注意平移量不是常数:低温端 +8.3K、高温端 +0.7K,差 12 倍。这是指纹——上拉老化造成的平移是全段近似等量的(见 5.3),受潮造成的平移是”冷端大、热端小”的。双探头 spread 也会拉大:冷的时候两个探头差好几度、暖的时候又贴近,这个”温差随温度变化”的形状本身就是受潮的证据。

5.2 接触电阻——小头,但方向相反、专攻高温端

端子氧化、压接不实,等效于与 NTC 串联 Rs。10Ω 的账(高温端才显形):0℃ 只平移 -0.01K,85℃ -0.30K,125℃ -1.12K,方向是显示偏低(更冷)。

量级看着不大,但方向阴险:高温端显示偏低意味着 55℃/60℃ 高温降额门变迟钝,电池在真实 60℃ 里多跑。而且它和受潮方向相反——如果某通道”低温读数偏高、高温读数偏低”,两个故障可能同时存在;只出现一个方向,就按对应来源查。

低温端为什么几乎无感?因为 0℃ 时 NTC 有 33.6kΩ,串 10Ω 是 0.03% 的扰动;125℃ 时 NTC 只剩 359Ω,串 10Ω 是 2.8%——同样的接触电阻,扰动被 NTC 自己的阻值放大了近两个数量级。这也是为什么端子工艺问题总在夏天满功率跑的时候暴露。

5.3 上拉/基准漂移——恒定小平移,别急着换探头

上拉电阻温漂、老化,或 Vref 不是 ratiometric 设计(这点《母线电压采样链路》篇讲过,分压激励必须与 ADC 基准同源),造成全段近似等量的平移:上拉偏 +1% → 各温度点 +0.16~+0.28K。

它量级最小,但有个鉴别价值:如果柜里所有通道朝同一方向平移同量,别去换探头,查公共路径——上拉排阻、基准、甚至软件里那份标称 10k 的系数。逐通道故障找公共原因,是最常见的排障方向性错误。

顺带把自热也归置进来:NTC 自身发热造成的固定偏差(D=2mW/K 时 25℃ 处 0.136K、0℃ 处 0.096K),上篇误差预算已经算过,它恒定可标定,不算故障,但校表时要在里面扣。

六、第四类+:松脱——静态读数正常,动态响应变钝

探头松脱(导热垫压不实、硅脂干涸、卡扣断了)是现场保有量最大的”无声故障”,它的指纹在静态里几乎不存在:静置时探头贴不贴面读的都是环境附近的温度,完全一样。

差异在动态。0.5C(100A)恒流充电,16 串内阻按 4mΩ 算自热 40W,电芯本体 1 小时升 1.5K;1C 时 160W、升 6.1K。贴装良好的探头 τ≈8s,纯滞后只有几毫K~十几毫K,跟随比(探头温升/电芯温升)大于 0.9;顶在气隙上的探头改跟环境温度,1 小时只跟到 0.2~0.6K,跟随比不到 0.3:

工况 贴装良好 顶气隙
0.5C 充 1h,本体 +1.5K +1.4K 以上 约 +0.2K
1C 放 1h,本体 +6.1K +5.5K 以上 约 +0.6K

判据不需要真值——整柜相对判据:同一电流段(电流、SOC 窗口都对齐)取全柜各通道温升斜率的中位数,某通道斜率低于中位数的 30%、且持续 2 个充放循环,判松脱疑似。两个注意:

  • 只对同工艺贴装的探头群成立。如果柜里既有贴电芯大面的也有贴汇流排的,先按位置分组,各组各自比——把不同位置的探头放一起比,正常的梯度会误报成松脱;
  • 单循环不下结论。环境侧的偶发气流(比如柜门没关)也能压低某一个通道的温升,两个循环都低才升级。

七、四类判据汇总:直接抄进参数表

把上面所有判据收成一张表(脚本 table 模式原样输出,口径:12 通道、采样 1Hz):

故障 在线判据 确认时间 故障码 处置
开路 raw≥4050 持续 5 次 5s T_FAULT_OPEN 禁充+限放 0.2C
短路 raw≤20 持续 5 次 5s T_FAULT_SHORT 禁充+限放 0.2C
灰区 3997<raw<4050 或 20<raw<142 1s T_GREY 降级限放 0.2C,不判断线
卡死 raw 连续 60 次零变化(raw 层) 60s T_FAULT_FROZEN 禁充+限放 0.2C
受潮/漂移 双探头 spread>3K 持续 60s,或日漂移大于 0.5K/天连续 3 天 分钟级 T_FAULT_DRIFT 告警+人工复测
松脱 充电温升斜率小于柜中位数 30%,持续 2 循环 循环级 T_FAULT_LOOSE 告警+安排停机检查

前三行的确认时间用”连续 5 次”是上篇的口径,下面第八节把这笔账算严。

八、判据参数的预算方法:从误报率反推 N

参数表里每一个”持续 N 次”都应该由误报预算反推,而不是拍脑袋。方法三步:

  1. 量出样本间噪声 σ。0℃ 处 1 LSB=0.026K,量化加模拟噪声合计按 σ≈0.1K 取(上篇 RSS 误差预算里噪声分项的实测量级);
  2. 算单样本误越概率。窗口判据里,正常冷端(raw 3996)到阈值(4050)隔 7.7K,即 77σ,单样本误越概率在 erfc 里直接下溢为 0——12 通道 1Hz 跑一整年也凑不出一次;
  3. 确认次数只为对抗”真实但瞬态”的干扰。窗口判据真正要防的不是噪声,是通信毛刺、采样瞬间的开关噪声串进 ADC 的单点尖峰——5 连续确认(5s)足够,再长只是拖慢保护。

卡死判据的 60 次是另一本账(第四节的 1.3e-20),漂移和松脱是循环级判据,误报由”持续 3 天/持续 2 循环”这种时间常数控制。三类判据、三种时间尺度,不要用一个”确认次数”参数统一所有故障——我见过把松脱判据也做成 5 次确认的,正常昼夜温差就能把它触发。

九、故障注入测试(物理侧):判据写得再好,没注入过等于没写

在线判据是保护逻辑,保护逻辑不经注入验证就是纸面文章。物理注入六个用例(脚本 inject phys 模式):

  • ☐ P1:拔下 NTC 插头 → 期望 5s 内报 T_FAULT_OPEN,禁充+限放 0.2C;
  • ☐ P2:短接 NTC 两引脚 → 期望 5s 内报 T_FAULT_SHORT;
  • ☐ P3:串入电位器 0→500Ω 缓慢调节 → 期望 45℃ 以上读数偏低、误差随温度增大,高温告警触发点后移;
  • ☐ P4:在 NTC 端子并联 100kΩ(模拟受潮)→ 期望 0℃ 附近读数偏高约 4.8K,低温禁充不触发;
  • ☐ P5:把探头从安装面顶出留气隙(松脱)→ 期望 0.5C 充电时该通道温升斜率低于柜中位数 30%;
  • ☐ P6:双探头同点布置,其一热风加热 5K → 期望 spread 告警 60s 确认。

P3、P4 是这类测试里最有价值的两条:它们验证的不是”报不报警”,而是”该报的时候是不是恰好没报”——受潮注入后低温禁充门静默失效,这才是真实事故的重现。P4 做完顺手量一下注入前后的 raw 曲线,和第五节的平移表对一遍,对不上说明模型或链路有一边错了。

十、故障注入测试(软件侧):打在 raw 层

物理注入受限于现场条件(总不能真把探头泡水里),软件注入补全另一半,注入点统一选在 ADC 采样完成、进滤波之前的 raw 上(脚本 inject sw 模式):

  • ☐ S1:raw 注入 4095 → 开路判据 5 连续确认 → T_FAULT_OPEN;
  • ☐ S2:raw 注入 0 → 短路判据 → T_FAULT_SHORT;
  • ☐ S3:raw 固定 2048 持续 90s → 卡死判据 60 连次 → T_FAULT_FROZEN;
  • ☐ S4:raw 每样本 +1LSB 缓慢爬升 300LSB → 对同组中位数的日偏差判据越限 → T_FAULT_DRIFT(同一 raw 漂移在 25℃ 等效 +6.6K、-40℃ 等效 +42.6K——低温端放大,正是第五节受潮指纹的镜像);
  • ☐ S5:raw 注入 4020(灰区)→ 只降级限放 0.2C,不误报开路;
  • ☐ S6:通道号索引越界注入 → 看门狗/断言必须兜住,不允许静默吞掉。

S5 是灰区设计的回归测试——很多实现第一版会把灰区误报成开路,这个用例就是防回归的。S3 里特意写 90s 而不是 60s:判据 60s 触发,注入 90s 留出确认裕量,顺带验证”解除”路径(注入撤销后故障应在合理时间内退出并记录恢复事件)。

十一、降级处置与故障码:生产侧判掉之后,消费侧怎么办

生产侧判掉一个通道后,它的数据不能再进上篇的门限表。处置分两级:

  • 硬故障(开路/短路/卡死):该通道按”不可信”处理,整组(通常 4~8 通道一组)取剩余通道的最高温做高温门、最低温做低温门——注意是取保守方向的极值,不是剔除后平均;同时禁充、限放 0.2C,与上篇 NTC 断线的处置一致;
  • 软故障(灰区/漂移/松脱):数据降权使用,告警不联锁,等人工复测。漂移和松脱的本质是”还能用但不准”,直接禁充反而把可用性打没了。

故障码上报走《BMS 与 PCS 的 Modbus 对接》篇预留的 0x0110~0x0135 私有区,上篇建议的 limiting source 编码旁边加一个 temperature fault 字段:低 4 位放故障类型(OPEN/SHORT/FROZEN/DRIFT/LOOSE),高 4 位放通道号。上位机一眼看出”哪个探头、什么病”,不用再翻日志。

十二、上位机呈现:三个必须有的东西

  • ☐ 故障码+通道号实时呈现(上一节那个字段),不要只给一个笼统的”温度异常”;
  • ☐ 事件计数器:每类故障各一个累计计数器,上位机做增量比对——这套思路和《离网/并网切换》篇的切换事件计数器同源,1s 轮询看不见 5s 级的瞬时故障,计数器增量不会漏;
  • ☐ 漂移趋势图:每通道记录”与同组中位数的日偏差”,受潮是按周爬的,趋势图上三周前就能看出苗头,比等 spread 越限早得多。

第三条是低成本高回报的:不需要任何额外硬件,就是把本篇第六、五节的判据中间量顺手存下来。事故复盘时,”三个月前就开始漂了”和”突然坏的”是两种完全不同的运维动作。

十三、排障 triage:症状指向哪一层

现场排查速查(脚本 triage 模式):

  • 某通道恒 4095,万用表量 NTC 阻值却正常 → 插头/线束断或焊点虚接,故障在 NTC 之外的链路上;
  • 某通道恒 0 → NTC 引脚短接或对地短路;
  • 读数长期不动但不在轨 → ADC/MUX 卡死,先确认 raw 是否被中间层量化过;
  • 低温禁充永不触发、双探头差随低温拉大 → 受潮漏电,烘干端子排复测;
  • 高温降额总是晚几分钟 → 接触电阻或贴装压力不足,优先查端子和压接;
  • 充电时某通道温升明显偏慢、静置读数正常 → 探头松脱/硅脂干涸;
  • 所有通道朝同一方向平移同量 → 公共路径:上拉排阻、基准、软件系数,别逐个换探头。

最后一行再说一遍是因为它最反直觉:全柜同向平移是公共参数的指纹,逐通道故障的平移必然互相独立。方向性先看全柜,再看单通道。

十四、结语与预告

收个尾。四类故障、三层数据质量判据(在不在/动不动/对不对),全部数字来自这条链路自身的分辨率和误差预算,没有任何一个阈值是拍出来的:

  • 窗口判据的余量是拓扑给的:开路侧 7.7K、短路侧 35.7K,灰区必须有;
  • 卡死判据必须打在 raw 层,60 次确认的误报是 1e-20 量级;
  • 受潮 100kΩ 让 0℃ 门变 5℃——漂移的 fingerprint 是”冷端大、热端小”,和公共参数的”全段等量”区分开;
  • 松脱不用真值,柜内相对比较就能抓:跟随比 0.3 这条线,1C 工况下 1 小时就能拉开 5K。

工具照旧全离线:ntc_fault_calc.py,12 个模式,29 项自检断言(含与上篇共享的 6 个链路锚点),参数改成本家产品的口径就能直接用。

下期预告:把松脱检测再往前推半步——探头贴装质量的出厂验收方法(温升斜率标定、跟随比台架、以及怎么把”贴没贴好”变成一个可量化的出厂指标),它是本篇整柜相对判据的标定来源。备选:上上上期留下的 09-26《ESD/浪涌防护》数值错误回修(12.5kV 应为 12.5V),一直没动,再挂一期就要变成悬案了。

以上判据与数值基于文中给定的链路口径(B3950/10k 上拉/3.3V/12bit)与典型工程假设推算,不同厂家 NTC 的 B 值曲线、封装热阻与柜体结构会改变具体数值;落地前请以本方产品的实测注入结果为准。