1. 方案背景与整体设计思路
1.1 为什么串联电池必须做均衡
做储能和备用电源的工程师都会遇到同一个问题:电池串的失配。即便出厂时电芯分容配组做得再精细,充放电循环几百次之后,容量衰减、内阻增长、自放电率差异都会逐渐显现。两个或更多串联电池单元,充电时容量小的那节先充满,放电时又是它先放空,整个系统被“短板效应”死死卡住,可用容量白扔了,还可能触发过充过放保护。
标题里这套方案解决的正是这个问题。用一颗专门的双向升降压电池均衡芯片 MP2642GR-Z 做主功率通路,用 STM32L031C6 这颗低功耗 MCU 做均衡判据、闭环控制和系统通信,针对两个串联电池单元做主动均衡。相比传统电阻耗散式被动均衡,主动均衡的核心价值在于“电荷搬运”而非“热量烧掉”,能量利用效率高得多,尤其适合储能和备用电源这种长期在线、对自损耗敏感的场景。
这套方案适合谁来参考?我的建议是:正在做 2S 电池包 BMS 的硬件工程师、想接触主动均衡算法但不想从零搭功率级的嵌入式工程师、以及储能产品方向希望用低预算 MCU 方案落地均衡功能的人。后面我会从硬件原理、均衡策略、软件实现和调试实录四个维度展开,尽量把从芯片原理到代码实现的完整链路讲清楚。
1.2 主动均衡与被动均衡的取舍逻辑
先说被动均衡。原理简单粗暴:检测到某节电压高了,就给这节并联一个放电电阻,把多余能量变成热耗掉。优点是没有复杂功率电路,模拟前端芯片一大堆,便宜又成熟。但短板也很明显:能量被白白浪费,热管理压力大,均衡电流通常只有 50mA 到 200mA,大容量电芯想靠它压差收敛,时间成本极其难看。
再看主动均衡的几种主流实现方式:
- 电容飞渡式:用开关电容阵列把电荷从高电压单元搬到低电压单元,结构简单但电荷转移效率低,均衡速度受限于电容容量。
- 电感式:利用电感储能、续流实现电荷转移,效率高、电流可控,但需要 MOSFET 桥臂和驱动电路,逻辑复杂。
- 变压器/反激式:隔离性最好,适合大量串联的电池串,但体积大、成本高,2S 场景完全用不上。
MP2642GR-Z 属于电感式双向均衡方案,芯片内部已经把 MOSFET 桥臂和驱动集成了。这颗芯片本质是一个同步升降压变换器,外部只需要一颗功率电感和少数电阻电容,就能实现从一个电池单元到另一个的电荷转移。标题选 STM32L031C6 也是有讲究的:M0+ 内核,主频 32MHz 够用;6KB RAM、16KB Flash 在 BMS 这种偏固化代码的场景下刚刚好;L 系列低功耗特性保证了静态功耗极低,备用电源系统长期挂机时不会成为负担。
1.3 系统整体架构与信号流
整个系统的架构可以拆成几个层次看。
功率层:两个串联电池单元的节点 BATT+、BATT-、MID 分别接进 MP2642GR-Z 的端口,芯片内部升降压拓扑配合外部电感,在电池之间搬送电荷。
控制层:STM32L031C6 通过 ADC 采样两节电池的电压,同时从 MP2642GR-Z 读取电流信息,计算均衡方向与目标电流,输出 PWM 驱动信号控制芯片内部桥臂的开关占空比,实现闭环。
通信层:MCU 的串口或 I2C 接口可以外接显示模块、上位机或网关,把均衡状态、电池电压、电流这些遥测数据上报,方便系统集成商做远程运维。
电源层:整个控制板可以独立从电池组取电,也可以通过隔离电源供电。备用电源场景通常还要考虑掉电时控制板自身的超低功耗策略。
信号流一句话总结:ADC 采样电池状态,MCU 做最高决策,PWM 控制均衡功率级,芯片执行电压电流变换,最终结果再反映到电池电压上被 ADC 重新采样。这个闭环就是整套系统的灵魂。
2. 核心硬件细节解析
2.1 MP2642GR-Z 的工作原理
MP2642GR-Z 内部集成了两组 MOSFET 桥臂,外接一颗功率电感后构成四开关升降压拓扑。为什么选四开关升降压?因为两个串联电池单元之间的均衡,高电池对低电池放电时,电压差可正可负、可大可小。比如电池 1 电压 3.6V,电池 2 电压 3.7V,均衡方向是从电池 2 到电池 1,此时相当于降压;反过来如果放电到压差较大时高侧电压 3.9V、低侧电压 3.2V,又可以是降压或者升压模式。四开关拓扑天然支持升压和降压双向工作,灵活应对各种压差场景。
具体到工作状态,有两种典型路径:
路径一(高单元向低单元放电):高电压电池通过内部高侧桥臂、电感、低侧桥臂对低电压电池充电。开关管按 PWM 规律动作,电感储能和续流,实现电压步降传送。
路径二(反向补电):当 MCU 判断需要反向时,对应的桥臂角色互换,原来的低电压电池变成输入侧,通过互补 PWM 驱动,实现反向升压传送。
芯片内部还有电流检测电路。这个很关键,后面会讲闭环控制如何通过电流反馈来决定占空比。外部电流检测电阻两端的电压经过芯片内部放大,输出 IMON 引脚,MCU 的 ADC 读取这个电压就能知道当前均衡电流的实际值。硬件上省了独立运放和采样电路,外围精简不少。
2.2 电流采样与方向判断
对于均衡来说,“知道电流有多大”比“知道电压有多高”更重要。因为均衡的物理本质是电荷转移,电流是电荷量的时间微分。MP2642GR-Z 的 IMON 输出精度在几个毫伏到几十毫伏之间,具体增益由外部电阻设定。不同厂商的应用笔记给的标准接法差别不大,一般 IMON 输出电压与电流的关系是:V_IMON = I_均衡 × R_sense × G_倍率。选采样电阻时要兼顾功耗和精度:电阻太大,重电流时自身压降和发热明显;电阻太小,轻载时 IMON 信号幅度太小,ADC 分辨率不够。
方向判断更简单,本质上由 PWM 驱动的是哪一组桥臂主导来确定。软件里面定义均衡方向为:
- DIR=1:电池 1(高侧)向电池 2(低侧)转移电荷
- DIR=0:电池 2(低侧)向电池 1(高侧)转移电荷
方向由 MCU 的 GPIO 或 PWM 相位关系控制,切换时要注意时序,严禁出现直通。虽然 MP2642GR-Z 内部有保护逻辑,但软件上在切换占空比时还是应当加入“零电流窗口”,等电感电流归零时再切换,避免电感电流突变引起的电压尖峰。
注意:切换方向务必遵循先关断、再等待、后开启的流程。实测中直接反向切换会造成母线电压过冲,严重时会击穿采样电路后级。
2.3 STM32L031C6 最小系统与 ADC 参考设计
STM32L031C6 作为控制核心,外围电路不多,但有几处细节直接影响采集精度和系统稳定性,列成清单如下:
| 项目 | 设计方案 | 补充说明 |
|---|---|---|
| 时钟 | 内部 HSI 16MHz 倍频到 32MHz | 省外部晶振,但有校准需求;工业场景建议加外部晶振 |
| 参考电压 | 使用 VREF+ 接外部高精度基准 | 内部参考电压温度系数约几十 ppm/℃,校验成本高 |
| 电池分压采样 | 用 1% 精度电阻分压,差分配对 | 分压比误差直接影响均压判定阈值 |
| 采样滤波 | 每通道采 16 次取中位值平均 | 抑制 AFC 纹波和开关噪声 |
| 看门狗 | 独立看门狗 1.6s 周期喂狗 | 均衡状态机异常时强制复位恢复 |
具体到实现,ADC 用软件触发单次转换,通道轮询方式。不做 DMA,不是因为不够好,而是这个场景采集频率不高(均衡判断周期通常几十毫秒一次),软件轮询足够,代码更简单可控。分压电阻值选 100kΩ 级别,兼顾采样输入阻抗和自耗电。注意 MCU 内部 ADC 的采样电容需要足够充电时间,采样保持时间建议配置到最大的采样周期,否则采集值会有明显的比例误差,尤其是串联分压电阻动辄几百千欧时这个误差能到十几个毫伏。
对于 L031 的 12 位 ADC,参考电压 3.3V 下分辨率约 0.8mV,配合数据处理后实际均衡判定分辨率大约 2~3mV,足够工程使用。如果还需要更高精度,建议换 16 位外部 ADC,但对均衡应用其实意义不大——电池开路电压在静态下的离散度远比几毫伏大,过分追求测量精度反而是过度设计。
2.4 保护电路与热设计
储能和备用电源系统一大特点是“挂机时间极长”,保护电路不能省。
电池均衡电路在故障时可能发生的情况包括:均衡电流过大、电感饱和、芯片过热、电池过压欠压、方向切换瞬间直通等。MP2642GR-Z 自己带逐周期限流和过温保护,这是第一道防线。第二道防线在软件里,MCU 读取 IMON 电流值,超过设定阈值直接关 PWM,硬去哪都不理。
热设计上,均衡过程中最大的热源是功率电感和芯片内部 MOSFET 的导通损耗与开关损耗。以均衡电流 1A 为例,芯片 Rdson 约几十毫欧,整体损耗约 0.2~0.5W,不算大;但若系统封闭在狭小空间里,热量积累会导致芯片降额,均衡电流下降,收敛时间变长。建议 PCB 布局时给芯片和电感留出足够铺铜散热区域,必要时用过孔阵列导热到底层铜皮。
经验:均衡场景的大电感选型,圈数不用多,但要选低 DCR 的功率电感。DCR 每增加 10mΩ,1A 均衡电流下每节电池多损失 10mV 可用电压,看似不多,但对电池均衡来说就是效率损失。
3. 均衡策略与软件实现
3.1 均衡判据与状态机设计
均衡不是“只要电压有差就均衡”,那样会让系统在压差临界点附近反复开关,MOS 管和电感都吃不消。我的策略设计用了三层判据:
第一层是电压差阈值。两节电池开路电压差大于某个预设值时(比如 20mV),才使能均衡。第二层是滞回窗口。均衡启动后,压差需要降到更低的值(比如 5mV)才停机,这样避免临界抖动。第三层是时间窗口。系统连续处于启动条件超过一定时长(比如 10 秒)才真正打开 PWM,防止电池内部极化电压暂时波动导致的误判。
这套判据落到代码里就是一个典型状态机:
状态:IDLE(空闲) -> CHECK(检测) -> EQ_1_TO_2(均衡1→2) -> EQ_2_TO_1(均衡2→1) -> DONE(完成)- IDLE:系统上电初始化,ADC 预热,进行第一次电压采集。
- CHECK:读取两节电压 V1、V2 和当前温度,计算差值;若温差大于过温保护阈值则进入 FAULT 状态。
- 正常时根据压差方向进入对应均衡状态。
- 均衡中每 100ms 采集一次电压电流,判断当前压差是否已满足退出条件。
- 退出时回到 IDLE,经过一段静置期(让电池极化电压恢复,比如 30 秒)再开启下一次检测。
这个“静置期”很多人会忽略,但恰恰是电压判据的命门。刚均衡完的电芯,端电压还在极化恢复阶段,马上采出来的“低”其实是恢复中的低,这时候直接再触发反向均衡就把电荷白折腾回来。静置 30 秒让电化学状态稳定,再采样判断才是准的。
3.2 均衡电流闭环控制
MCU 输出 PWM 控制 MP2642GR-Z 桥臂通断。开环调节的问题在于:电池电压会随均衡过程逐渐变化,同一占空比下均衡电流也在漂移。如果不想做闭环,简单用固定占空比也能跑,但压差收窄到接近死区时,电流会变得很小甚至反向,效率很低。我的选择是做一个软件 PI 电流环。
具体流程:
- MCU 设置目标均衡电流,比如 500mA。
- 读取 IMON 电压换算实际电流。
- PI 计算得到新的 PWM 占空比,并输出到定时器比较寄存器。
- 限幅,占空比上限 95%,下限 5%,避免极限值损坏功率级。
- 以 10ms 周期执行一次,电流误差收敛后稳态波动控制在 ±5% 以内。
PI 参数整定没有太多玄学。我用了“先比例后积分”的方法:先设 Kp=0.5,Ki=0,观察电流响应是否有振荡;再逐步加 Ki,看稳态超调量是否在允许范围。电池系统是大电容充电对象,电压变化慢,响应天然迟钝,所以 PI 参数不需要激进,否则容易在压差接近死区时出现振荡。均衡控制本身不追求毫秒级快响应,稳定第一位。
关于 PWM 频率选择:MP2642GR-Z 的标称工作频率范围在几百 kHz 到 1MHz 以上。提高频率,电感体积可以缩小,但开关损耗增大;降低频率,开关损耗小,但电感电流纹波大,需要更大的电感。实测均衡场景我倾向选 300kHz~500kHz,电感选 10~22μH,兼顾纹波和效率。如果追求极限效率,可以降频到 200kHz 左右,但要仔细核算电感饱和电流。
3.3 通信协议与系统联动
储能和备用电源系统从来不是单机工作。均衡模块需要把状态上报给系统控制器,接收系统充放电状态信息。我的方案中 MCU 通过串口与系统主控交互,协议用简单的 Modbus-RTU,或者自定义帧结构:
[帧头 0xAA][长度][命令][CRC16]主要报文包括:
- 遥测上行:V1、V2、均衡电流、均衡方向、状态码、温度。
- 控制下行:使能均衡、修改目标压差、修改均衡电流上限、强制停机。
通信周期:均衡状态变化时主动上报一次,平时每 5 秒周期上报保持心跳。系统主控可以根据电池簇总体 SOC 信息,动态调整均衡策略。比如在充电末期,电池电压持续处于高位,此时适合停掉均衡,集中精力监测系统过充风险;在浮充阶段,则在低电流条件下开启均衡,缓慢趋齐。
备用电源场景还需要考虑“失电联动”。系统检测到主电源掉电时,通过 GPIO 通知均衡模块立即停止均衡,把 MCU 切换到低功耗模式,仅保留电压唤醒监测。等主电源恢复后,再从头初始化均衡流程。
3.4 低功耗细节与参数存储
STM32L031C6 的 STOP 模式电流可以做到微安级,这是它被选中的原因之一。但低功耗不只是“进入 STOP”那么简单,CPU 醒了之后要把时钟重新倍频、ADC 重新校准、看门狗重新配置,整个恢复流程需要仔细处理,否则静态功耗数字好看,动态功耗一塌糊涂。
均衡参数建议存 Flash。L031 的 Flash 有烧写寿命限制,均衡参数又不像计数器需要频繁更新,所以把均衡阈值、PI 参数、系统地址这些只读配置存 Flash 是合理的。注意写 Flash 前先备份关键变量到 RAM,掉电安全的考虑,防止写一半断电导致参数丢失。
注意:运行中修改均衡参数要谨慎。除非调试模式,否则不要开放运行时写 Flash 权限。调试时也应当先写一个标志位,重启后再加载,避免 Flash 操作阻塞均衡状态机。
4. 调试实录与问题排查
4.1 压差收敛验证与实测数据
搭完硬件、写完软件,接下来是验证。我用的方法是:用两台可编程电子负载分别给两节电池设置不同的初始荷电状态,人为制造一个 50mV 左右的压差,然后开启均衡,观察压差收敛曲线。
实测效果(参考数据):
| 工况 | 初始压差 | 均衡电流 | 收敛时间 | 最终压差 |
|---|---|---|---|---|
| 2S 磷酸铁锂 | 55mV | 0.8A | 约 10 分钟 | 3mV |
| 2S 三元锂 | 48mV | 0.8A | 约 8 分钟 | 2mV |
| 2S 铅碳(模拟) | 60mV | 1.0A | 约 15 分钟 | 4mV |
注意收敛时间的量级。均衡本质上是“蜗牛搬家”,电流再大也就安培级别,而串联电池的可搬运电荷量却相当可观。几十毫伏压差对应的容量差异可能是几百毫安时,算一下就知道要搬挺久。所以对超低压差的“完美均衡”不要抱有不切实际期望,均衡的目标是让电池组不过早触发保护,从而提升系统可用容量,而不是追求所有电芯绝对相等。
调试中发现 PI 参数设置太激进会导致电流在目标值附近 20% 范围振荡。原因在于电池电压采样本身的噪声和 IMON 信号纹波叠加,导致误差信号有毛刺,PI 输出跟着抖动。解决办法:IMON 信号加一级 RC 低通滤波,截止频率设在几 kHz 量级;软件里 ADC 采集加大滤波深度;PI 输出加“积分限幅”和“死区”,误差小于 5mA 时输出固定不变,实测振荡明显消除。
4.2 常见问题对照表
| 故障现象 | 可能原因 | 排查要点 |
|---|---|---|
| 均衡电流始终为零 | PWM 未使能,或 IMON 量程配置错误 | 先量 PWM 输出是否有波形,再查 IMON 电压是否在量程内 |
| 电流能起来但上不去 | 电感饱和,或目标电流超出芯片能力 | 换更大饱和电流电感,核对芯片手册的持续电流上限 |
| 电压采样跳动大 | 采样时序未避开开关节点毛刺 | ADC 采样点挪到开关死区时间,追加 RC 滤波 |
| 均衡方向来回切换 | 压差判据没有滞回,静置时间不足 | 提高启动压差阈值,跳变时不立即触发重新判断 |
| 芯片温度偏高 | 散热铜皮不足,PWM 频率过高 | 增大散热面积,适当降频换更大电感 |
| 系统掉电后配置丢失 | Flash 写异常或参数未校验 | 增加全参数 CRC 校验,掉电前先备份到备份寄存器 |
4.3 排雷经验总结
最后分享几个实际踩出来的坑。
第一个坑是 ADC 采样偏置。用内部参考电压时,温漂会直接反映在均衡判据上。后来换成了外部基准芯片,并联一个 100nF 去耦电容,采样稳定性好很多。如果为了省成本继续用内部基准,至少要在固件里做温度补偿查表,用 MCU 内部温度传感器测量当前温度后折算。
第二个坑是电感啸叫。均衡电流 1A 以上时,电感在 PWM 频率下的机械振动会产生可闻噪声。解决办法是加“打嗝模式”:当压差接近死区时,不连续开启 PWM,而是按照几百毫秒的周期间歇工作,电流平均下来不大,但电感不再连续激振。另一个办法是把 PWM 频率提高到 20kHz 以上,超出人耳范围,但开关损耗上去了,需要权衡。
第三个坑是压差判定受充放电电流影响。电池在大电流充电时,由于内阻不同,端电压差异会放大,这时候会误判为需要均衡。我加了一个“系统运行状态门控”:只有当系统处于静置、涓流或浮充状态时才允许开启均衡;满负荷充放电时强制关闭均衡。电池内阻造成的端电压差被称为“伪压差”,这是很多新人会忽略的。
给后来者的一句衷告:别把均衡设计复杂化了。把电池安全放在第一位,均衡性能放第二位。均衡算法跑飞了顶多多消耗点能量,电池保护出了问题才是真正的项目事故。
这套 MP2642GR-Z + STM32L031C6 的方案,硬件成本低、外围精简、逻辑完全可控,适合作为 2S 主动均衡的入门级量产方案。若后续要扩展到更多串联节数,可以考虑用多片级联或者升级到对应的多通道管理芯片,核心策略和软件框架不必推翻重来。如果你正在做类似的设计,建议先拿我的调试流程把这颗芯片的底摸透,再开始谈算法优化,会省掉很多弯路。