母线电压采样链路设计实战:一台储能逆变器”阴雨天的上午反复报母线过压”——415V 的母线,板子一潮就读成 431V,而在产线上它”合格”地偏了 0.46%

2026年10月13日 0 By admin

这台 5kW 单相储能一体机是去年年底开始批量交付的,400V DC-Link。今年梅雨季,华南的几个客户陆续反馈同一件事:

“上午 8 点到 11 点,机器反复报 E07 母线过压停机,重启能开,下午就好了。晴天不出问题。”

我先按”客户电网有问题”查,然后按”母线电容老化”查,最后把机器拉回实验室,用高压差分探头直接夹在母线电容两端——实际母线一直是 415.0V,一秒都没动过。

而设备自己的显示:产线检验时 416.9V,梅雨天的清晨 431.0V。空调开到 28 度、机内温度升到 65℃ 之后,又掉回 415.7V。

三个数,一台机器,一路母线。这篇文章就是把这 4% 和 −0.3% 拆开的过程。结论先放这里:

那 431V 里有 3.86% 是 PCB 表面那层看不见的水膜——我反解出来,从母线正极到分压节点的板面绝缘电阻只有 116MΩ。而 IPC 对表面绝缘电阻(SIR)的合格判据线是 10⁸ Ω。也就是说:这是一块”合格”的板子,它只是把 415V 读成了 431V。


一、现象:415V 的母线,三种读数

先把现场信息摆全,后面所有计算都锚在这些数上。

项 值 说明
设备 5kW 单相储能一体机 单相 230V 输出,DC-Link 额定 400V
母线电压 充电上限 415V,工作范围 350~415V 高压差分探头实测
分压上臂 6 × 750kΩ = 4.5MΩ 0603 厚膜,±1%,TCR ±100 ppm/℃
分压下臂 20kΩ 0805 薄膜,±0.1%,TCR ±25 ppm/℃
分压比 4.52MΩ / 20kΩ = 226 415V → 1.836V
分压电流 415V / 4.52MΩ = 91.8µA 分压链总功耗 38mW
隔离放大器 AMC1311(非 B 版) 2V 输入,增益 1,1GΩ 输入阻抗
ADC 12 bit,Vref 3.3V,定时器触发 1.2kHz 采样,固件做 12 点平均(窗口 10ms)
过压保护阈值 430V 母线充电上限 415V 的 1.036 倍

三种条件下的读数:

条件 实际母线(差分探头) 设备显示 偏差
产线出货检验(25℃、干燥、干净板) 415.0V 416.9V +0.46%
晴热、机内 65℃、干燥 415.0V 415.7V +0.16%
梅雨清晨、25℃、板面凝露(现场) 415.0V 431.0V +3.86%

过压阈值是 430V。所以第三种条件下,415V 的真实母线被读成 431V —— 保护必跳。 而产线检验时的 416.9V 距阈值还有 13V,谁都不会觉得有问题。

注意第二行和第三行背后的两个机制,方向是相反的:

  • 温度升高 40K:上下臂的温漂不匹配 → 读数偏低 0.30%
  • 湿度上升:板面绝缘电阻下降 → 读数偏高 3.4%

(产线那 +0.46% 是这台机器”干净、干燥”状态下的固有偏差;后面第八节会把它拆开。0.46% 这个数看起来太像”正常误差”了——这正是它藏了整整一个梅雨季的原因。)

这就解释了客户那句话为什么听起来毫无逻辑——”上午坏,下午好”:

  • 清晨:板温低、湿度高 → 板面水膜最厚 → 漏电最大 → 读数偏高
  • 午后:板温升到 55~65℃、湿度降下来 → 水膜被烘干 → 漏电变小 → 但电阻的温漂又把它往低处拉

两个机制在时间上是反向的,在温度上也是反向的。 你盯着一个终值看,永远推不出中间发生了什么。

1.1 三次误判,三次白干

误判一:真的是母线过压。 用高压差分探头(1000:1,带宽 20MHz)直接夹母线电容两端。415.0V,纹波峰峰 7V。一秒没动。排除。

误判二:隔离放大器坏了。 换了一片 AMC1311,现象一模一样。又把同一型号的另一台机器的采样板换过来,也一样。排除。

误判三:分压电阻漂了。 把 6 颗 750kΩ 全部拆下来,用 6 位半万用表逐一测量,全部在 ±0.3% 之内,算下来分压比偏差 0.2%。看起来完全没问题。 排除。

三次排除之后,我意识到自己漏了一个变量:我量的是”拆下来的电阻”,而现场出问题的是”装在板子上的电阻”。 两者之间差的那部分,是整个硬件排障里最不起眼、也最容易被跳过的一环:PCB 本身。

1.2 一个 40 分钟的对照实验,直接锁定方向

做对照实验之前先定好目标:我要让”湿度”成为唯一的变量。

做法:把整块采样板(连同分压链那一片区域)用无水乙醇 + 超声清洗 5 分钟,然后 80℃ 烘 2 小时。冷到室温后立刻测一次,然后放进湿度箱(40℃ / 90%RH)2 小时再测一次。

结果:

板子状态 415V 母线下的读数 偏差
刚出湿度箱(板面凝露) 429.6V +3.52%
清洗 + 80℃×2h 烘干后 416.9V +0.46%

偏差从 +3.52% 掉到 +0.46%。 一块板子,没换任何一个元件,只是洗了洗烘了烘,4.0% 的误差就没了。

方向锁定:这不是电阻的错,是电阻脚底下那片板面的错。

而剩下的那 +0.46%,才是元器件的账——这个后面第八节会拆开。


二、母线电压采样链路:它和电流采样不是同一条链

在往下算之前,先把这条链路拆开。结构上和电流采样很像,但有一处根本性的差别,它决定了后面所有的权衡方向。

  ┌────────────────────────────────────────────────────────────────────┐
  │ 1 传感器    电阻分压链:把 400V 变成 2V(电压采样没有"分流器")     │
  ├────────────────────────────────────────────────────────────────────┤
  │ 2 前端      隔离放大器 / 分压缓冲:搬运到 ADC 能吃的电平           │
  ├────────────────────────────────────────────────────────────────────┤
  │ 3 滤波      抗混叠 + 削纹波:放在低阻侧还是高阻侧,决定它是不是负载 │
  ├────────────────────────────────────────────────────────────────────┤
  │ 4 参考      ADC 的"尺子":量程、温漂、噪声                          │
  ├────────────────────────────────────────────────────────────────────┤
  │ 5 ADC       量化 + 采样时刻:码值、触发源、平均窗口                 │
  ├────────────────────────────────────────────────────────────────────┤
  │ 6 标定/补偿 把码变成伏特:单点还是两点、什么时候标、标在哪一段量程 │
  ├────────────────────────────────────────────────────────────────────┤
  │ 7 系统边界  板面绝缘、爬电、湿度、清洗、三防漆、安全间距            │
  └────────────────────────────────────────────────────────────────────┘

2.1 一句话说清两条链的差别:源阻抗

电流采样链路的第一段是分流电阻,它的输出阻抗是 mΩ 级——这是一个”硬”电压源,你把任何东西并上去都拉不动它。

母线电压采样链路的第一段是分压链,它的输出阻抗是 几十 kΩ 量级——这是一个”软”电压源。你在分压节点上并任何东西,都会改写分压比。

而它的输入端(母线正极那一侧)更极端:那里的等效阻抗是 MΩ 级,和 PCB 的表面绝缘电阻(100MΩ 量级)只差一个数量级。

所以,电压采样链路里所有的坑,都能归到一句话:它有一条极高阻的路径,而这条路径正好暴露在你能想到的每一种污染面前。

这个提法和电流那篇的结论正好互为镜像:

电流采样链路 母线电压采样链路
源阻抗 mΩ 级(硬) 几十 kΩ(节点)/ MΩ 级(上臂)
核心矛盾 Vos / R(失调折算到电流) R_high / R_leak(漏电折算到分压比)
最怕的污染 走线电阻、热电势 板面绝缘电阻、助焊剂残留
出厂检验能测到什么 常量项(增益误差) 常量项(增益误差)
出厂检验测不到什么 温度项 湿度项
缺什么基准 可以短路输入取真零 取不到真零(母线永远不可能是 0V)

最后一行是关键:电流采样链路可以用”短路输入”来抓零点,而电压分压链路的零点必须靠别的办法构造。 这件事的后果我在第七节专门讲。


三、先把分压链的两个硬约束锁死

设计分压链的时候,大部分人是从”选一个阻值让分压电流小一点”开始的。这个起点是错的,因为它绕过了真正的约束。

3.1 分压电流不由上臂决定,由”满量程 ÷ 下臂”决定

这一条我第一次意识到的时候愣了几秒。

分压链的设计目标是:母线到充电上限(415~450V)时,节点电压正好等于隔离放大器的满量程输入(2V)。

所以节点电压有明确上限:V_node ≤ V_FS = 2V。

流过下臂的电流:I_div = V_node / R_low。

当母线处于最高点时节点电压才到 2V,此时:

I_div = V_FS / R_low        ← 分压电流只由"满量程电压 ÷ 下臂阻值"决定
P_div = V_bus_max × I_div   ← 总功耗 = 母线电压 × 这个电流

换句话说:下臂阻值直接决定了分压链的电流和功耗。你选 20kΩ 的 2V 满量程,就是选了 100µA、40mW。

下臂 R_low 满量程 V_FS 分压电流 400V 下功耗 节点源阻抗 R_th = R_high∥R_low
2kΩ 2V 1.0mA 400mW 2.0kΩ
4kΩ 2V 500µA 200mW 4.0kΩ
10kΩ 2V 200µA 80mW 10.0kΩ
20kΩ 2V 100µA 40mW 19.9kΩ
100kΩ 2V 20µA 8mW 99.8kΩ
470kΩ 2V 4.3µA 1.7mW 470kΩ

注意倒数第二列:节点源阻抗几乎就等于下臂阻值(因为上臂大得多,并联后基本被下臂主导)。这个数后面会反复用到——它决定了偏置电流的误差、滤波电容的时间常数、以及能不能做保护环。

3.2 上臂阻值决定的是”你必须多怕漏电”

上臂的总阻值由分压比反推:R_high = R_low × (V_bus_max / V_FS − 1)。

比值固定时,上臂阻值和下臂阻值严格同比例变化。而漏电误差的大小是:

相对误差 ≈ R_high_eff 的变化率 ≈ R_high / R_leak        (当 R_leak >> R_high 时)

于是就有了这组对立:

下臂 上臂 分压功耗 100MΩ 板面漏电带来的误差
2kΩ 450kΩ 400mW +0.45%
10kΩ 2.25MΩ 80mW +2.2%
20kΩ 4.5MΩ 40mW +4.4%
100kΩ 22.5MΩ 8mW +22%
470kΩ 105MΩ 1.7mW +105%(已经不能用了)

这张表是本篇的第一个核心权衡:想省功耗,就必须接受对板面漏电的极度敏感。

我们这台机器选的是中间那档:40mW 功耗,代价是 100MΩ 的板面绝缘电阻就能顶出 4.4% 的误差。而它偏偏是一台要在南方梅雨季长期运行的机器。

那”我们把下臂降到 2kΩ、功耗 400mW 行不行”?不行——400mW 的常态损耗对一台待机功耗有指标的储能机来说不可接受,而且 400mW 会持续加热分压链区域的板面,把水膜烘干的同时也把”误差”变成”随负载变化的误差”。这不是解法。

正解是:不要硬扛漏电,要把漏电这条路堵死。 怎么堵,第五节讲。

3.3 为什么必须串 6 颗:不是功耗,是额定电压

上臂 4.5MΩ 拆成 6 颗 750kΩ,很多人第一反应是”为了分担功耗”。算一下就知道不对:每颗的功耗是 (91.8µA)² × 750kΩ = 6.3mW——而 0603 的额定功率是 100mW。功耗上串一颗都够。

真正的原因是单颗电阻的最大工作电压:

单颗电阻的连续工作电压 = min( √(P_rated × R) , 最大工作电压 )
封装 额定功率 典型最大工作电压 √(P×R) @750kΩ 实际受限值
0402 1/16 W 50V 216V 50V
0603 1/10 W 75V 274V 75V
0805 1/8 W 150V 306V 150V
1206 1/4 W 200V 433V 200V

注意:对 750kΩ 这种高阻值,”√(P×R)”算出来是两三百伏,但那个数没有意义——它被”最大工作电压”这条硬线截断,而高阻值电阻的瓶颈几乎永远是封装而不是功率。

415V ÷ 75V = 5.5 → 所以要 6 颗。这就是”6″这个数字的来历。

它同时意味着一件很危险的事:每颗电阻在 415V 时跨 68.8V,在 450V 母线(充电上限加余量)时跨 74.7V —— 已经贴上了 0603 的 75V 额定线。 母线只要再高一点,就是超规格使用。

母线电压 每颗跨压(6 串) 对 0603(75V)的余量
415V 68.8V 8%
450V 74.7V 0.4%
470V 78.0V −4%(超规格)

改造动作之一:换成 0805(150V)或者串到 10 颗(每颗 45V)。 成本增加不到 1 分钱。

3.4 分压链的”串”,还有一个后果没人提

多颗串联会让每一颗电阻跨的电压变低(68.8V 而不是 415V)。这一点除了额定电压,还有一个隐藏收益:

电化学迁移(ECM)和表面漏电,都是被电场的强度驱动的。 一根导线上的电压梯度从 415V 降到 68.8V,局部驱动的离子迁移速率会显著下降。

代价是:元件变多了,焊盘多了,表面路径反而变长也变复杂——如果布局没做好(比如把 6 颗排成一条紧贴的直线),相邻两颗的焊盘间距只有不到 1mm,反而给”局部污染导致的局部短路”创造了条件。第五节讲布局怎么处理。


四、板面漏电:116MΩ 就把 415V 顶成 431V

现在把 1.2 节那个实验量化。分压链的等效电路是:

                    R_leak (板面绝缘电阻)
        ┌───────────────/\/\/\────────────┐
        │                                 │
 V_bus ─┤                                ├─ V_node ─┬── 到隔离放大器
        │                                 │          │
        └──── R_high = 4.5MΩ ────────────┘        R_low = 20kΩ
        │                                            │
       GND1 ─────────────────────────────────────── GND1

漏电通路和上臂并联,上臂有效阻值变小 → 节点电压升高 → 读数偏高。

反解:要让节点电压比标称高 3.86%,需要

V_node / V_bus = R_low / (R_high_eff + R_low)
标称: 20k / 4.52M = 4.425e-3
实际: 4.425e-3 × 1.0386 = 4.596e-3
     → R_high_eff = 20k × (1/4.596e-3 - 1) = 4.332MΩ

4.5MΩ ∥ R_leak = 4.332MΩ  →  R_leak = 116 MΩ

116MΩ。

这个数为什么值得停下来看一眼:IPC 对表面绝缘电阻(SIR)的通用合格判据线是 10⁸ Ω(log 8)。 116MΩ = 1.16×10⁸ Ω,比合格线还高一点。

这就是这类问题最气人的地方:它不会在来料检验、产线测试、老化测试中的任何一个环节暴露出来。 因为那些测试全都在干燥、清洁的板子上做。而你要等到它装了机、发到南方、过了第一个梅雨季,它才会告诉你它对湿度有多敏感。

4.1 出厂标准里那条”合格线”,是按你的分压链吗?

上面那个判据是通用的。但你的分压链需要多好的绝缘,是可以自己算的:

允许的漏电误差 e  →  需要的绝缘电阻 R_leak_min = R_high / e
上臂 R_high 允许 +0.5% 允许 +1% 允许 +2%
450kΩ 90 MΩ 45 MΩ 22.5 MΩ
2.25MΩ 450 MΩ 225 MΩ 113 MΩ
4.5MΩ 900 MΩ 450 MΩ 225 MΩ
22.5MΩ 4.5 GΩ 2.25 GΩ 1.13 GΩ

我们这个设计要 +1% 的精度,就需要板面绝缘电阻 450MΩ——比 IPC 那条线严格 4.5 倍。

所以正确的动作是:把”分压链所在区域的表面绝缘电阻”作为一个单独的设计指标写进设计规范(比如”干燥 ≥10GΩ、40℃/90%RH 168h 后 ≥1GΩ”),并单独做验证。 用通用的 SIR 判据来背书一条 MΩ 级分压链的精度,逻辑上是错的。

4.2 漏电的位置决定误差的方向(这是最有用的诊断规则)

同一个漏电电阻,接在不同位置,读数往相反方向跑:

漏电路径 等效效果 读数变化 典型成因
母线正极 → 分压节点(跨上臂) 上臂变小 偏高 沿电阻串的水膜/污染带
分压节点 → GND1(跨下臂) 下臂变小 偏低 节点周围的助焊剂残留、焊盘间污染
母线正极 → GND1(跨整链) 不影响分压比,只增加电流 不变(但功耗增加) 分压链两侧的大面积污染

注意第三行:跨整条分压链的漏电根本不改变分压比,它只是让分压链的功耗变大。 所以”板子脏了”不一定导致读数错,取决于脏在哪儿。

对我们这个案例,需要 116MΩ 且误差是”偏高”——对应第一行:沿着电阻串形成了一条连续的水膜/污染带。这也解释了为什么”清洗 + 烘干”能修好它:那条带子被洗掉了。

现场判读口诀:读数单向偏高且与湿度相关 → 查上臂;读数单向偏低 → 查节点对地那一段。 这个口诀在同一条板上能省你半天。

4.3 一个更隐蔽的”漏电”:不要让滤波电容跨在上臂上

上面说的都是 PCB 表面的漏电。还有一种是器件的、出厂就有的、不随湿度变的漏电——滤波电容的绝缘电阻。

Class II 陶瓷电容(X7R/X5R)的绝缘电阻规格是:

R_ins ≥ 10 GΩ  或  R_ins × C ≥ 500 Ω·F   (取较小者)

把它变成”1µF 电容的绝缘电阻最少是多少”:

容值 R×C ≥ 500 Ω·F 推出 规格保证值 湿热 500h 测试后(25 Ω·F)
10nF ≥ 50 GΩ 10 GΩ 2.5 GΩ
100nF ≥ 5 GΩ 5 GΩ 250 MΩ
1µF ≥ 500 MΩ 500 MΩ 25 MΩ
10µF ≥ 50 MΩ 50 MΩ 2.5 MΩ

一颗 1µF 的电容,出厂时只保证 500MΩ,经过 500 小时湿热后只保证 25MΩ。

现在看把它放在哪儿:

位置 并联对象 出厂时的读数误差 湿热 500h 后的读数误差
跨在上臂(4.5MΩ)上 4.5MΩ ∥ 500MΩ → 4.4595MΩ +0.90% 4.5MΩ ∥ 25MΩ → +17.9%
并在下臂(20kΩ)上 20kΩ ∥ 500MΩ → 19.9992kΩ +0.004% 20kΩ ∥ 25MΩ → +0.08%

(上臂被旁路 → 分压比变大 → 读数偏高,方向和第 4.2 节那张表一致。)

“为了滤掉母线纹波,在分压电阻串两端并一颗 1µF 电容”——这是一个我在至少三块板子上见过的做法,而它会让一台机器的母线读数在服役一年后偏掉近 18%。

滤波电容永远放在低阻侧(节点对 GND1),而且要选 NP0/C0G,或者至少 100nF 以内。

4.4 电化学迁移:为什么它是”越用越差”

表面漏电是可逆的(烘干就回来)。但它有一个不可逆的后续:

潮湿 + 离子污染(助焊剂残留、手指印、车间粉尘)+ 直流偏压 + 电场,四件事凑齐,就是电化学迁移(ECM)。 金属离子在电场下从阳极向阴极迁移,逐渐长出铜枝晶。等枝晶把两个焊盘连起来,就不再是”精度问题”,而是短路。

几个有意的量化参考:

  • 相对湿度 >80% 时,FR-4 的 ECM 风险增加 5 倍以上
  • FR-4 吸水率超过 0.2% 后,绝缘电阻可能掉到 10¹⁰ Ω·cm 以下
  • 洁净干燥的 FR-4 表面电阻 10¹²~10¹⁴ Ω;40℃/90%RH 或 85℃/85%RH 下可掉到 10⁹~10¹⁰ Ω;有助焊剂残留 + 凝露时可低到 10⁸ Ω 以下
  • 三防漆可以降低有效污染等级(允许按 PD1 取值),但裂缝/未覆盖区会成为 ECM 的起点——涂层质量比涂层有无更重要

所以”清洗 + 三防漆”这个组合里,清洗是主、涂层是辅。涂层下面的助焊剂残留会被封在里面,反而更糟。顺序必须是:先洗干净、烘干、再涂。


五、隔离放大器:选错的代价是 −47%

现在回到电路本身。第 1.2 节那个实验之后剩下的 +0.46% 里,隔离放大器占多少?我先算了”如果当初选错型号”会怎样——这个数字值得单独讲,因为它是”电压采样”和”电流采样”真正的分水岭。

5.1 一个 22kΩ 的输入阻抗,差点把分压比废掉

我司另一条产品线(电流采样)用的隔离放大器是 250mV 输入型的。曾经有人想在电压采样上”复用同一个料号”,理由是”反正都是隔离放大器”。

我用同一套分压参数算了一遍:

器件 输入量程 差分输入阻抗 输入偏置电流 与 20kΩ 下臂并联后
AMC1200 / AMC1301 类 ±250mV 28kΩ / 22kΩ −30µA(AMC1301) 下臂等效 10.48kΩ → 分压比错 −47.5%
AMC1311(本篇用的) 0~2V 1 GΩ ±3.5nA(typ)/ ±15nA(max) 下臂等效 19.9996kΩ → 错 −0.002%

−47.5% 是什么概念:415V 的母线会被读成 218V。而且因为它是恒定比例误差,一次标定就能”修好”,修好之后谁都看不出来。 直到你算功耗:

  • 分压电流从 91.8µA 变成 190µA,翻了一倍多
  • 每颗 750kΩ 的功耗从 6.3mW 变成 27mW,跨压不变但热预算全变
  • 上臂的 750kΩ 按 91.8µA 选的 ±1% / 100ppm,工作点已经不在设计区

比”错 47%”更危险的是”错 47% 但被标定掩盖”。 这类错误在实验室里通常不会暴露,因为实验室的第一件事就是标定。

5.2 真正的分水岭:偏置电流 × 源阻抗

再看输入偏置电流这一项。AMC1301 的 IIB 是 −30µA(typ),AMC1311 是 ±3.5nA(typ)、±15nA(max)——差了四个数量级。

同样的 30µA,在不同的源阻抗上完全是两回事:

应用 源阻抗 IIB 造成的误差电压 折算到被测物理量
AMC1301 + 50mΩ 分流器 50mΩ 1.5µV 0.006%(相对 250mV 满量程)
AMC1301 + 10kΩ 分压节点 10kΩ 313mV 125%(器件直接饱和)
AMC1311 + 20kΩ 分压节点 20kΩ 300µV 0.015%(相对 2V 满量程)

同一个 30µA,在分流器上是艺术品,在分压链上是灾难。 这就是为什么”电流采样专用”和”电压采样专用”不能互换——它们的差别不在隔离,而在输入级。

反过来说:AMC1311 能用在大阻值分压链上的前提是”下臂足够小”。 如果为了省功耗把下臂提到 470kΩ(源阻抗 ~470kΩ),那 ±15nA 的偏置电流就会产生 7mV 的误差,折算到母线是 1.6V(0.38%)——而且它随温度漂(TCIIB ±10pA/℃ 看起来小,但 470kΩ 的源阻抗把它放大成 4.7µV/℃,折算到母线 1mV/℃)。

又回到了 3.1 节那条线:下臂阻值决定了节点源阻抗,而节点源阻抗决定了你能用什么样的放大器。

5.3 器件对照与”为什么必须选 B 版”

用 400V 母线、415V 充电上限这套参数,把候选器件的输入侧和共模侧摆在一起:

参数 AMC1311 AMC1311B 对 400V 分压链的意义
输入量程 / 增益 0~2V / 1 0~2V / 1 直接接分压链,不需要二次放大
输入阻抗 1 GΩ 1 GΩ 与 20kΩ 下臂的分流误差 0.002%
输入偏置电流 ±3.5nA typ / ±15nA max 同 20kΩ 源阻抗下 300µV,可忽略
输入失调 Vos(max,全温区) ±9.9 mV ±1.5 mV 折算到母线:±2.24V vs ±0.34V
失调温漂 TCVOS ±20 µV/℃ ±3 typ / ±10 max µV/℃ 局部温升 40K → 折算 0.4V vs 0.2V
增益误差(max) ±1% ±0.2% 可标定掉,但标定前会吃掉 ADC 量程
增益漂移 ±30 ppm/℃ ±5 typ / ±40 max ppm/℃ 标定不掉,40K → 0.12%
非线性(max) ±0.04% ±0.04% 两点标定吃不掉的曲率
CMTI(min) 15 kV/µs 75 kV/µs 见第六节
输出带宽 220 kHz 275 kHz 都远够
隔离等级 增强型隔离 增强型隔离 见第十节

三个独立的理由指向同一个结论:必须用 B 版。

  1. 零点:±9.9mV → ±1.5mV,折算到母线上从 ±2.24V 变成 ±0.34V。而这个零点没法靠”短路输入”标定掉(第七节讲为什么)。
  2. CMTI:15 → 75 kV/µs。这一条是生死线,下一节算。
  3. 增益漂移:±30 → ±5 ppm/℃,这是标定不掉的那部分温漂。

代价只是每片贵几块钱。 在一块 5kW 的机器上,这个账没有讨论的必要。


六、共模:CMTI 是这条链路的硬门槛

分压链的”下端”(GND1)通常接母线的负极侧。这意味着隔离放大器的高压侧参考地,就是整个逆变器开关动作的参考地——每一次开关,GND1 相对 GND2 都是一次 kV/µs 级的共模阶跃。

沿用电流那篇的口径(同一套物理,同一套判据):

要求的 CMTI ≥ 3 × V_bus / t_sw

t_sw 是开关的电压转换时间(不是开关周期)。取 400V 母线、SiC 或快 IGBT 的 50ns:

400V / 50ns = 8 kV/µs
门槛 = 3 × 8 = 24 ~ 32 kV/µs
器件 CMTI(min) 400V/50ns 门槛 24~32 kV/µs 判定
AMC1311(非 B) 15 kV/µs 不够 淘汰
AMC1311B 75 kV/µs 够 正解
AMC1200 类 10 kV/µs 远不够 连电流采样那篇里也是淘汰的

顺便解释了一个长期困扰我的现象: 为什么有些项目用非 B 版也”跑得好好的”?

因为它们的开关更慢。如果 t_sw = 100ns:

400V / 100ns = 4 kV/µs  →  门槛 12 ~ 16 kV/µs
AMC1311 的 15 kV/µs  —— 刚好擦边

“擦边合格”是最危险的形态:实验室里过,量产批次里偶发,现场极端工况下变成”整机重启但查不出原因”。而且它不会留下任何可追溯的痕迹——因为共模瞬态干扰进来的瞬间,输出就是一个几毫伏的毛刺,随后被固件的平均值滤波吃掉。

唯一的处理方式是在选型阶段算出来,而不是在故障阶段查出来。 这一条我在两块板子上吃过教训。


七、零点:电压采样链路最缺的那个”真零”

电流采样那篇的核心技巧之一是”短路输入、跑热、看零点”。这个动作在电压采样链路上做不了——因为母线电压的工作范围是 350~415V,你永远不可能把它拉到 0V 去测零点。

这就是电压采样链路的结构性缺陷:它天然缺少零点基准。

7.1 单点标定留下的不是一个”零点误差”,而是一个”标定点”

先把一个反直觉的结论说清楚。假设链路存在一个等效输入失调 V_os(在节点处,单位 V),固件用的是最简单的线性模型 V_bus = V_node / k(只有增益、没有截距),并且你只在 415V 这一个点上标定过。

标定会选一个 k’,让 415V 点读数正确。推导一下其它电压点的误差:

真实:  V_node = V_os + k·V_bus
固件:  V_est  = V_node / k'

单点标定 (在 V_cal 处):  k' = (V_os + k·V_cal) / V_cal

V_est - V_bus ≈ (V_os/k) × (1 - V_bus/V_cal)

结论:单点标定之后,误差在标定点处为 0,在远离标定点处按比例放大,在 V_bus = 0 处达到最大(等于 V_os 折算到母线的值)。

代入本篇的数(V_os 折算到母线 = +1.0V,V_cal = 415V):

母线电压 单点标定后的误差 说明
415V(标定点) 0 必然为 0
400V +0.036V(+0.009%) 工作区,可忽略
350V +0.157V(+0.045%) 放电深一点
200V +0.518V(+0.26%) 辅助测试工况
0V +1.0V 理论最大值

这看起来是好消息:因为母线永远工作在标定点附近,单点标定的零点误差几乎看不见。

但把它反过来读,就是坏消息:“标定点选在哪里”变成了一个隐形的设计决策——你在哪里标定,哪里就准;而”哪里最需要准”通常不是”哪里方便标”。

  • 产线上为了安全和方便,最容易做的事情是用低压标定(比如给一个 200V 的直流源)
  • 而最需要准的地方是过压保护段(430V 附近)
  • 结果就是:OVP 精度最差的那一段,恰好就是 OVP 要用的那一段
标定点 430V 处的误差(以 V_os 折算 1.0V 为例)
200V −0.53V(−0.12%,方向还是偏低的,会把保护推迟)
300V −0.30V(−0.07%)
415V −0.036V(−0.008%)
430V 0

产线流程建议:标定点必须落在保护阈值附近(或至少在上端),不要图方便用低压标定。 这条规则的收益是免费的,只需要改一行工装脚本。

7.2 我们的板子:同批 20 台的零点分布

把实验室里 20 台机器全部用”注入法”(下面 7.3 讲)测了一遍等效输入失调:

统计量 等效输入失调(节点处) 折算到母线(×226)
实测范围 −1.9 ~ +1.6 mV −0.43 ~ +0.36 V
非 B 版规格(max,全温区) ±9.9 mV ±2.24 V
B 版规格(max,全温区) ±1.5 mV ±0.34 V

实测那批最坏 +1.6mV,已经顶到了 B 版的规格线(±1.5mV)。 也就是说:用非 B 版,你的零点分布有 ±2.24V 的潜在空间;用 B 版,这个空间被压到 ±0.34V。

对我们这台机器而言,OVP 阈值 430V 距离母线充电上限 415V 只有 15V(3.6%) 的余量。零点误差 ±0.34V 在 B 版下只吃掉 2%。但潮湿带来的 +16V 一次就吃掉了全部余量。 所以真正要治的是漏电,零点只是把余量留得干净一点。

7.3 注入法:不用高压源,造出第二个标定点

这一节是全文最实用的一条。既然单点标定留下了零点误差,那我们要两点标定。但现场和产线都很难精确控制母线电压到两个值——那怎么办?

做法:在分压节点上并一颗与下臂同阻值的电阻,用 MOS/继电器投切。 比值变了,节点电压变了,而母线电压没变——于是你在同一次测试里拿到了两个方程。

设 ADC 链路(含放大器与 ADC)的增益为 S(code/V)、节点处的等效失调为 V_os(V):

码值 = S × (V_os + k × V_bus)          k = 分压比

投入 R_cal 前:  code1 = S × (V_os + k1 × V_bus)
投入 R_cal 后:  code2 = S × (V_os + k2 × V_bus)

两式相减:  code1 - code2 = S × (k1 - k2) × V_bus
           → S = (code1 - code2) / ((k1 - k2) × V_bus)
           → V_os = code1/S - k1 × V_bus

两个方程,两个未知数(S 和 V_os),不需要第二个高压源,也不需要更准的基准表。

我们这台机器的实测数(母线 415.0V,下臂 20kΩ,R_cal 也是 20kΩ):

状态 R_low_eff 分压比 k 节点电压(标称) ADC 码(实测)
未投入 20.00kΩ 4.4248e-3 1.8363V 2280
投入 R_cal 10.00kΩ 2.2173e-3 0.9202V 1143
两者之比 0.500 k2/k1 = 0.5011 0.5011 —

注意一个容易想当然的细节:投入同阻值电阻,节点电压是”接近于”减半,但不是精确一半。 因为上臂没变,比值从 4.4248e-3 变成 2.2173e-3,是 50.11%。

在本例里这个偏差只有 0.11%(因为 R_high >> R_low,比值近似正比于下臂),用”减半”反推第二个点只差 0.1%,可以接受。但如果你的分压比不大(比如上臂只比下臂大几倍),”减半”就会错得很离谱——所以永远用并联后的实际阻值精确算 k2,不要用”除以二”。

解出来:

S = (2280 - 1143) / ((4.4248e-3 - 2.2173e-3) × 415.0)
  = 1137 / (2.2075e-3 × 415.0)
  = 1137 / 0.9161 = 1241.2 code/V

V_os = 2280/1241.2 - 4.4248e-3 × 415.0
     = 1.8370 - 1.8363 = +0.0007 V = +0.7 mV   (这台机器零点极好)

隔壁那台:  V_os = +1.8 mV   ← 折算到母线 +0.41V

这个方法的残余误差来自一个二阶项:投入 R_cal 后,节点源阻抗从 19.9kΩ 变成 10.4kΩ,偏置电流在源阻抗上的压降随之变化:

ΔV = IIB × (R_th1 - R_th2) = 15nA × (19.9k - 10.4k) = 142 µV
折算到母线 = 142µV × 226 = 32 mV = 0.008%

0.008%,可以忽略。 所以这个方法在工程上是干净的。

这笔投资的收益远不止标定:把”投一次 R_cal、记两个码值”做成固件里的一条自检命令,你就得到了一个能长期在线监测分压链健康度的探针。 后面第十一节展开。


八、温漂:误差由”上下臂 TC 之差”决定,不是各自的 TC

回到 1.2 节剩下那 +0.46%,以及热机时读数被往下拉了 0.30%。这两个数都指向同一个机制。

8.1 匹配比精度重要

分压比是 R_low / (R_high + R_low)。对它取对数求导:

d(k)/k ≈ (dR_low/R_low) × (1 - k) - (dR_high/R_high) × (1 - ... )

工程上可以简化成一句话:上臂和下臂的温度系数,只有”差值”会影响分压比。

分压比温漂 ≈ (TC_low - TC_high) × ΔT        (TC 取 ppm/℃)

我们这台机器的配置:

元件 型号 TCR ΔT = 40K 时的阻值变化
上臂 6 × 750kΩ 0603 厚膜 ±1% ±100 ppm/℃ +0.40%
下臂 20kΩ 0805 薄膜 ±0.1% ±25 ppm/℃ +0.10%
分压比 失配 75 ppm/℃ −0.30% → 读数偏低

416.9V × (1 − 0.0030) = 415.65V ≈ 实测的 415.7V。 对上了。

这说明一个反直觉的选型原则:不要”给上臂挑一颗最好的、给下臂挑一颗最好的”,要”给上臂和下臂挑两颗最像的”。

具体做法:

  • 上下臂用同一系列、同一阻值档位、同一批次的电阻——同系列同批次的 TCR 一致性通常能做到 ±20 ppm/℃ 以内,失配贡献直接降到 0.08%
  • 能用排阻(resistor network)就用排阻——同一基板上做出来的电阻,TCR 跟踪可以到 5~10 ppm/℃,而且热耦合好
  • 把上下臂放在相邻位置,让它们温度相同。分压链上臂的 6 颗自热只有 6.3mW/颗,下臂 0.17mW,温差本来就小,但如果布局把下臂放在发热元件旁边,这个前提就没了
匹配策略 典型 TC 失配 40K 温差下的分压比误差 折算到 415V
各自挑最好的(不同系列) ~75 ppm/℃ 0.30% 1.25V
同系列同批次 ~20 ppm/℃ 0.08% 0.33V
同一排阻 / 匹配对 ~5~10 ppm/℃ 0.02~0.04% 0.08~0.17V

改造动作之二:把上臂换成与下臂同系列的 25ppm/℃ 薄膜电阻(或直接上排阻)。

8.2 VCR:真实存在,但比你想象的小,而且会被标定吸收

高压电阻还有一个大多数通用厚膜数据手册根本不提、但高压专用系列一定会标出来的参数:电压系数(VCR,Voltage Coefficient of Resistance)。

我核对了几个高压电阻系列的数据手册:

系列 类型 阻值范围 最大工作电压 VCR
Vishay CRHV2010 厚膜高压贴片 6M ~ 99M 2000V 15 ppm/V
Vishay CRHV2512 厚膜高压贴片 12M ~ 999M 3000V 10 ppm/V
Vishay CRHV1206 厚膜高压贴片 2M ~ 199M 1500V 25 ppm/V
Vishay RCV2010/2512-AT 车规厚膜高压 100k ~ 100M 2000/3000V 25 ppm/V
通用 0603 厚膜 1% 厚膜通用 1Ω ~ 10M 75V 通常不标

注意两件事:

  1. 高压专用系列的阻值范围从 MΩ 起步(CRHV2512 最低 12MΩ)。也就是说,你没法用一颗”高压电阻”做 20kΩ 的下臂——高压电阻本来就是给”分压链上臂”设计的。
  2. 数据手册会明确写”阻值低于 1GΩ 的按 100V 标定,1GΩ 以上的按 1000V 标定”。厂商自己承认阻值和加电压有关,所以标定电压都写进规格了。通用 0603 厚膜要么不标 VCR,要么写在最后一行小字里。

量一下它有多大:

每颗电阻跨压 @415V = 415V × 750k/4.52M = 68.8V
VCR = 25 ppm/V  →  每颗阻值变化 = -68.8V × 25ppm = -0.172%
上臂整体变化 ≈ -0.172%  →  分压比 +0.172%  →  读数偏高 0.71V

0.17%,不是”第二级误差”,但也不是主角。 而且它和零点误差一样,是”在标定点被吸收、在远离标定点时显现”的项——在 415V 标定,415V 就准。

(顺便:如果哪天你要写高压产品规格,记得 VCR 是负的——加电压阻值变小——所以它让读数偏高。方向搞反了会把诊断带偏。)

8.3 那 +0.46% 的账,最后是这样分的

清洗烘干后剩下的 +0.46%(415V 点、25℃)——也就是产线出货检验时看到的那个数:

贡献项 折算到 415V 说明
上臂/下臂电阻容差造成的分压比偏差 +0.20% 6 颗 ±1% 串起来,比值偏差约 0.2%
放大器增益误差残余(标定残差) +0.12% 标定本身也有分辨率极限
VCR(在标定点被部分吸收后的残余) +0.06% 见 8.2
ADC 参考与量化 +0.04% Vref 3.3V 的容差 + 1/2 LSB
残余板面漏电(清洗后) +0.04% 对应绝缘电阻 ~10GΩ
合计(代数求和) +0.46%

“清洗”这一刀把 4% 量级的问题切掉了,剩下的 0.46% 才是”正常的硬件误差”。 这也是为什么我一直强调先做那个对照实验:不做它,你会在这 0.46% 里面找一整天。


九、母线纹波:显示要稳,保护要快,这两个需求在同一路 ADC 上打架

上面讲的都是”直流精度”。但母线电压从来不是一个直流——它有纹波,而纹波的频率是确定的。

9.1 单相逆变器的 100Hz 母线纹波有多大

单相全桥逆变器输出的瞬时功率里有二倍频分量,这个分量必须由母线电容吞吐:

母线电压纹波峰峰:  ΔV_pp = P / (4π·f·C·V_dc)

代入 5kW 机器(P = 3500W 的典型运行点,f = 50Hz,V_dc = 400V):

母线电容 C ΔV_pp 占 400V 的比例
470 µF 29.6 V 7.4%
1000 µF 13.9 V 3.5%
2200 µF 6.3 V 1.6%
3500 µF 4.0 V 1.0%

我们这台是 1000µF,纹波峰峰 13.9V,也就是 ±7V 在跳。

这就是”母线过压保护”最容易被误触发的地方:如果保护判据用的是瞬时采样值,那它的”有效阈值”是 设定阈值 ± 纹波幅度。

9.2 用模拟滤波器压纹波,代价是响应时间

节点源阻抗 R_th ≈ 20kΩ。要在节点上加电容做低通:

fc = 1 / (2π × R_th × C)     τ = R_th × C
节点电容 C 截止频率 fc 100Hz 处衰减 阶跃响应时间常数 τ
100 nF 79.6 Hz −2.9 dB(13.9V → 10.0V) 2.0 ms
1 µF 7.96 Hz −22 dB(13.9V → 1.1V) 20 ms
10 µF 0.80 Hz −42 dB(13.9V → 0.11V) 200 ms
100 µF 0.08 Hz −62 dB(13.9V → 11mV) 2.0 s

要把它压到千分之一(0.1%),需要 100µF 的节点电容 —— 代价是过压保护的响应时间变成 2 秒。

对一台储能逆变器来说,母线过压 2 秒才动作,是不可接受的。

(顺带:100µF 电容的绝缘电阻按 4.3 节的表只有 5GΩ,并在这个节点上(20kΩ)误差 4×10⁻⁶,可以接受。但如果放在上臂就会是另一回事——再强调一遍:滤波电容放在低阻侧。)

9.3 正解:用”已知的纹波频率”换掉模拟滤波器

关键观察:我们要滤掉的那个纹波的频率是已知的(100Hz,与工频严格同步),而且它和它的所有谐波都是 100Hz 的整数倍。

于是有一个比模拟滤波干净得多的做法:在一个纹波周期的整数倍窗口上做算术平均。

原理:对 f = n × 100Hz 的分量,在一个 10ms 窗口内均匀采样 N 点,和式

Σ cos(2π·n·100·k·T_s)   k = 0 … N-1

只要采样间隔 T_s 使得 100Hz × N × T_s 是整数,这个和就严格等于 0。

这个算术平均(长度为 N 的 boxcar)的传递函数是 |sin(πNf/fs) / (N·sin(πf/fs))|,它的形状有两条必须记住的规则:

零点(增益 0): f = k · fs / N      (k 不为 N 的整数倍)
峰值(增益 1): f = m · fs          —— 混叠到直流,平均值滤波对它【完全无效】

我们这台机器的实现:ADC 定时器触发,采样率 fs = 1.2kHz,累积 N = 12 点,窗口 = 12/1.2kHz = 10ms = 正好一个 100Hz 周期。 于是零点落在 fs/N = 100Hz 的全部整数倍上。

干扰频率 12 点 / 1.2kHz 平均后的增益 说明
100 Hz 0 一个整周期,严格对消
200 / 500 / 900 Hz 0 每个都是 10ms 窗内整数个周期
20 kHz(开关纹波) 0 混叠到 800Hz = 100Hz 的整数倍 → 落在零点
20 / 40.1 / 20.5 kHz 0 分别混叠到 800 / 100 / 500 Hz,都在零点
1.2 kHz(= fs 本身) 1 混叠到直流的”穿透通道”,平均值滤波拦不住
2.4 / 3.6 / … kHz 1 同上
50 Hz 0.64 半周期,只被部分衰减

结论:用一个 10ms 的算术平均窗口,100Hz 及其全部谐波被严格消除,延迟只有 10ms。 而模拟滤波要达到同样干净的效果需要 2 秒。

但注意最后三行的陷阱:采样率的整数倍频率会混叠到直流,平均值滤波完全无效。

举个具体例子:如果采样率取 1kHz、开关频率是 20kHz,那么 20kHz = 20 × 1kHz——开关纹波正好落在穿透通道上,无论你平均多少个点,它都原封不动地穿过来。

所以这里有一条不太直观的设计规则:采样率必须与纹波基频成整数倍关系(这样才能对消 100Hz),但不要与开关频率成整数倍关系。

  • 取 fs = 1.2kHz、N = 12:100Hz 及其谐波全灭;20kHz / 1.2kHz = 16.67(非整数)→ 混叠到 800Hz,也在零点上
  • 取 fs = 1kHz、N = 10:100Hz 及其谐波全灭;但 20kHz / 1kHz = 20(整数)→ 开关纹波直接穿透

这就把”显示要稳”和”保护要快”这对矛盾解开了 —— 用已知的干扰频率换时间,而不是用滤波器换时间。

(这条思路和电流那篇第九节的”提高采样率优于堆滤波器”是同一件事的两个方向:那篇是提高采样率躲开混叠,这篇是用整周期平均对消已知频率的干扰。共同点:都不要先动滤波器。)

两个必须注意的实现细节:

  1. 模拟抗混叠滤波器还是要的(放在隔离放大器的输出侧,也就是低阻侧)。因为总有频率不落在零点上(比如 20.05kHz 会混叠到 50Hz,那里增益是 0.64),而这个混叠是平均值滤波无法消除的。一颗 R = 1kΩ + C = 100nF(fc ≈ 1.6kHz)就够,把开关纹波削到 LSB 以下即可。
  2. 采样窗口要与逆变器工频同步(用同一个时基,或者至少保证窗口长度严格等于 10ms)。离网模式下逆变器自己产生工频,频率会有 ±0.5Hz 的漂移;10ms 窗口下这个偏差带来的相位失配只有 0.18°,对消效果不受影响。

9.4 过压保护的判据不能是”一次采样超阈值”

有了整周期平均,显示和常规控制都稳了。但保护通道要保留”快”的能力,所以它用的不是平均值,而是一组独立判据:

OVP 判定(三条独立判据,任一成立即 count++)
  1. 瞬时值超阈值  → 连续 3 次(每次间隔 1ms)→ 记 raw_ov 事件
  2. 平均值超阈值  → 连续 2 个 10ms 窗口  → 记 avg_ov 事件
  3. 斜率判据      → |dV/dt| > 阈值         → 记 slope_ov 事件

动作分级
  raw_ov 单独成立(平均值没超)  → 只记计数 + 上报,不跳机
  avg_ov 成立                    → 降额运行(限制 MPPT 或放电功率)
  avg_ov + slope_ov 同时成立     → 立即停机
  raw_ov 在 1 小时内超过 20 次   → 报"母线纹波异常"(通常是电容老化)

为什么要分三级: 因为”母线纹波变大”本身就是一个重要的健康指标(母线电容的 ESR 上升或容值衰减会让纹波增大),但把它直接当成过压来停机,会让一台健康的机器在重载下频繁跳机。分三级之后,你既保住了保护速度,又拿到了一个免费的电容健康探针。


十、安全:分压链不能当绝缘,也不能当泄放

这一节是红线,不是优化。

10.1 爬电距离不是”两个焊盘隔多远”

400V DC 的工作电压,按 IEC 60664-1 污染等级 2 的爬电距离表:

工作电压(有效值或直流) 材料组 I(CTI ≥600) 材料组 II(CTI 400~599) 材料组 IIIa/IIIb(CTI 175~399)
200 V 1.0 mm 2.0 mm 2.5 mm
250 V 1.3 mm 2.5 mm 3.2 mm
320 V 1.6 mm 3.2 mm 4.0 mm
400 V 2.0 mm 4.0 mm 5.0 mm
500 V 2.5 mm 5.0 mm 6.3 mm
630 V 3.2 mm 6.3 mm 8.0 mm

标准 FR-4 属于材料组 IIIa(CTI 175~399),所以 400V 档要 5.0 mm。(高 CTI FR-4 可以做到组 II 甚至组 I,代价是板材成本。三防漆在多数安规里可以用来降低电气间隙的等效污染等级,但通常不允许直接降低爬电距离要求,除非涂层次别经过专门认证——这一条常被误用。)

现在把这个数放到分压链上:6 颗 0603 排成一排,封装本体长 1.6mm,加上焊盘和间隙,整行大约 12~14mm。首尾两端之间的工作电压是 415V → 沿这个行排的表面路径就是那 12~14mm。

12~14mm vs 5.0mm —— 名义上有余量。但注意这个余量是怎么来的:它完全是”元件排在一条线上、沿着元件表面绕过去”这个物理事实给的。 一旦:

  • 元件错位排布(为了紧凑),
  • 行排中间有一颗电阻的焊盘被污染,
  • 或者维修时补焊留下了锡珠/助焊剂桥,

这条 12~14mm 的路径就可能在局部缩到 1mm 以内,而它上面挂着 415V。

布局动作:

  • 分压链的首尾之间必须有一条明确的”隔离带”(≥5mm 净空),不要在中间塞任何其它网络
  • 高压区与低压区之间开 1mm 宽的爬电槽(每条槽按 2 倍槽深增加表面路径)
  • 分压链上方和下方都不要铺铜;如果必须铺地做屏蔽,高压段的净空 ≥5mm,并且在分压节点一侧断开
  • 分压节点区域阻焊开窗做到最小(阻焊覆盖处的表面路径更长,且能挡污染)

10.2 分压链不能承担安全绝缘功能

这是最容易出事的一条:分压链的”MΩ 级电阻”在功能上是分压,在安全上它是”什么都没做”。

理由:

  • 单颗电阻的失效模式包括开路、短路、以及阻值大幅漂移
  • 6 颗串联的结果是”开路概率 × 6″,但更重要的是:任何一颗短路,分压比都会掉 1/6
  • 没有任何一颗电阻带”失效到安全”的特性
  • 因此分压链只能算功能绝缘

安全隔离必须由隔离器件承担:AMC1311 系列是增强型隔离(UL1577 认证,额定工作电压 1.5 kVrms,耐受瞬态 7 kVpeak),它在 400V 母线上提供 >4 倍的余量,这才是”人不会触电”的依据。

写进设计规范的一句话:分压链的阻值、精度、乃至它是否存在,都不影响产品的安全等级。 如果哪一天有人为了”省一个隔离器件”而让分压链承担隔离功能,那不是成本优化,那是产品召回。

10.3 泄放:分压链的 2.43 小时 vs 标准的 5 秒

母线电容在断电后还存着电。这块板子的储能量:

E = ½ × C × V² = 0.5 × 1000µF × 415² = 86.1 焦耳

86 焦耳是什么概念:能让你在接触母线端子时有一次非常难忘的经历。

降压到 60V(安全阈值)需要多久? 放电规律 t = R·C·ln(V0/60),V0 = 415V:

泄放电阻 R τ = R·C 降到 60V 的时间 常态功耗 = V²/R
4.52 MΩ(分压链) 4520 s 8742 s = 2.43 小时 0.04 W
30 kΩ 30 s 58 s 5.5 W
7.8 kΩ 7.8 s 15 s 22 W
2.6 kΩ 2.6 s 5 s 66 W

分压链从结构上就不可能兼任泄放:它需要的阻值(4.52MΩ)和泄放需要的阻值(2.6kΩ~30kΩ)差 150~1700 倍。

而安规对”断电后多久降到 60V 以下”是有明确时限的(IEC 61800-5-1 体系下的常见口径:可触及的直流母线端子按秒级,永久连接且带警告标识的端子放宽到十几秒;也有 5 分钟级别的口径,具体取决于产品类别和端子的可触及性,必须以产品标准原文为准)。

所以:

  • 不要指望分压链做泄放——它做不到,而且如果指望它,你会漏掉真正需要的泄放通路
  • 常接泄放电阻的路线(30kΩ / 5.5W)适合中低功率机器,代价是一个 5.5W 的常热源
  • 大功率机器要用主动泄放(断电后由继电器/IGBT 投入低阻电阻,几百 ms 内放完,然后断开),代价是断电检测电路和一套逻辑
  • 无论选哪条路,都要在机器外壳上标注”断电后等待 XX 秒”——这条标签是安规的一部分,不是装饰

10.4 保护环:当阻值必须做很大时的正解

如果哪一天你真的必须把分压链做到 22MΩ 甚至更高(比如为了把分压功耗压到 10mW 以内),那 4.2 节那张表告诉你:100MΩ 的板面漏电会带来 22% 的误差。这时候硬扛是没用的,得上保护环(guard ring)。

原理不复杂:

        ┌─────────── 保护环(跟随节点电位的铜环)──────────┐
        │                                                    │
  ┌─────┴──────┐   ← 板面漏电流被环"截走",不流过分压节点
  │  R_high    │
  └─────┬──────┘
        ├────────── V_node ──┬── 到放大器输入(1GΩ)
        │                    │
        │              ┌─────┴─────┐
        │              │ 缓冲器    │ ← 输入偏置 pA 级
        │              └─────┬─────┘
        │                    └──────→ 驱动保护环
  ┌─────┴──────┐
  │  R_low     │
  └─────┬──────┘
       GND1

节点源阻抗 20kΩ,用一颗输入偏置电流 pA 级的运放做跟随器就能驱动这圈环(环的驱动电流需求和阻抗无关)。因为环和节点同电位,从高压区流向节点的表面漏电流会先被环收集,然后由缓冲器吸走,不流过分压节点 → 不产生误差。

代价:

  • 多一颗运放 + 一圈布局空间
  • 保护环本身也要满足爬电要求,不能把高低压之间的距离吃光
  • 局部的好处理(清洗 + 三防漆 + 开槽)在多数项目里已经够了,保护环属于”当上述手段都不够时”的选项

排序建议:清洗 > 三防漆 > 间距/开槽 > 阻值选择 > 保护环。 成本递增,收益递减。


十一、固件侧:定点、两点标定、以及一个能长期跑的在线探针

11.1 定点换算:先乘后除 + int64

沿用站内一贯的铁律(零 malloc、禁 %f、全程整数、检查 snprintf 返回值):

/* 分压链标定参数(由 7.3 节的注入法算出,Q16 定点) */
typedef struct {
    uint32_t vbus_gain_q16;   /* 码值 -> 母线 mV,Q16 */
    int32_t  vbus_off_mv;     /* 截距,mV */
    uint32_t cal_valid;       /* 标定有效标志 */
    uint32_t cal_cnt;         /* 标定次数 */
} vbus_cal_t;

static vbus_cal_t g_cal;

/* ADC 码值 -> 母线电压(mV)。先乘后除,中间量用 int64 */
int32_t vbus_code_to_mv(uint32_t code)
{
    int64_t t;
    if (!g_cal.cal_valid) {
        return -1;                       /* 未标定,上层必须降级处理 */
    }
    t = (int64_t)code * (int64_t)g_cal.vbus_gain_q16;   /* code * gain */
    t = (t + 32768) >> 16;                              /* Q16 取整 */
    t += g_cal.vbus_off_mv;
    if (t < 0) { t = 0; }
    if (t > 600000) { t = 600000; }      /* 600.000V 硬上限,防溢出上报 */
    return (int32_t)t;
}

注意 snprintf 的返回值一定要检查——它返回的是”想写入的长度”,不检查就会发出一个被截断但看起来完全合法的 JSON:

int n = snprintf(buf, sizeof(buf), "{\"vbus\":%ld}", (long)mv);
if (n < 0 || (size_t)n >= sizeof(buf)) {
    /* 截断了,宁可不发也不要发半个 JSON */
    report_fault(FAULT_FMT_TRUNC, n);
    return -1;
}

11.2 两点标定的固件实现

把 7.3 节的解算写进固件,标定过程就是”测两个点、解两条方程”:

/* k1, k2: 两次标定时的分压比,Q24 定点(由电阻标称值算出)
 * code1, code2: 对应的 ADC 码值
 * vbus_mv: 标定时的母线电压(由外部万用表/高压源给出)
 */
int vbus_cal_two_point(uint32_t code1, uint32_t code2,
                       uint32_t k1_q24, uint32_t k2_q24,
                       uint32_t vbus_mv)
{
    int64_t dcode, dk, S_q20, tmp;

    dcode = (int64_t)code1 - (int64_t)code2;
    dk    = (int64_t)k1_q24 - (int64_t)k2_q24;      /* 单位: 2^-24 */
    if (dcode <= 0 || dk == 0) {
        return -1;                                   /* 两个点太近,拒绝 */
    }
    /* S = dcode / (dk * vbus) ,S 的量纲 code/V,用 Q20 存 */
    tmp = (dk * (int64_t)vbus_mv) >> 24;             /* 无量纲 × mV */
    if (tmp == 0) { return -1; }
    S_q20 = (dcode << 28) / tmp;                     /* 见下方说明 */
    if (S_q20 <= 0) { return -1; }

    /* V_os(mV) = (code1 * 1000 / S) - k1 * vbus_mv */
    tmp = ((int64_t)code1 * 1000) << 20;
    tmp = tmp / S_q20;
    tmp -= ((int64_t)k1_q24 * (int64_t)vbus_mv) >> 24;

    /* 折算成 vbus 侧的 gain/offset 存下来 */
    g_cal.vbus_gain_q16 = (uint32_t)(((int64_t)1000 << 20) / S_q20 / 1);  /* mV/码 */
    /* 把节点侧失调折算到母线侧:除以分压比 k1 */
    g_cal.vbus_off_mv = (int32_t)(((tmp << 24) / (int64_t)k1_q24));
    g_cal.cal_valid = 1;
    g_cal.cal_cnt++;
    return 0;
}

(上面是骨架,实际项目里 Q 格式的移位要对齐好;这里重点不是代码本身,而是“两点标定在固件里就是解一个二元一次方程组”——总共不超过 40 行。)

11.3 把标定变成在线探针

这是本篇我最想推荐的一件事。

既然固件里已经有了”投 R_cal、测两个码值”的能力,那就把它做成一条周期自检命令,比如每 24 小时跑一次(选在母线电压稳定的时段,比如恒流充电段):

每 24h 或每次开机 5 分钟后:
  1. 记录 (code_a, vbus_mv)          ← 正常状态
  2. 投入 R_cal,稳定 200ms 后记 (code_b)
  3. 用 (k1, k2) 解出 S 和 V_os
  4. 与出厂标定值比较,存差值

上报字段:
  cal_drift_ppm    零点漂移(相对出厂),ppm
  cal_gain_ppm     增益漂移(相对出厂),ppm
  cal_cnt          累计自检次数
  leak_idx         漏电指数 = 本次 V_os 相对上次的变化量

为什么这个探针值钱:

  • 零点漂移:直接反映放大器 + 分压链的长期稳定性。超过 ±2000 ppm(0.2%)就值得去现场看一眼。
  • 增益漂移:反映分压比。如果它往一个方向单调走,说明分压链上出现了新的并联通路——也就是漏电在长大。
  • 把”温湿度相关的误差”和”不可逆的器件漂移”分开:如果零点漂移随季节来回摆,那是湿度;如果它单调地越走越远,那是电化学迁移。

这是一个成本几乎为零、但能把”事后返修”变成”提前预警”的功能。 对一台要在南方室外机柜里跑五到八年的储能机,它的价值比多一颗 B 版芯片大得多。


十二、现场五招

按”从最便宜的开始”排。

招 1:洗板对比法(最快,先做这个)

动作:把分压链那一片区域用无水乙醇(或专用清洗剂)清洗 5 分钟,再 80℃ 烘干 2 小时,冷到室温后测。

为什么必须”洗 + 烘”两步:只洗不烘,残余溶剂会让表面电阻更低,误差会变大——你会得到”洗了更糟”的错误结论。烘干是必须的,不是可选的。

判据:偏差变化 >0.5% → 板面漏电/污染;变化 <0.1% → 板子是干净的,问题在别处。

我们那台:+3.52% → +0.46%。一次实验定方向,成本 40 分钟。

招 2:呼吸法(零成本,湿度敏感度直接可见)

动作:对着分压链那一片区域哈几口气(或者用雾化器在 10cm 外喷一次纯净水雾),盯着读数看 10 秒,然后立刻用热风枪(80℃)吹干。

原理:呼气的相对湿度接近 100%,能在 1~2 秒内让板面形成一层水膜。如果读数在 2 秒内跳了几个百分点,那就是板面绝缘的问题,跟元件没关系。

注意:这是诊断手段,不是验证手段。吹完必须立刻烘干,且不要在有高压裸露的板子上做。做之前先断电放完电。

招 3:注入法测零点(要有一颗备用电阻)

动作:在分压节点上并一颗与下臂同阻值的电阻(精度 0.1% 就够),记录投入前后的两个 ADC 码值,用 7.3 节的公式解出 S 和 V_os。

判据:解出的 V_os 折算到母线超过 ±1V(相当于输入失调 >4.4mV)→ 放大器档次不够(非 B 版),换 B 版。

这一招还有一个附带用途:如果投入 R_cal 后解出的 S 与你按电阻标称值算出的 S 差得很多(比如差 40%),说明放大器输入阻抗在吃你的分压比——直接指回 5.1 节那个 −47.5%。

招 4:绝缘电阻直测法(断电 + 抬开一端)

动作:断电、放完电、把上臂最上面那颗电阻抬开一端(或者拆掉),然后用绝缘测试仪(500V 档)量”母线正极焊盘 → 分压节点焊盘”的表面电阻。

为什么必须抬开一端:不抬开,你量到的是 4.5MΩ ∥ R_leak——分压链本身的 4.5MΩ 会完全主导读数,你什么都看不到。

判据(与 4.1 节对齐):

测量值 对 4.5MΩ 上臂的误差贡献 判定
>10 GΩ <0.05% 干燥洁净的合格品
1~10 GΩ 0.05~0.45% 正常
100 MΩ ~ 1 GΩ 0.45~4.5% 不满足 1% 精度要求
<100 MΩ >4.5% 必须清洗/涂层/改布局

注意:这个测量对湿度极其敏感。要在恒定的环境条件下测(比如 25℃/50%RH 的实验室),并且记录当时条件。 在车间里测出来的数没有可比性。

招 5:高压源四点扫描(要一台可调高压直流源)

动作:用一个可调高压源(或者几台 100V 电源串起来)分别给 100V、200V、300V、400V,每个点等到读数稳定后记录,然后画散点图。

判据:

散点特征 结论
直线过原点 理想
直线不过原点(有截距) 零点误差(放大器失调 / 板面漏电)
不是直线(斜率随电压变) VCR 或放大器非线性
低压段准、高压段偏 VCR(尤其是上臂串联颗数少的时候)
数据抖动大、重复性差 漏电(电化学过程本身有噪声)

这一招最大的价值是把”零点”和”非线性”分开了——而在电压采样链路上,这两个东西在现场症状里长得很像(都是”读数不对”)。

症状 → 根因定位表

症状 首要怀疑 快速验证
读数随湿度变,烘干就恢复 板面漏电(上臂侧) 招 1 + 招 2
读数单向偏高,且随湿度增加 上臂被旁路(漏电/电容) 招 4
读数单向偏低,且与温度相关 下臂被旁路 / TC 失配 招 1 + 招 3
读数非线性(高低压不一致) VCR(串联颗数少) 招 5
显热机偏低、冷机偏高 上下臂 TC 失配 招 3(看 V_os 是否随温变)
同批板子读数分散 ±0.2% 以上 放大器零点分布 招 3
单独一台偏很多(>5%) 放大器输入阻抗吃分压比 / 元件装错 招 3(看解出的 S)
过压保护偶发误动作 纹波叠加 + 零点偏移 看 raw_ov / avg_ov 计数
长期(半年以上)单调漂移 电化学迁移 招 4 + 看涂层与清洗记录
读数在 ±7V 内来回跳 100Hz 母线纹波没滤干净 检查平均窗口是否整周期

十三、十四项落地清单

  • ☐ 分压链的满量程按”母线最高工作电压 + 20% 余量”设计,不要贴着 2V 满量程用
  • ☐ 上臂串联颗数按单颗额定工作电压算(不按功率算),并留 30% 以上电压余量
  • ☐ 上臂与下臂用同系列同批次电阻,或直接上排阻;不要”各自挑最好的”
  • ☐ 下臂尽量小(推荐 ≤20kΩ),把节点源阻抗压下来,同时降低对漏电的敏感度
  • ☐ 隔离放大器按输入阻抗 + 输入偏置电流选型;分压链必须用高阻输入型(1GΩ 级)
  • ☐ 隔离放大器用全温区规格更严的那一档(Vos ≤1.5mV、CMTI ≥75 kV/µs)
  • ☐ CMTI 先用 3 × V_bus / t_sw 算出门槛,再选器件;不要靠”实验室没炸”来判定
  • ☐ 滤波电容放在节点侧(低阻侧);禁止跨接在上臂两端;优先 NP0/C0G
  • ☐ 分压链区域单独定一条表面绝缘电阻指标(建议:干燥 ≥10GΩ,40℃/90%RH 168h 后 ≥1GΩ)并单独验证
  • ☐ 布局:分压链首尾之间留 ≥5mm 隔离带、高压/低压区开 1mm 爬电槽、节点区阻焊开窗最小化
  • ☐ 生产流程:先清洗、再烘干、后三防漆;涂层前做 SIR 抽检并留记录
  • ☐ 标定点选在保护阈值附近,不要图方便用低压标定;有条件就做两点标定(注入法)
  • ☐ 固件:全程整数定点(先乘后除 + int64)、零 malloc、禁 %f、检查 snprintf 返回值
  • ☐ 固件:过压保护分三级判据(瞬时 / 平均 / 斜率),并把标定做成周期性在线自检

最后

这台机器最后是这么修好的:

  • 产线增加清洗 + 烘干 + 三防漆(工序成本约 1 元/台),并在涂层前做 SIR 抽检
  • 分压链上臂从 0603 换成 0805(额定 75V → 150V),并把 6 颗改成 10 颗(每颗 41.5V)
  • 上臂电阻换成与下臂同系列的薄膜料,TCR 失配从 75 ppm/℃ 降到 20 ppm/℃
  • 放大器从 AMC1311 换成 AMC1311B
  • 布局:分压链两侧开了 1mm 爬电槽,节点区域缩小了阻焊开窗,去掉了原本压在分压链下面的一小块地铜
  • 固件:单点标定改成注入法两点标定,标定点从产线的 200V 挪到 415V;过压保护改成三级判据;把标定做成 24 小时一次的自检

结果:

指标 改造前 改造后
梅雨清晨(25℃/潮湿)415V 处偏差 +3.86% +0.21%
热机(65℃/干燥)415V 处偏差 +0.16% +0.05%
同批 20 台零点分散(最坏) ±1.6 mV ±0.24 mV
过压误动作次数(一个梅雨季) 平均 7.3 次/台 0
分压链区域 40℃/90%RH 168h 后绝缘电阻 0.12 GΩ >2 GΩ
每颗电阻最大跨压(450V 母线) 74.7 V(0603 额定 75V) 41.5 V(0805 额定 150V)

我最大的收获不是这些数字,而是一个视角的转变。

以前我看母线电压采样,看到的是”两个电阻加一个隔离放大器”。现在我看到的是”一条 MΩ 级的高阻路径,它暴露在空气、水汽、助焊剂残留和灰尘面前,而它的精度取决于这条路径周围每一个绝缘体的状态”。

从”两个电阻”到”一条高阻路径”,这个视角变了之后,很多事情就顺了:

  • 为什么滤波电容的位置这么重要——因为它把节点阻抗改写了
  • 为什么”多串几颗电阻”不只为额定电压——因为它把长路径切成短路径
  • 为什么”洗板”这种看起来不入流的动作能解决一个 4% 的问题——因为 4% 的问题本来就长在板面上
  • 为什么安规不承认三防漆能降低爬电距离要求——因为它承认的是”几何”,不是”涂层”

还有一个更具体的教训,和电流那篇是一对:那篇的教训是”出厂检验测的都是常量项,现场漂移几乎全是温度项”;这篇的教训是”出厂检验都在干燥的板子上做,而现场的漂移几乎全是湿度项”。

如果你的验收标准里没有”湿热前后对比”这一条,那么这类问题一定会在你发往南方之后、在第一个梅雨季里冒出来。 而且它不会以”精度问题”的形式出现,它会以”过压保护误动作”的形式出现——因为一台机器的保护阈值,通常只留了 3~4% 的余量。

如果你也在做高压母线采样,或者正被某个”湿度一大读数就不对”的问题缠着,欢迎留言——我特别好奇”三防漆的工艺卡上,”洗-烘-涂”这三步的间隔时间”这一条,别人家是怎么定规矩的。


相关阅读


本文配套脚本:_tools/bus_volt_sense_calc.py —— 母线电压采样链路现场估算器。mode: div(分压链设计:给定母线最高电压/满量程/下臂阻值 → 上下臂、比值、功耗、单颗跨压、最少串联颗数)、leak(漏电敏感性:绝缘电阻 → 误差、反解允许的绝缘电阻、IPC 判据对照、串联分段的影响)、iso(输入阻抗与偏置电流:源阻抗 → 误差、分流比、六档放大器对照)、vc(温漂与 VCR:上下臂 TC 失配 → 温度误差、VCR → 电压误差、匹配策略对照)、cmti(共模门槛:V_bus/t_sw → 要求 CMTI → 器件判定)、ripple(母线纹波:峰峰幅度、模拟滤波 vs 整周期平均、平均窗口的零点表)、cal(标定解算:单点标定的量程误差曲线、注入法两点解算、R_cal 取值)、ovp(过压保护预算:阈值余量、纹波与零点占位、三级判据)、bleed(泄放账:储能、降到 60V 的时间常数、分压链 vs 泄放电阻的量级对比)、triage(症状 → 根因定位表)。纯标准库,全离线,不联网。自带 --self-test。

下次打算写:逆变器 Modbus 点表与上位机对接(读同一个寄存器,为什么厂家上位机和我的读数差 2V——数据类型、字节序、倍率、点表版本、以及”协议一致但语义不一致”的那几种坑),或者 储能 PCS 的绝缘监测与漏电流检测(把本篇第五节的漏电问题从”误差”升级成”保护功能”)。哪个先写,看这周的活先到哪个。