ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

储能备电2S电池主动均衡方案:MP2642GR-Z电荷穿梭与STM32控制实践

储能备电2S电池主动均衡方案:MP2642GR-Z电荷穿梭与STM32控制实践

储能和备用电源设备里,两节电池串联太常见了——小型备电、户外供电、太阳能控制器的电池组基本都是 2S 拓扑。这套配置看着简单,真正让人头疼的恰恰是两节电芯之间的压差。我在某户外备电项目里用两节 100Ah 磷酸铁锂串联,最开始压差也就十几毫伏,循环两百多次之后,浮充记录里能看到 80mV 的电压差。后面把主控换成 STM32F405ZG,均衡部分改用 MP2642GR-Z 这种基于电感的电荷穿梭方案,才把压差真正压住。这篇内容就是这次完整复盘的记录,覆盖了原理、外围电路、控制策略和实测数据,适合正在做小型 BMS、储能备电或移动电源项目的朋友参考。

1. 两节串联也会失衡,而且备电场景最容易中招

1.1 失衡不是电芯质量问题,而是系统性问题

很多工程师觉得,同一批次、同一厂家出品的电芯,串联起来就应该非常一致。这个想法在出厂测试时基本成立,但到了实际工况里很快就会被打破。容量分布、内阻差异、自放电率差异、温度梯度这四件事,是任何电池组都躲不开的物理现实。

以容量为例,标称 100Ah 的电芯,实际容量在 96~104Ah 之间波动是正常现象。两节电芯串联时,SOC 的偏移会直接表现为电压差异。内阻差异带来的影响更隐蔽:同样的充放电电流,内阻大的那节电芯端电压会更高(充电时)或更低(放电时),主控如果用瞬时电压判断 SOC,很容易被误导。自放电率差异则在长期静置的储能系统里被无限放大——一节电芯每天自放电 0.5%,另一节只有 0.2%,一个月就能拉开可观的 SOC 差。

储能和备用电源还有一个非常特殊的工况:长期浮充,偶尔补电,或者在低 SOC 区间浅循环。这种使用模式导致电芯长时间停留在电压平台区,被动均衡完全没有发挥空间。我见过不少同行在这个问题上摔跟头——设备在仓库里放了一个月,再上线时两节电芯压差已经超过 200mV,锂电池组直接进入保护状态。

1.2 被动均衡在备电场景里的三个硬伤

被动均衡的原理很简单:电压高的电芯并联一个电阻,把多余能量以热量形式泄放掉。听着可靠,实际用在储能和备电场景时有很多问题。

第一个硬伤是发热。200mA 的被动均衡电流,单节电芯每天可能泄放 0.5~1Wh 能量,全部变成热量留在密闭机箱里。备电设备往往没有风道,机箱内部温度升高后,电芯老化速度加快,形成恶性循环。

第二个硬伤是能耗方向完全错了。储能系统的意义是节省能源,结果 BMS 自己为了均衡在白白耗电。对于浮充时间占绝对多数的备电系统来说,这部分损耗一年下来相当可观。

第三个硬伤是均衡能力太弱。被动均衡的电流是固定的,压差大时无法加大电流快速收敛,压差小时又会一直维持小电流空转。我做了一组对照测试:两节 100Ah 磷酸铁锂,初始压差 40mV,被动均衡 1A 的电阻网络跑了 6 小时,压差只回落 17mV,电芯表面温升 6.7℃。这种结果在工程上约等于白装。

1.3 主动均衡的本质:能量搬运而不是能量销毁

MP2642GR-Z 这类电荷穿梭方案的核心思路完全不同。它不再需要把高电压电芯的能量烧成热,而是通过电感这个中间载体,把高 SOC 电芯的电荷逐步搬运到低 SOC 电芯。这个过程的本质是一个升降压变换器在电池组内部工作,能量守恒,发热量只有开关和电感损耗。

主动均衡最大的工程优势是可以工作在任意 SOC 区间。磷酸铁锂的平台区很长,两端电压变化不大,被动均衡在平台区几乎无法判断该均衡谁;而主动均衡看的是电荷转移量,即使在平台区也能稳定工作。我后面会说具体的控制逻辑,但这里先记住一点:对于储能和备电系统的浮充工况,主动均衡是唯一真正对症的方案。

2. MP2642GR-Z 的电荷穿梭机制与外围电路设计

2.1 电荷穿梭是怎么实现的

MP2642GR-Z 内部集成了功率开关和控制链路,外部只需要电感加电容,就能在三个电池端口之间构成一个可双向工作的升降压变换器。这三个端口分别接上电池正极、串联中点和下电池负极,工作原理可以想象成一个自动化的搬运工:假设上电池电压高,控制环路就在每个开关周期内从上电池取一小份能量,经电感释放到下电池;方向反过来时,把下电池的能量搬向上电池。

搬运电流不是随意流的,由芯片内部的电流控制环钳制。主控可以根据系统压差大小,决定让芯片工作在哪个电流档位。这里要说清楚:电荷穿梭的效率通常落在 80~92% 区间,比理想 DC-DC 略低,但对比被动均衡把 100% 能量变成热,已经是质的飞跃。

我在实际调试中特别喜欢它的一点是均衡电流非常平稳。被动均衡的电流受电池内阻影响很大,启动瞬间冲击明显;电荷穿梭由于电感和电流环的存在,电流上升缓慢、纹波小,对电池组和采样电路都更友好。

2.2 电感和电容参数怎么定

电感是整个均衡功率级的核心。感值决定纹波电流大小和动态响应速度,饱和电流决定了最大搬运能力。以常见的几百 kHz 开关频率来算,10~22µH 是一个合理起步区间,具体以数据手册的参考电路为准。

我个人的选型逻辑是先确定最大目标搬运电流,再按峰值电流留 1.5 倍以上饱和余量。举例:如果峰值搬运电流按 1.2A 设计,电感饱和电流至少选 2A 以上。屏蔽型贴片功率电感是首选,特别是主控 ADC 采样线和温度采样线就在附近时,漏磁很容易串进模拟信号里造成读数跳动。

电容方面,核心原则是紧贴芯片引脚摆放。功率输入端和输出端各放 10µF 陶瓷电容打底,如果手册推荐更大容量直接按推荐值用。温度等级选 X5R/X7R,耐压按最高电池电压的 1.5~2 倍降额。中点电容的电流纹波很大,ESR 要尽量低,不要随便用大封装高 ESR 的电容。

2.3 PCB 布局和使能控制,两个容易被低估的细节

三段功率回路要短而粗:上电池正极到芯片、芯片到中点、中点回下电池负极。这上面流过的是脉冲电流,回路面积越大,辐射和压降越大。一个好习惯是让功率回路形成一个尽量小的闭环,信号走线不要从闭环中间穿过。

中点采样点也要特别注意,不要在采样走线上直接铺大铜皮连到功率焊盘,否则大电流会在铜皮上产生电压梯度,导致中点电压测量偏差。我一般用一块独立的小铜皮接采样线,再用单点连接到功率路径上。

使能控制的时序比很多人预想的更重要。如果 MP2642GR-Z 在上电时默认就处于可均衡状态,主控初始化之前芯片可能已经在搬运电流,而这时电池采样和保护逻辑还没准备好,场面很容易失控。我的做法是在使能引脚上加阻容延时,或者先让系统主回路处于断开状态,等主控确认电压、温度安全后再释放均衡。具体接口形式可能是状态脚也可能是总线,主控这边对应的初始化逻辑是一样的:先确认芯片在位,再确保电流设定归零,最后才进入工作状态。

3. STM32F405ZG 在均衡系统里的角色分配

3.1 为什么选中 STM32F405ZG

很多人看到标题会问:均衡两节电池用得着 Cortex-M4F @168MHz 吗?我的回答是,用不用得上,要看这个芯片在整个 BMS 里承担了多少工作。MP2642GR-Z 只是功率执行机构,真正的决策大脑是 STM32F405ZG,它要同时处理电芯电压采样、温度采集、充放电通路管理、通信上报、均衡策略执行这些任务。1MB Flash 和 192KB RAM 让 SOC 估算和滤波算法有充足余量,三个 12 位 ADC 可以分时轮询不同信号源,CAN、UART、SPI、I2C 接口齐全,外设资源足够覆盖一个完整的储能监控节点。

低端 MCU 不是不行,但外设数量和 adc 通道数经常不够用,最后还得扩展外部芯片,反而增加复杂度和故障点。STM32F405ZG 属于性能上有明显冗余、但功耗和成本都还能接受的中间档位,在量产型备电产品里是很稳妥的选择。

3.2 采样链路设计:电压不是读一下 ADC 就完事

电芯电压采样的精度直接影响均衡策略的走向。分压电阻我习惯用 1% 精度起步,实际做校准时再按每片板子的基准进行软件标定。ADC 的动态范围要留好,不要把电芯满电压压到采样满量程的极限上,给后期校淮留出裕量。

还有一个关键:均衡功率级工作时,电池端会出现轻微电压波动,如果 ADC 采样速率太快,读出来的瞬时值跳动会非常大。我在每个电压通道上做了连续 10 次采样取滑动平均,效果比单抽一次干净得多。采样时序上也要避开均衡电流换档的时刻,比如刚切换电流档位后等 50~200ms 再开始同步采样。温度探头的位置要覆盖电芯表面和均衡芯片附近,在密闭备电设备里,最主要的发热源常常是电感而不是电芯本身,这个别搞反了。

3.3 保护逻辑与均衡控制必须解耦

我一直强调 BMS 里安全保护逻辑和均衡控制逻辑要分开跑。均衡管理只是一个资源充足的条件下可以执行的功能,而保护逻辑是任何情况下都必须工作的底线。STM32F405ZG 的资源足够同时跑两套任务,我用一个高优先级定时器中断处理过压、欠压、过温、短路这些紧急状态,均衡策略放在主循环里作为普通任务执行。

这样设计的实际好处是:即使均衡逻辑因为异常情况卡死,或者 I2C/状态读取超时,保护中断依然能独立关断充放电通路。均衡功能可以暂时失效,但安全底线不能丢。量产现场遇到问题需要判责时,这样的架构也能快速定位是均衡芯片异常还是保护链路有问题。

4. 均衡策略的落地:窗口、迟滞与状态机实现

4.1 均衡窗口的设定逻辑

很多初学者以为均衡就是压差大于某个值就开启,小于某个值就关闭,实际工程中远没那么简单。均衡动作必须限定在电压窗口、温度窗口和状态窗口之内。以磷酸铁锂 2S 系统为例,我的基础参数是这样定的:

参数设定值设定理由
允许均衡电压窗口单节 3.0~3.55V避开接近充满和严重亏电的区间
压差启动阈值15mV(滑动平均后)太灵敏会频繁启停,损伤芯片和电芯
压差停止阈值5mV留有收敛余地,防止电压回弹再触发
温度窗口0~45℃超出范围时电芯参数不稳定,不适合均衡
单次最长均衡时间120min超时说明系统存在异常,需要报警

这些参数不是固定的,要按实际电池类型调整。三元锂的电压平台和磷酸铁锂完全不同,直接套用这几个值会出问题。电压窗口的意义在于,电芯接近满电时,任何均衡动作都可能干扰过充保护的判断;电芯严重亏电时,均衡电流又会加剧内阻压降,导致主控产生误判。

4.2 迟滞、梯度和冷却时间:避免反复启停

均衡一旦启动,不能指望电压和 SOC 完全同步变化。电池存在极化效应,均衡停止后电压会回弹,如果停止阈值设得太低,系统极容易在启动、停止之间反复横跳。我在参数里专门留了迟滞带:压差超过 15mV 启动,压差低于 5mV 停止,中间这 10mV 就是迟滞区间。

大压差时用大电流快速拉回,压差缩小时降到小电流缓慢收敛。这个梯度控制在实际测试里非常有效:初始 80mV 压差用 500mA 搬运,达到 15mV 后切到 150mA,最后阶段电流降到 50mA 左右,停止时电压回弹幅度明显减小。停止之后还要加一个冷却等待时间,我设置为 15 分钟——这期间即使压差再次超过启动阈值也不会立刻启动,避免浮充状态下几十次启停的尴尬。

4.3 主控状态机的实现思路

下面的伪代码展示了均衡控制的主干逻辑。实际工程代码里要实现可重入的任务函数,不能在均衡循环里做长延时,否则会阻塞其他任务:

typedef enum { BAL_IDLE, BAL_WAIT, BAL_RUNNING, BAL_COOLDOWN, BAL_FAULT } bal_state_t; void bal_task_periodic(void) { switch (bal_state) { case BAL_IDLE: if (voltage_in_window && temp_in_window) { if (dv_avg > START_THRESHOLD) { set_bal_current(0); wait_timer_start(); bal_state = BAL_WAIT; } } break; case BAL_WAIT: if (wait_timer_expired(30s)) { if (dv_avg > START_THRESHOLD) { enable_balancer(1); set_bal_current(800mA); run_timer_start(120min); bal_state = BAL_RUNNING; } else { bal_state = BAL_IDLE; } } break; case BAL_RUNNING: if (dv_avg > 30mV) set_bal_current(800mA); else if (dv_avg > 10mV) set_bal_current(300mA); else set_bal_current(100mA); if (dv_avg < STOP_THRESHOLD) { enable_balancer(0); cooldown_timer_start(15min); bal_state = BAL_COOLDOWN; } if (run_timer_expired() || fault_detected()) { bal_state = BAL_FAULT; } break; case BAL_COOLDOWN: if (cooldown_timer_expired()) bal_state = BAL_IDLE; break; case BAL_FAULT: disable_balancer(); report_fault(BAL_FAULT_SRC); // 等待主控复位或人工干预 break; } }

这段逻辑里最有价值的是 WAIT 态和 COOLDOWN 态。WAIT 态用 30 秒确认时间过滤瞬态干扰;COOLDOWN 态防止周期性回弹导致的反复启停。这两点在实际调试中帮了大忙,很多工程师都会忽略。

4.4 与 MP2642GR-Z 的交互时序

STM32F405ZG 和 MP2642GR-Z 的交互,我建议遵循一套固定的时序习惯。初始上电时,先确认芯片处于待机状态,再读取状态信息确认没有异常,然后才开始采样和策略判断。启动均衡时,应该先设置电流限值,再发出运行指令,不要反过来。停止均衡时,先把电流限值降到零,等几个周期确认功率路径安全关断,再做系统级的充放电切换。

这里要特别提醒一个坑:均衡停止后立刻进行大功率放电,电芯电压会有明显的阶跃变化,主控如果还在执行上一次均衡的滤波数据,很容易误判。我的做法是均衡停止后先把采样滤波缓存清零,强制重新积累样本,至少等 10 组有效数据后再更新压差判断。

5. 实测数据与三个真实的踩坑记录

5.1 对照组测试结果

测试用的电池组是两节 100Ah 磷酸铁锂,初始压差故意调整到 80mV,环境温度 25℃,静置状态。主动均衡这边搬运电流设定 500mA,停止阈值 5mV;被动均衡那边用 200mA 泄放电阻。结果很有说服力:

指标MP2642 主动均衡电阻被动均衡
初始压差80mV80mV
运行 1 小时后的压差10mV63mV
达到 10mV 压差用时约 40min未达到
电芯表面温升3℃8℃
能量去向转移至低电芯大部分以热耗散

这组数据说明的问题很直接:主动均衡在收敛速度、发热量、能量利用三个维度全面占优。备电系统的浮充场景中还有一组长期观察数据:连续 72 小时浮充,启用主动均衡后压差始终维持在 6~12mV 之间波动,主控启停均衡的次数从之前被动方案的每天数十次降到了个位数。

5.2 踩坑一:均衡大电流时控制总线的周期性干扰

第一次联调时发现一个奇怪现象:搬运电流超过 300mA 后,主控和 MP2642GR-Z 之间的总线通信会间歇性出错,重试之后又能恢复。先怀疑电平匹配问题,示波器量波形发现边沿确实有振铃,于是把上拉电阻从 4.7k 换成 2.2k,改善了一点但没根治。

真正定位到根因是走了弯路之后的。用近场探头扫了一圈,发现功率回路的中点在芯片底下绕了个圈,刚好从总线走线下方穿过,高 di/dt 的脉冲电流在走线区域产生了强磁场耦合。把功率回路移到另一层,总线走线远离功率闭环区域,问题基本消失。后续又在总线上加了 RC 滤波,彻底稳住了。

这个案例给我的教训是:均衡系统里,功率路径的布局优先级应该高于信号走线的便利性。先让功率回路最短最完整,信号线围绕它做绕行,而不是相反。

5.3 踩坑二:均衡启动瞬间电压骤降导致欠压误告警

某次测试把搬运电流直接设到 1A,一启动,主控立刻报了欠压故障。回看录波数据,电池端电压在均衡启动的瞬间出现了一个约 200ms 的 50mV 跌落。原因不复杂:均衡电流在电池内阻上产生了欧姆压降,电芯内阻越大,这个跌落越明显。

解决方式分三步走。第一,均衡电流分档启动,从 200mA 开始,运行 5 秒后升到 500mA,再运行 5 秒后到目标值,避免一次性大电流冲击。第二,欠压保护判定增加滑动平均和 500ms 延时,让保护逻辑不会被瞬时跌落误触发。第三,均衡启动时主动把欠压判定阈值放宽 20mV,并在日志里记录这次放宽事件,方便事后追溯。

这套组合下来再没有出现过误告警。对比之下,如果只做其中任何一项,要么保护太迟钝,要么依然误报。

5.4 踩坑三:浮充工况下的均衡振荡

第三个问题出在长期浮充的现场站点。某备电设备上线运行一周后,后台统计显示均衡启停次数高得离谱,一天能有两三百次。查看趋势图发现压差始终在 6~12mV 之间波动,刚好横跨停止阈值 5mV 附近。

原因是停止阈值定得太低,浮充状态下电压本来就有微小波动;均衡停止后电压回弹,压差重新越过启动阈值,于是又触发启动。修复办法是调整迟滞带:启动阈值提到 20mV,停止阈值提到 10mV,同时把停止后的冷却时间设为 15 分钟。调整后压差一直稳定在 8~15mV 区间,系统只在压差真实扩大时才介入,启停频率从每天两三百次降到三到五次。

5.5 量产前的几件小事

  • 分压电阻标定不能省。1% 电阻的离散度足够让压差判断偏移 20mV,每片板子出厂前做一次 ADC 校准,记录修正系数。
  • 均衡芯片的供电和去偶电容必须贴芯片引脚放,100nF 加 10µF 的组合基本够,别为了布线方便把去偶电容放远。
  • 代码里加均衡历史计数,每次启动、每次异常退出都写到非易失区域,售后可以根据日志判断电芯是否老化,也能回查均衡逻辑是否被异常打断。
  • 准备做整机认证的备电产品,均衡电感是主要干扰源之一,预留 π 型滤波位置,效果比后期强行加磁环好得多。

这些都是在实际项目中一点一点磨出来的经验。均衡这件事,芯片选对只是第一步,外围布局、主控逻辑、参数配合,每一层都踩过坑才知道边界在哪里。希望这篇复盘能让后来者少走一段弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进