两轮BMS 电流标定策略
BMS 电流标定策略基于量产 60V BMSSTM32F072 SH367306 × 20.5mΩ 采样电阻拆解电流采样链路的完整标定策略。涵盖四层处理的物理根源、工程考量与取舍逻辑。一、问题的起点0.5mΩ 上的 15mV先建立一个量级概念。30A 放电电流通过 0.5mΩ 采样电阻产生的差分电压是V I × R 30A × 0.0005Ω 15mV15 毫伏。这是全量程的信号幅值。SH367306 内部的 12-bit CADC 在这个量程下一个 LSB 约等于 24.4mA。即整个 30A 量程被切成约 1229 个有效码值。但问题不在分辨率——1229 个码值对 BMS 来说够了。问题在精度当你在 25°C 标定好、拿到 -20°C 的环境里零电流时的读数可能已经飘出去 1A 以上了。这是几个完全不同的物理效应叠加的结果需要一套分层策略来处理。二、四层处理总览整个电流数据流从上电到输出最终值经过四层处理CADC 原始值12-bit 方向位 │ ┌────────────┼────────────┐ │ 上电自学习 │ 温漂补偿 │ ← ① 零点校准加性误差 │ Offset₂₅ │ Δ(T) │ 消除 Vos 和温漂 └────────────┼────────────┘ │ ┌────────────┴────────────┐ │ ChgCurFactor │ ← ② 增益校准乘性误差 │ DsgCurFactor │ 修正 PGA 正负增益不对称 └────────────┬────────────┘ │ ┌────────────┴────────────┐ │ 中值滤波 (Median 3) │ ← ③ 瞬态滤波 │ 消除 EMI 稀疏尖峰 │ 剔除 MOSFET 开关耦合的脉冲噪声 └────────────┬────────────┘ │ ┌────────────┴────────────┐ │ 死区归零|I| 250mA │ ← ④ 残余切除 │ 防止 SOC 积分漂移 │ 切除校准残差 ADC 本底噪声 └────────────┬────────────┘ │ 最终电流值先消除系统误差加性 → 乘性再处理随机噪声中值 → 死区。这个顺序的核心理念是把 ADC 码值修到最接近物理真实值之后才对物理真实值做信号处理——让滤波器面对的是已经校准好的真实电流而不是还没修正斜率的角度值。三、① 零点校准加性误差的两层零点漂移是电流采样精度最大的敌人。它的物理来源是 SH367306 内部 PGA 的输入失调电压Vos。这个电压在信号进入 ADC 之前被放大 200 倍温度变化 80°C 时等效到采样电阻上就是约1.6A的偏移。而全量程只有 15mV——这不是误差是测量到了完全错误的值。3.1 上电自学习解决芯片个体差异每颗 SH367306 出厂时的失调电压都不同——取决于硅片的随机掺杂分布片间差异可达几百 mA 等效偏移。所以每块 BMS 板的零点都需要独立学习。自学习的前提是采样电阻上确实没有电流。固件在 AFE 初始化阶段强制关断充放电 MOS——背靠背 MOSFET 的体二极管反向串联任何方向的电流都走不通。零点学完、PMM 接手后才会闭合 MOS。这个时序保证了一个干净的零电流窗口不需要产线设备配合。学习过程是一个去异常取均值的过程连续多次采集 CADC取两次不同值的平均值作为初始零点。为什么是两次不同值而不是单次因为单次采样可能恰好落在噪声尖峰上——如果学了那个值整个 SOC 积分就会从错误起点开始。两次不同值天然排除了偶发异常。学到的值随后被归一化到 25°C 基准存入全局变量Offset₂₅。3.2 温漂补偿解决批量特性上电自学习得到的是当前温度下的零点。但 BMS 从 -20°C 的冷库到 60°C 的暴晒天都在工作零点在这个范围内可漂移 1.6A。温漂的根源是 PGA 输入失调电压的温度系数约 50 nV/°C。这个系数同一批次的 SH367306 之间非常一致——片间差异小于 50mA。所以可以采取研发标定一次、所有板子共用的策略。研发阶段取 10 块板子放在高低温箱里电池断开每 5°C 一个台阶、每台阶停留 30 分钟等热平衡记录零电流时的 CADC 读数。10 块板子取中位数做成一张 13 点的温度补偿表-40°C 到 75°C。初始化学到的零点根据当前芯片温度和这张表消除温漂分量归一化到 25°C 基准。运行时每次读电流都查表补偿当前温度相对于 25°C 的漂移量。为什么不能每块板子都在产线标定温漂一块板子跑完整的高低温循环要 3-4 小时产线节拍不允许。片间一致性足够好——50mA 的残余漂移落在后续死区范围内——所以批量补偿是正确的工程选择。四、② 增益校准乘性误差的一层4.1 为什么要充放电分开标定SH367306 的 CADC 内部 PGA 在信号的正半周和负半周增益不完全对称。这是差分放大器的固有特性——量产芯片的充放增益偏差约 1%-3%。对 BMS 来说这意味着同样的 30A充电和放电两个方向的读数可能差 0.6A。更关键的是这个偏差无法用零点补偿解决——零点修的是0 的位置增益修的是斜线的斜率。两者在数学上是正交的你不可能通过上下平移一条线来改变它的斜率。4.2 为什么增益放在零点之后、滤波之前先做零点→再做增益的顺序是数学上唯一正确的选择。假设原始信号 真实电流 × k bk 是增益b 是零偏那么正确先减 b 再除以 k → (原始 - b) / k 真实电流 错误先除以 k 再减 b → 原始/k - b ≠ 真实电流b 没被 k 影响增益放滤波之前同样关键。中值滤波的检测对象应该是校准好的物理真实值——如果增益还没修正就去滤波跳变阈值会因增益系数偏移而失真。比如 59mA 的等效跳变在极端增益系数下可能变成 47mA 或 74mA。4.3 产线逐板标定增益不对称受采样电阻精度±1%、AFE 内部 PGA 增益公差±2%的共同影响每块板子不一样。必须产线逐板标定。生产线上工装用精密恒流源先后输出 20A 和 -20A上位机读取 BMS 上报的电流值算出两个方向的校准系数并写入 EEPROM。每次上电时从 EEPROM 读取值在 800~1200即 0.8~1.2 倍范围内才生效否则用默认值 10151.015 倍。4.4 增益为什么不补偿温漂增益也随温度变化但量级极小。PGA 的增益由两个同类型电阻的比值设定——同一硅片、同一温度梯度、同一工艺——绝对阻值可能漂 ±20%但比值漂移不到 5 ppm/°C。80°C 温差下对应 0.04% 的增益变化等效到 30A 上约 12mA。采样电阻本身的 TCR约 50 ppm/°C稍大约 120mA——但仍然被 250mA 死区掩盖。做逐温度的增益标定需每板 9 个数据点换来的只是 120mA 精度提升工程上不值得。五、③ 中值滤波剔除尖峰而非抹平5.1 噪声特性决定了滤波器选择电流信号中的噪声有两类MOSFET 303Hz PWM 开关耦合进来的稀疏大振幅尖峰和 ADC 量化产生的连续低振幅白噪声±24mA。这两种噪声需要完全不同的策略。白噪声适合平均——滑动窗口或 EWMA 可以平滑掉高频分量。尖峰则必须剔除而非抹平——一个 5A 的尖峰如果被 8 点滑动平均处理会变成 5A/8 0.625A 的缓坡扩散到 8 个输出值里SOC 积分全部被污染FDR 过流保护的响应也被拖慢。5.2 中值滤波的原理中值滤波Median Filter是尖峰噪声的天然克星。它维护一个固定大小的窗口本项目取 3 个点每次窗口滑入一个新值、滑出最旧值输出窗口内排序后的中间值。用一个实际数据对比。假设真实电流稳定在 10.00A第 3 个采样点来了一个 5A 的 EMI 尖峰采样序号 1 2 3 4 5 6 真实值 10.00 10.02 5.00* 10.01 10.03 10.00 ↑ 尖峰中值滤波窗口3的处理过程窗口 [ — — 10.00] → 排序: [10.00] → 中值 10.00 窗口 [ — 10.00 10.02] → 排序: [10.00, 10.02] → 中值 10.00 窗口 [10.00 10.02 5.00*] → 排序: [5.00, 10.00, 10.02] → 中值 10.00 ← 尖峰被吃掉 窗口 [10.02 5.00* 10.01] → 排序: [5.00, 10.01, 10.02] → 中值 10.01 ← 不污染 窗口 [5.00* 10.01 10.03] → 排序: [5.00, 10.01, 10.03] → 中值 10.01 ← 不污染 窗口 [10.01 10.03 10.00] → 排序: [10.00, 10.01, 10.03] → 中值 10.01单个尖峰被彻底消灭前后相邻输出完全不受影响。原理很简单尖峰要么是窗口里的最大值、要么是最小值永远不可能出现在排序后的中间位置——所以永远不会被选为输出。5.3 为什么是窗口3窗口3 刚好能消灭单个尖峰。如果连续两个尖峰紧挨着需要窗口5——但 EMI 尖峰在物理上都是稀疏出现的连续两个采样周期都中招的概率极低。窗口再大只会增加不必要的延迟。在 M0 上实现极为轻量。3 个数的中值本质是一次排序两次比较 一次条件赋值即可完成max(min(a,b), min(max(a,b), c))。无需数组、无需循环、无需乘除、无需浮点。延迟恒定 1 个采样周期约 100ms对 PMM500ms 去抖和 FDR5-10s 确认窗口完全透明。5.4 中值 vs 本项目当前的跳变检测法当前做法跳变双均值中值滤波 (Median 3)尖峰处理⚠️ 漏 1~2 个点邻近点被污染✅ 彻底消灭邻近点不受影响白噪声处理一般一般中值不擅长白噪声延迟50ms100msRAM8B12BM0 运算比较移位仅比较调参阈值 59mA 需经验无参数取 3 就够中值滤波用 100ms 的额外延迟换来了尖峰的彻底消灭——在 BMS 这个场景下是一次完全划算的交换。六、④ 死区归零最后的降噪经过零点校准、增益校准、中值滤波之后零电流时的残余误差约 ±50mA加上 ADC 本底噪声约 ±30mA。对于 BMS 的决策层来说±80mA 是什么概念PMM 模式切换阈值是 ±500mA不会误触发但 SOC 长期积分24 小时 × 80mA 1.92Ah一个月就是 57Ah。对于一个 30Ah 的电池包这个漂移量绝对不能接受所以最后一刀|I| 250mA → 强制归零。250mA 是一个经验数字大于所有噪声源的总和~80mA、小于任何有意义负载60V × 0.25A 15W远小于车辆最小工作功率约 300W不会在骑行中被感知到。250mA 死区配合 500mA 的 PMM 模式切换阈值中间有 250mA 的安全缓冲带确保静止状态下的残余噪声永远不会意外唤醒系统。七、产线和研发的分工研发阶段一次 产线阶段每板 运行时每次上电 ──────────── ──────────── ──────────── 零点偏移 高低温箱标定 不需要 上电自学习 确认片间一致性 Offset₂₅ 温漂补偿 高低温箱 10 板 不需要 查表实时补偿 取中位数制表 Δ(T) 增益校准 确定有效范围 精密恒流源逐板标定 从 EEPROM 加载 800~1200 写入 EEPROM 实时应用 中值滤波 确定窗口大小3 不需要 实时运行 物理特性决定 死区归零 确定归零阈值 不需要 实时运行 250mA研发把需要高低温箱和统计分析的事情一次性做完固化成硬编码表或阈值产线只做必须逐板差异化的增益标定运行时的零点自学习则利用了 BMS 上电瞬间必然零电流的物理条件把芯片个体差异的校准成本降到了零。八、精度预算将各层误差做全温、全量程的精度预算误差源贡献量30A 时类型12-bit ADC 量化噪声±12mA随机零点自学习残差±50mA系统温漂补偿残差±50mA系统PGA 增益不对称残差±100mA系统采样电阻 TCR0.4%/80°C±120mA系统未补偿PGA 增益温漂0.04%/80°C±12mA系统忽略中值滤波残差±30mA随机RSS 合计约 ±180mA相对于 30A 满量程±0.6%这个精度水平对于两轮车换电 BMS 已经足够——SOC 积分的主要误差来源不是电流精度而是电池本身的容量衰减和库仑效率。±0.6% 的全温电流精度意味着 100Ah 吞吐量仅累积约 0.6Ah 的计量误差远小于电池自然衰减的每月 0.5%-1%。九、为什么是这四层、这个顺序电流标定的本质是对四个物理规律的工程回应而顺序本身是数学约束和物理约束的复合PGA 输入失调电压不是零且随温度漂移→ ① 零点校准加性误差先扣偏置值再修正斜率PGA 正负增益不对称且每板不同→ ② 增益校准乘性误差必须在零点修正之后否则零偏会放大斜率误差MOSFET 开关耦合稀疏大振幅尖峰不可平均只能剔除→ ③ 中值滤波信号处理必须在增益修正之后——此时面对的是校准好的物理真实值而非未修正斜率的角度值残余误差会被 SOC 库仑积分无限累积→ ④ 死区归零残余切除必须放在最后——它是最终的噪声门槛判断的是最终物理电流是否足够小到可以忽略顺序不能交换。零点→增益是数学约束加性先于乘性增益→滤波是物理约束滤波阈值应在 mA 域判断滤波→死区是噪声模型约束死区是最后闸门。四层不重复、不冲突、不可重排。本文基于 STM32F072 SH367306 × 2 两轮车换电 BMS 量产代码APP-V02.01.20分析。代码中瞬态滤波的实际顺序和算法与本文所述不完全一致——本文呈现的是经分析的理想推荐方案具体差异请参见代码实现。