母线电压采样链路设计实战:一台储能逆变器”阴雨天的上午反复报母线过压”——415V 的母线,板子一潮就读成 431V,而在产线上它”合格”地偏了 0.46%
这台 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 版。
- 零点:±9.9mV → ±1.5mV,折算到母线上从 ±2.24V 变成 ±0.34V。而这个零点没法靠”短路输入”标定掉(第七节讲为什么)。
- CMTI:15 → 75 kV/µs。这一条是生死线,下一节算。
- 增益漂移:±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 | 通常不标 |
注意两件事:
- 高压专用系列的阻值范围从 MΩ 起步(CRHV2512 最低 12MΩ)。也就是说,你没法用一颗”高压电阻”做 20kΩ 的下臂——高压电阻本来就是给”分压链上臂”设计的。
- 数据手册会明确写”阻值低于 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(整数)→ 开关纹波直接穿透
这就把”显示要稳”和”保护要快”这对矛盾解开了 —— 用已知的干扰频率换时间,而不是用滤波器换时间。
(这条思路和电流那篇第九节的”提高采样率优于堆滤波器”是同一件事的两个方向:那篇是提高采样率躲开混叠,这篇是用整周期平均对消已知频率的干扰。共同点:都不要先动滤波器。)
两个必须注意的实现细节:
- 模拟抗混叠滤波器还是要的(放在隔离放大器的输出侧,也就是低阻侧)。因为总有频率不落在零点上(比如 20.05kHz 会混叠到 50Hz,那里增益是 0.64),而这个混叠是平均值滤波无法消除的。一颗 R = 1kΩ + C = 100nF(fc ≈ 1.6kHz)就够,把开关纹波削到 LSB 以下即可。
- 采样窗口要与逆变器工频同步(用同一个时基,或者至少保证窗口长度严格等于 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% 的余量。
如果你也在做高压母线采样,或者正被某个”湿度一大读数就不对”的问题缠着,欢迎留言——我特别好奇”三防漆的工艺卡上,”洗-烘-涂”这三步的间隔时间”这一条,别人家是怎么定规矩的。
相关阅读
- 电流采样链路设计实战:同一台逆变器早上显示 5.00A、中午 5.42A——拆到最后,8% 的漂移里有 5.5% 是走线上那段铜 —— 姊妹篇。那篇讲 mΩ 级的硬源(分流电阻),本篇讲 MΩ 级的软源(分压链);那篇的核心公式是
I_err = Vos/R,本篇的核心公式是误差 ≈ R_high/R_leak。两篇的”现场五招”可以对照着看 - ADC 采样精度实战:同一颗 12 位 ADC,凭什么别人做到 11.5 bit 有效精度,我只有 9 bit? —— 本篇第十一节那两条”先乘后除””检查 snprintf 返回值”的铁律,在那篇里有完整的来历和定点排查方法
- PCB 布局与 EMC 实战:一次辐射超标 8dB 的整改记,让我把”布局三分靠画、七分靠想”刻进了脑子 —— 第十节那些”隔离带、爬电槽、铺铜净空”的规则,属于那篇”布局即滤波器”思路在高压上的应用
- EMC 传导发射(CE)排查实战:辐射整改完刚松口气,传导又超标 10dB —— 第九节那个”整周期平均消除已知频率干扰”的思路,和那篇里”共模噪声路径与滤波位置”是同一套物理
- ESD/浪涌防护实战:一次雷雨季的成批返修,逼我把 TVS、放电管和接地路径从头补了一遍课 —— 本篇讲的是”持续的、慢性的板面漏电”,那篇讲的是”瞬态的、破坏性的能量泄放”;两者共用同一片板面,是电压应力下的两种不同时间尺度
- LDO 与 DCDC 电源设计实战:一次 ADC 采样跳动,逼我把整块板子的电源重做了一遍 —— 5.3 节那张表里”PSRR vs VDD1 在 10kHz 纹波下只有 −65dB”这项,说明隔离放大器的电源侧同样要按那篇的规矩做
- 上拉/下拉电阻取值实战:同一颗 I2C,为什么别人 4.7kΩ 我得换 2.2kΩ 才稳 —— 本篇第三节”下臂阻值决定源阻抗和功耗”与那篇”上拉阻值决定上升沿和电流”是同一类权衡:一个阻值同时绑着两个互相拉扯的指标
- 低功耗外设与传感器电源门控实战:给传感器加了断电开关,功耗反而涨了——一次”门控做反”的完整复盘 —— 3.1 节那张”下臂越小、功耗越大”的代价表,在那篇里有完整的低功耗预算方法
本文配套脚本:_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 的绝缘监测与漏电流检测(把本篇第五节的漏电问题从”误差”升级成”保护功能”)。哪个先写,看这周的活先到哪个。