电池均衡这件事做备用电源的人不陌生。前阵子我把一套基于 MP2642GR-Z 和 PIC32MX664F064L 的双串电池均衡方案在储能模拟平台上跑通了把两个串联电池单元的压差从 120mV 拉回 10mV 以内全程自动完成不用人工干预。这篇文章就是这次折腾的完整记录适合正在做 BMS、储能 PACK、UPS 备电电路或者准备把均衡逻辑从被动换成主动的开发者。你会看到为什么双串均衡值得做、硬件怎么搭、MCU 里跑什么样的策略以及我踩过的几个坑。1. 为什么双串均衡值得做储能与备用电源里的痛点1.1 串联电池的“木桶效应”到底损失了什么两个电池单元串联之后放电电流和充电电流是完全相同的。表面上看起来只要电池总数相同系统容量就等于每个电池容量的平均值。实际情况完全不是这样串联系统能放出多少电由容量最低的那一节说了算。这就是电池管理里最常见的“木桶效应”一个木桶能装多少水不取决于最高那块板而是最低的那块。我在储能备电场景里专门测过这种现象。取两节同一个批次、标称 3.2V 的磷酸铁锂电芯一节实际容量略高另一节因为自放电差异或者轻微的老化可用容量低 5%。把它们串联成 2S充满到 7.2V 静置之后高容量那节电压会偏高低容量那节电压会偏低。放电时低容量那节更早到达放电截止电压哪怕另一节还有不少剩余能量系统也只能被迫停机。备用电源领域这个问题更麻烦。因为备用电池长期处于浮充状态电流很小温度也不均匀电芯间的一致性会随着时间慢慢恶化。如果没有任何均衡机制最开始 20mV 的压差几个月后可能膨胀到 100mV。等到真正需要备用电力切入的那一刻可能其中一节已经因过放保护直接切断输出。第一次遇到这种场景时我就意识到均衡不是可有可无的附加功能而是串联电池组可靠性的基本保障。1.2 被动均衡 vs 主动均衡我为什么最终选主动被动均衡的思路很直接哪节电压高就给它并联一个电阻让多余的能量以热的形式消耗掉。优点是电路简单、成本低很多入门级 BMS 都在用。缺点也明显——浪费能量发热而且均衡电流一旦设置大了PCB 上会局部聚热设置小了均衡速度又慢得让人着急。主动均衡正好相反它不把能量白白烧掉而是通过功率变换电路把高电压单元的能量转移到低电压单元去。对于 2S 电池组来说最常见的做法就是利用电感和开关管组成一个双向变换器高的一侧先把能量存在电感里再把电感的能量放给低的一侧。这种方案在储能和备用电源场景里尤其划算因为电池本身就是为了储存能量把高电芯的余量“匀”给低电芯相当于把有限的能量留在电池组内部。我这次选的方案核心功率器件是 MP2642GR-Z控制部分交给 PIC32MX664F064L。前者负责能量的双向搬移后者负责判断什么时候搬、往哪个方向搬、搬多大电流。这样一组合既保留了主动均衡的效率又让策略部分足够灵活。1.3 用 MP2642GR-Z 和 PIC32MX664F064L 分工控制MP2642GR-Z 在我这套系统里的定位是“均衡功率前端”。它把大部分功率开关、驱动逻辑和保护功能集成在一起外部我只需要配上功率电感、滤波电容、电流采样电阻就能实现双向能量转移。对这种两节串联的小模块来说这种集成度非常合适比用分立 MOS 管搭 H 桥省了很大面积。PIC32MX664F064L 则负责所有“带脑子”的事情。这颗 MCU 有 12 位 ADC、多路 PWM、UART/CAN 通信接口片内资源足够跑均衡策略和故障处理。我把它用在主控板上采集两节电池电压、NTC 温度、均衡电流然后跑一个滞环状态机输出 PWM 占空比给 MP2642GR-Z。整个系统搭完之后软件和硬件边界很清楚MCU 管逻辑功率芯片管能量流动。2. 硬件搭建细节从功率级到 MCU 采样2.1 MP2642GR-Z 功率级的典型外围我按照手头这颗 MP2642GR-Z 的标准用法来做外围具体引脚定义以手册为准。先说功率回路。两个电池单元的正极分别接到芯片对应的功率输入/输出脚上两颗功率开关管由芯片内部驱动中间串入一颗功率电感。当高侧电池的能量要往低侧转移时芯片先让上方开关导通电流从高侧电池流过电感电感储能随后开关断开电感的续流电流通过下方二极管或同步整流管流向低侧电池完成一次能量搬运。外围元件的选择上我总结了一套比较稳的组合功率电感10µH饱和电流不小于 1.2A。这里不能只看电感量还要看饱和电流。如果压差大时电流超过饱和点电感值会突然下跌均衡电流失去控制发热和噪声都会上来。输入输出滤波电容每个端口至少放两颗 22µF/25V 陶瓷电容并且靠近芯片功率引脚放置。电容的摆放位置比容量更重要我第一版 PCB 把电容放远了 5mm波形上就多了一圈明显的振铃。使能和方向控制脚通过 GPIO 控制每根信号线上加一个 4.7kΩ 下拉电阻防止 MCU 还没初始化完成时电平悬空导致误启动。电流采样电阻使用 10mΩ 合金电阻走差分线到 MCU 的 ADC。采样电阻的精度直接影响均衡电流显示值所以不能用普通贴片电阻凑合。另外要特别注意欠压锁定。两节磷酸铁锂串联在低电量时总电压可能低到 5.0V 左右如果 MP2642GR-Z 的内部功耗需要一定供电电压这时均衡电路可能无法正常工作。我的处理方式是软件里加一道判断总电压低于某个阈值时即使压差再大也禁止均衡先保证系统能正常待机。2.2 PIC32MX664F064L 的采样链路设计电压采样是整个均衡系统的眼睛。PIC32MX664F064L 的 ADC 是 12 位参考电压用 3.3V满量程 4096。电池电压最高会到 3.65V 以上直接接进 ADC 会超量程所以电压信号不能直接怼进去。我最开始的做法是画两个电阻分压把 Cell1 正极和中点的电压都降到 1.8V 以下然后软件里相减。这种方式接线最少但存在一个隐藏问题Cell1 正极电压可能在 3.4V 到 3.65V 之间中点电压在 3.3V 到 3.6V 之间两者差值本身就只有几十毫伏经过分压之后精度损失很厉害。只要采样噪声稍微大一点电压差就会被淹没。后来改成用仪表放大器做差分采样直接采 Cell1 两端和 Cell2 两端的电压差值放大倍数设为 1 倍到 2 倍之间再送进 ADC。这样共模电压再高也不怕测量精度提升明显。实际调下来稳定后的电压分辨率能做到 ±2mV 左右这对均衡判断已经足够。如果不想用仪表放大器也可以用高共模电压的差动运放但外围电阻匹配要精确否则增益误差会变成不可忽略的固定偏差。温度采样用的是 NTC 热敏电阻放在 MP2642GR-Z 功率电感旁边而不是放在电池外壳上。因为均衡时主要热源是电感和 MOS 管测这里的温度更能反映功率级是否过热。电池电芯温度则通过另一路 NTC 单独采集。2.3 PCB 布局与走线决定成败的细节硬件调不通的时候很多问题追根溯源都出在 PCB 布局上。功率回路和高精度采样回路混在一起信号再干净也会被污染。我这次一共改了两版 PCB第二版才算是真正稳下来。第一条铁律是功率电流路径的环路面积要小。MP2642GR-Z 的开关频率不低每开关一次电流就在电感和电容之间往返环路面积越大辐射噪声越强。电感、输出电容、芯片功率引脚必须尽量围成一个紧凑的“圈”不要为了布线好看把回路拉得很长。第二条是采样线单独走。Cell1 正极、中点、Cell2 负极的采样线我从电池连接器那边直接分出来走细线不走大电流路径。采用开尔文接法意思就是采样线和大电流线在电池端才共用一点PCB 上各走各的。这样做的目的是避免大电流在铜箔上产生压降导致 MCU 读到“虚假”的电池电压。第三条是模拟地与功率地单点连接。我在 PCB 上把功率地铺在芯片附近模拟地铺在 MCU 附近中间通过一个 0Ω 电阻单点相连。一开始我用大面积完整地皮结果 PWM 开关噪声通过地平面直接窜进 ADC换了单点接地后采样数据安静了非常多。3. 软件策略从初始化到均衡闭环3.1 上电时序与初始化顺序真的很重要软件最容易出的问题不在算法而在上电时序。MCU 刚上电时GPIO 处于高阻态如果 MP2642GR-Z 的使能引脚正好被板上走线或外部干扰拉高均衡功率级可能在上电的瞬间就启动这时候 MCU 还没开始采样风险很大。我的初始化顺序是固定的先配置时钟和基础外设时钟让系统稳定。初始化 GPIO把 EN 引脚强制输出低电平把 PWM 输出设置成安全状态。初始化 ADC等待参考电压稳定。初始化定时器和 UART/CAN。从 Flash 末尾读取校准参数加载电压补偿和电流上限。最后才打开状态机循环开始均衡判断。我在第一版程序里把均衡使能放在了初始化前面结果上电测试时偶尔会看到一次几十毫秒的异常电流脉冲。后来把使能信号延后问题就消失了。这个顺序问题在文档里不会写但实际开发必须自己注意。3.2 电压采集、滤波与校准的完整思路ADC 采样不能直接采一次就用。开关电源工作之后采样线上会叠加周期性干扰所以我用了“中位值滤波 一阶低通滤波”的组合。具体做法是每 50ms 启动一轮采样对每个通道连续采 20 次排序后取中位值得到中位值之后再做一阶低通公式是 y 0.8 × y_old 0.2 × x_new。一阶低通可以进一步削掉高频抖动又不会让响应慢到无法判断压差变化。校准这一步不能省略。电阻分压有误差仪表放大器有失调PCB 走线也有微量压降。如果没有校准软件里算出来的电压和真实电压之间可能有几十毫伏的偏差均衡阈值设置得再准也是空中楼阁。我的做法是在首次组装时用两台可调电源模拟两节电池的各个电压点从 2.8V 到 3.65V 每隔 0.1V 记录一次 ADC 原始值然后用最小二乘法拟合出每个通道的增益和偏移。得到校准公式之后把增益系数和偏移量存到 PIC32MX664F064L 的 Flash 最后一个页。每次上电时读取如果校验和不对就使用默认系数并上报一次警告。这样既保证了精度也避免了把设备锁死在错误的校准数据里。3.3 滞环控制状态机与均衡保护均衡策略我用了最简单的滞环控制没有上复杂的 SOC 估算。原因是电压差已经足够反映串联失配状态而且 SOC 估算本身就有误差为了一个不精确的量引入更多不确定性没有必要。逻辑如下当 Cell1 电压减去 Cell2 电压大于 50mV 时启动均衡方向为从 Cell1 向 Cell2 转移能量当压差小于 -50mV 时反向动作当压差回落到 ±10mV 以内停止均衡。50mV 和 10mV 之间的区间就是滞环防止均衡在阈值附近反复启停。均衡状态机分为空闲、运行、故障三种主状态。空闲状态下只采样不动作运行状态下判断是否达到停止条件故障状态下强制关闭 PWM并把故障码通过 UART 上报。故障条件包括单体电压超过 3.7V 或低于 2.5V、PCB 温度超过 55°C、均衡电流超过设定上限的 1.2 倍、均衡时间超过 30 分钟。均衡时间上限是我自己加的保护。理论上压差大时可以一直均衡但如果长时间运转压差都没有收敛多半是接线或芯片配置出了问题这时候还让功率级继续工作只会把电池电量慢慢耗光却解决不了任何实际问题。3.4 核心代码与参数落地软件部分的核心判断逻辑我简化成下面这段伪代码风格的程序#define HYST_ON_MV 50 #define HYST_OFF_MV 10 #define BAL_DUTY 6000 // 对应 PWM 周期内 60% 占空比 void balancing_task(void) { // 1. 读取滤波后的电压单位 mV uint16_t v1 read_filtered_cell1_mv(); uint16_t v2 read_filtered_cell2_mv(); // 2. 判断系统允许状态 if (status FAULT) { balancer_stop(); return; } // 3. 计算压差 int16_t delta (int16_t)v1 - (int16_t)v2; if (status BAL_OFF) { if (delta HYST_ON_MV temperature_ok()) { balancer_start(DIR_CELL1_TO_CELL2, BAL_DUTY); status BAL_ON; } else if (delta -HYST_ON_MV temperature_ok()) { balancer_start(DIR_CELL2_TO_CELL1, BAL_DUTY); status BAL_ON; } } else if (status BAL_ON) { if (abs(delta) HYST_OFF_MV || balance_timeout()) { balancer_stop(); status BAL_OFF; } } }balancer_start函数内部做三件事设置 MP2642GR-Z 的方向引脚电平把 PWM 占空比写入对应寄存器把均衡运行时间清零。方向引脚的逻辑电平必须和功率级实际接线对应我在调试时就在这里翻过一次车详见后面的问题排查。参数选择上我这边用的是 10Ah 左右的磷酸铁锂电芯均衡目标电流设为 0.5A大约是 0.05C对电芯来说非常温和。PWM 占空比设为 60%实际均衡电流会因为压差不同在 0.4A 到 0.5A 之间波动。占空比越大均衡电流越大电感峰值电流也越大。如果电芯容量比较小建议把目标电流降到 0.2A 以下避免对电池造成额外压力。4. 实测数据与问题排查实录4.1 一次完整的均衡实测过程实测用的电池组是两节 3.2V 磷酸铁锂电芯串联标称容量 10Ah。我为了制造工况专门用电子负载给其中一节放电让它的电压比另一节低 120mV。初始状态是 Cell1 3.42VCell2 3.30V压差 120mV。启动均衡之后我每 10 分钟记录一次数据时间 minCell1 VCell2 V压差 mV均衡电流 A电感附近温度 °C03.4203.3001200.4830.5103.3983.322760.5034.1203.3813.342390.4936.2303.3683.355130.4737.0453.3593.35180.0033.8到 30 分钟左右压差已经小于 50mV但还大于 10mV所以均衡继续运行。第 45 分钟时压差降到 8mV状态机自动停止。停止之后我没有立刻记录最终电压而是静置了 15 分钟再看压差回弹到 11mV但仍在 15mV 以内。这个回弹是电池极化恢复导致的属正常现象所以判断均衡是否收敛时最好看静置后的电压而不是带均衡电流时的动态电压。4.2 常见问题速查表调试过程中遇到的典型问题我整理成下表。现象可能原因处理办法压差越大均衡越偏方向引脚逻辑接反或采样连线接反核对 MP2642GR-Z 方向定义用可调电源模拟后确认搬移方向均衡电流忽大忽小电感饱和PWM 频率偏低换饱和电流更大的电感适当提高开关频率ADC 数据周期性跳动PWM 开关噪声耦合进采样回路采样时间避开 PWM 开关沿并在采样输入端增加二阶低通滤波均衡启动瞬间 MCU 复位功率回路瞬态导致电源跌落EN 引脚延时打开功率级单独加储能电容温度升高过快电流过大或散热铜皮不足降低目标电流增加散热过孔和铜箔面积上位机收不到调试帧UART 地线虚接或电平不兼容检查共地必要时加 232/CAN 隔离这里最值得说的是“压差越大均衡越偏”。这个问题很有迷惑性因为电压数据看起来是正常的MCU 判断也在工作但实际能量搬移方向反了。后来我用两台可调电源模拟高/低电压单元在上位机里打印方向和电流才发现方向引脚的电平定义和我最初理解的反了。遇到这种情况不要急着改算法先用可控电源验证功率级行为。4.3 踩坑后的几条硬经验有几条经验是我在反复调试中真正花时间才沉淀下来的。第一采样线一定不要走大电流路径。之前我对这个问题不够重视采样点放在了功率回路末端结果均衡电流一上去采样电压就被铜箔压降拖低软件误以为电池电压下降压差判断完全失真。改成从电池端子直接引独立采样线之后才算看到真实电压。第二均衡结束条件一定看静置电压。因为均衡过程中电池内阻上会有极化压降高电芯在放电时电压偏低低电芯在充电时电压偏高动态压差往往会“提前”收敛。如果一看到动态压差小于 10mV 就停止过一会儿极化恢复压差可能又弹回来。我给状态机加了一个“停止后静置 60 秒再确认”的机制效果好了很多。第三用真实电芯调试之前先串一个保险丝或者用限流电源供电。第一次做主动均衡时我为了省事直接接电池上电调试结果一个软件 bug 让功率级持续把一节电芯的能量灌到另一节好在电流不大才没有损坏电芯。后来我每次新板验证都先走一遍“可调电源模拟电池”的流程确认方向正确之后才接真实电芯。5. 扩展到多串储能系统时会遇到的几个边界问题5.1 从两串到多串模块级联与总线隔离双串模块是整个系统的“最小单元”但在实际储能和备用电源系统里电池组通常远不止两串。比如一个 16S 的磷酸铁锂电池包可以拆成 8 个双串模块每个模块各自均衡再通过总线把状态汇报给主控。这种结构看起来简单但有一个很容易被忽略的问题不同模块的地电位不同。如果模块之间用普通 UART 直接相连共模电压可能超过接口承受能力。我的建议是模块之间使用隔离 CAN 或者隔离 UART至少也要保证通信链路没有直接的直流路径。否则调试时正常装上整组电池之后很容易出现某个模块通信偶发失败甚至烧毁接口芯片。多串系统的另一个问题是均衡任务不一定要同时运行。主控可以轮询各个模块的压差优先处理压差最大的模块。这样可以把有限的散热空间留给最需要均衡的模块避免所有均衡模块同时满负荷发热。5.2 均衡电流预算和热管理的估算方法均衡过程虽然比被动均衡发热少但绝不是零损耗。主动均衡的功率级要承担电感损耗、开关损耗和导通损耗在物理上一定会发热。对于系统设计来说需要提前算清楚最大发热量。一个很实用的估算公式是均衡模块发热功率约等于均衡电流乘以模块内电压差。举例来说均衡电流 0.5A压差 120mV发热功率约 60mW几乎可以忽略。如果压差拉到 300mV均衡电流 1A发热功率就是 300mW虽然还是不大但如果有 8 个双串模块同时均衡总发热就是 2.4W在一个密闭腔体里足够让局部温度升高不少。做热管理的时候我会在 PCB 上给功率电感周围多铺铜并均匀打散热过孔。如果外壳空间允许电感下方靠近外壳的位置加一片导热垫效果会非常明显。不要把均衡模块集中在电池包的一个犄角旮旯那样热量很难散出去。5.3 产品化视角下的额外考量从样品走向产品需要补的不只是功能。我这边至少会增加这几件事一是均衡事件的日志记录通过 CAN 上报每次均衡的启动时间、持续时长、转移能量估算值后续可以用这些数据判断电芯是否在持续劣化二是均衡功率级的自检上电后让每个方向的小电流动作一次确认 MOS 管和驱动链路没有被击穿三是异常复位后恢复策略MCU 如果因为看门狗复位必须重新初始化所有均衡使能信号并且保持均衡关闭到电压状态稳定。成本方面主动均衡一定比被动均衡贵但在储能备用电源里这部分成本通常可以通过延长电池组寿命来回收。尤其是长期浮充的场景电芯间不一致性会不断放大如果没有均衡老化速度会明显加快。实际算下来主动均衡的增量成本在整套备电系统里占比很低但换来的可靠性提升是实打实的。最后再分享一个调试阶段的小技巧永远不要用裸电芯去验证均衡方向。先拿两台可调电源串联模拟两个“电池单元”的压差等 MP2642GR-Z 的功率级动作正常之后再换真实电芯。我第一次方向接反的时候就是靠这个方法避免了一次过流故障后来把这条流程直接写进了我的测试规范。双串均衡不是什么玄学把功率电路和控制策略拆开调问题会简单很多。
阅读完成 · 觉得有帮助?