在储能和备用电源系统里,串联电池的均衡一直是最让人头大的问题。两节电芯串起来看起来简单,但跑不了几十个循环,压差就出来了。我的做法是用 MP2642GR-Z 这颗专门做电池均衡控制的芯片,搭配 STM32F103RC 这颗老而稳的MCU,在2串电池组上实现了一套主动均衡方案。这套方案我最近刚在模拟的某储能后备电源系统上完整跑通,实测效果比预想中扎实,把设计思路、关键参数、软件策略和踩过的坑一并整理出来,供正在做2串或者小容量电池包管理的朋友参考。
1. 为什么串联电池必须做均衡——应用场景与核心痛点
1.1 三颗电芯带来的大麻烦
很多人觉得电池均衡是大型动力电池包才需要担心的问题,两节电池串联嘛,凑合凑合就完了。但实际在储能系统和备用电源里,恰恰是小串数的电池组最容易出现"一颗电池拖垮一组电池"的情况。
先说根源。两节电芯哪怕出厂时来自同一批次,内阻、容量、自放电率也不可能完全一致,充放电循环之后差异会进一步放大。尤其是备用电源这种长年浮充的场景,电池大部分时间处于静置或低倍率充放状态,电解液活性、负极析锂程度在不同电芯之间会造成差异,这种差异最终都表现为端电压的偏移。
对2串系统来说,问题被放大了。因为总电压是两节电池之和,当其中一节偏高时,另一节必然偏低。充电时高电压那节先到达保护阈值,充电被迫停止,低电压那节永远充不满;放电时低电压那节先报欠压,高电压那节还有不少电量放不出来。长期以往,容量衰减、内阻增大、热失控风险全部跟着来。
我在实际测试中发现一个典型现象:某2串磷酸铁锂系统,静置状态下两节电芯压差最高能到80mV,放电时压差甚至能拉到150mV以上。如果不干预,整个电池组可用容量会折损接近15%,这对储能系统来说几乎是不可接受的。
1.2 被动均衡和主动均衡怎么选
均衡方案大体分两条路线:被动均衡和主动均衡。
被动均衡的原理很简单,把高电压电池多余的能量通过电阻耗散掉,让两节电池电压拉齐。优点是电路极简、成本极低,缺点同样明显——能量白白浪费变成热量,而且均衡电流一般做不大,速度慢,散热压力大。备用电源和储能场景往往放在密闭空间里,热量是头号大忌,所以被动均衡对这个场景不太友好。
主动均衡的核心思路是把能量从高电压电池转移到低电压电池,而不是烧掉。最常用的载体是电感、电容、变压器这几种储能元件。带变压器的方案隔离性能好但体积大,电感方案效率高、体积小、实现灵活,是目前中小型电池包的主流选择,我这套方案用的就是电感型主动均衡。
MP2642GR-Z 在这套系统里的定位非常明确,它管的是"均衡执行":内部检测两节电芯的电压差异,通过控制外部 MOSFET 开关网络和储能电感的充放时序,把电量从高电压的一节搬到低电压的一节。STM32F103RC 管的是"均衡策略":采集电压、判断状态、决定什么时候启动均衡、什么时候停止、什么时候进入保护。
把执行和策略分开是我刻意做的设计。芯片做硬件层面的实时控制,响应速度快,不依赖主控的运算;MCU 做上层调度,灵活调整策略,方便后期通过改固件适配不同电芯类型和使用工况。
2. 整体方案设计——从芯片选型到系统架构
2.1 MP2642GR-Z 在系统中扮演什么角色
MP2642GR-Z 这个型号,从系统集成角度看,它是一颗面向2串电池的主动均衡控制器,配合储能电感和外部开关管,实现相邻电芯间的电荷搬移。在2串系统里,均衡路径很清晰:电池1的过剩能量先转移到储能电感,再由电感转移给电池2,或者反方向操作,这样两节电芯最终被拉到平衡点。
它的好处在于把电压比较、PWM时序生成、电流限制这些底层工作都打包了。我需要关心的只是外围器件的选型、采样网络的滤波和时序配合,以及通过状态引脚和使能引脚跟 MCU 做握手。整体电路做下来,比用运放和比较器搭一套分立方案节省了大量调试时间。
这里要特别强调一点:主动均衡芯片省心,但它不是万能的安全网。它解决的是均衡问题,电池最基本的过充、过放、短路保护仍然需要独立的保护电路或者保护芯片去把关。我在系统设计里保留了独立的过压过流保护链路,均衡模块和保护功能各司其职,不混在一起。
2.2 STM32F103RC 的定位:为什么一颗通用MCU就够用
有人可能觉得 2串电池均衡这么点功能,随便用个小8位单片机就行,为什么非要用 STM32F103RC?
我的理由有三点。第一是 ADC 的精度和速度。STM32F103RC 内置3个12位ADC,采样速率可达1MHz量级,完全能支撑对两节电芯电压的高频采集和滤波。1MHz 听起来夸张,实际我只用到了几 kHz 的采样率,但充裕的裕量意味着滤波器设计和时间窗口配置有更大的回旋空间。
第二是外设资源和灵活性。这片芯片的定时器、GPIO、DMA、串口、I2C 都齐全,均衡控制的状态引脚、使能引脚只是占用几个 GPIO 的事,后续如果要往 SD 卡里存历史数据、用串口输出调试信息、接 BMS 上位机,都不用换主控。
第三是可维护性。F103 系列的市场存量极大,开发工具链、参考代码、社区讨论都非常成熟,对做产品的人来说,"招人好招、出问题好查"本身就是巨大的优势。
2.3 系统架构与核心工作流程
整套系统可以拆成四层来看:
- 电源层:外部供电经过 DCDC 降压后给 MCU 和逻辑电路供电,电池组直接给均衡功率回路供电,和保护板联动实现上下电时序。
- 检测层:MP2642GR-Z 输出和两节电池电压相关的信号,经过 RC 滤波后进入 STM32 的 ADC;同时芯片的故障状态、均衡状态输出作为逻辑信号接到 GPIO。
- 控制层:STM32 负责运行均衡状态机,根据电压差、温度、静置时间等条件判断是否开启均衡,并通过 GPIO 控制 MP2642GR-Z 的使能端。
- 功率执行层:储能电感、开关管、采样电阻组成的双向 DC-DC 转换网络,由 MP2642GR-Z 驱动,完成电荷搬移。
工作流程是这样走的:系统上电后 MCU 进入低功耗待机,周期性唤醒采集一次单体电压;当检测到两节电池的静置电压差超过设定阈值(我默认设在 30mV),并且这个状态稳定持续了10秒以上,MCU 才让 MP2642GR-Z 进入均衡模式;均衡过程中持续监测压差、温度、均衡限流状态;当压差被均衡到小于 10mV 时,关闭使能,进入一段静置观测期,避免刚关电路的电化学极化效应造成误判。
3. 硬件核心细节——电路设计与关键参数计算
3.1 MP2642GR-Z 外围电路搭建
MP2642GR-Z 的外围电路重点是三块:储能电感、MOSFET 开关网络、采样反馈网络。
电感的选择直接影响均衡电流和转换效率。我实测过几种参数,20μH 的电感在均衡电流0.5A的工作点上纹波、损耗都表现比较好。电感选小了,峰值电流会偏高,磁芯容易饱和发热;选大了,均衡电流被限住,搬移速度不够。具体取值跟芯片开关频率强相关,我在不同硬件平台上用信号发生器粗扫过,最后锁定在 20μH ± 20%、额定饱和电流不低于 2A 的规格。
MOSFET 驱动的关键是死区控制和栅极电阻。均衡网络里的两只开关管如果出现上下同时导通的状况,直接就是短路大电流,轻则损坏模块,重则影响电芯。MP2642GR-Z 内部有死区管理,但 PCB 走线寄生电感、栅极驱动寄生电容仍然会造成开关沿过冲,我会在栅极串联 10Ω 的阻尼电阻来抑制振铃。功率回路的走线尽量短而粗,减少杂散电感。
采样网络方面,芯片的电压检测输入脚和电池之间我加了一级 RC 滤波,时间常数取 1ms 左右。这个值的设定需要权衡:太小抑制不了开关噪声,太大会拖慢电压响应的实时性。如果开关纹波问题依然严重,我会把 RC 改成 π 型结构,也就是加一级共模电容,实测对降低差模噪声非常管用。
3.2 采样电路与开尔文连接
采样精度是整个均衡策略的基石。MP2642GR-Z 自己的电压检测送给内部比较器做硬件级控制,STM32F103RC 的 ADC 则独立采集同一对采样点,两边各走各的线。
一个容易犯的错误是采样从功率回路上直接引线。均衡电流在 PCB 铜箔上产生的压降虽然只有几毫伏几十毫伏,但对电池均衡来说已经足以干扰判断。我实际调试时就遇到过这种情况:均衡开启时 MCU 采集到的电压差被 PCB 铜箔压降污染,导致算法误以为均衡失效,反复重启均衡流程。
正确的做法是开尔文连接:从电芯正负极往采样网络的引线单独走线,不在途中串入主功率回路。采样焊点要靠近电芯连接器的根部,不要跟功率线焊在同一个焊盘上。这样采样回路基本没有电流流过,ADC 读到的是真实的开路电压。
3.3 几个关键参数的计算实例
算法的几个核心参数在项目实施前就要算清楚,不能等代码跑起来再回头调。
第一个是均衡电流。不同应用场景下我对均衡电流的期望值不一样。储备电源浮充阶段由于有外部充电电压支撑,均衡电流不需要太大,0.3A 足够用;储能放电场景或者静置均衡时,电流可以提高到 0.5A。均衡电流 I_bal 的决定式可以简化理解为压差 V_diff 除以回路总阻抗——电芯内阻、回路铜箔电阻、功率管导通电阻、电感直流电阻这几项叠加。举例说明:如果压差是 0.3V,回路总阻性损耗折算为 0.6Ω,那么理论均衡电流大约就是 0.5A。
第二是均衡功率与散热。主动均衡虽然不浪费能量,但功率回路里的导通损耗、开关损耗、电感磁损是客观存在的。以 0.5A 均衡电流算,功率管上的导通压降大约为 0.15V,折算热量为 0.075W;电感直流电阻按 50mΩ 估算,热损耗大约 0.0125W。整体不大,但长时间连续均衡时,模块内部积热仍不可忽视。我把模块的持续均衡时间设计成最长30分钟强制停止,让系统冷却后再判断是否需要继续。
第三是采样分压电阻。STM32F103RC 的 ADC 满量程是模拟供电电压,典型值 3.3V。电池组单体电压如果是 3.2V 到 4.2V 的锂电平台,直接接到 ADC 会超量程,必须用电阻分压。上臂电阻 R1 取 100kΩ,下臂电阻 R2 按下式选:
V_adc = V_cell × R2 ÷ (R1 + R2)
想让 4.2V 单体电压映射到约 2.0V 的 ADC 输入,R2 取 91kΩ 左右合适。必须使用 0.1% 精度的温漂低电阻,普通 5% 贴片电阻在校准环节就会让人崩溃。两节电池的采样通道使用了完全相同的阻值搭配,并且每个通道在出厂测试时做两点校准,补偿 ADC 零偏和增益误差。
3.4 布局布线看着不起眼,翻车概率却最高
PCB 布局是我在这套系统里反复改版最多的部分。
第一步是明确功率回路和采样回路的边界。均衡功率路径是:高端电池正极 → 上功率管 → 电感 → 下功率管 → 低端电池正极 → 回到高端电池负极。这条回路的面积要最小化,具体的做法是让功率器件尽量排布在一条直线上,铜箔加大加宽,过孔避开高频回路区域。
第二步是模拟地和功率地分开。MP2642GR-Z 的地脚附近,我先铺一小块模拟地,采样网络、RC 滤波、芯片的参考地都接到这里,再通过零欧电阻单点连接到功率地。MCU 的 ADC 地和模拟地做成星形连接,避免数字噪声串入模拟通道。
第三步是滤波电容就近摆放。MP2642GR-Z 的电源输入脚旁边、MCU 每个供电脚旁边都放了 0.1μF 陶瓷电容加 10μF 电解电容组合。电感和开关管产生的开关噪声如果直接辐射到芯片电源脚,会引起内部比较抖动,均衡的开关时序会变得不稳定。用示波器看电源轨的纹波是调试中很快的一种方式,如果在开关频率附近看到明显尖刺,优先检查的就是这个位置的去耦电容。
4. 软件实现——均衡策略与状态机设计
4.1 电压采集与滤波策略
STM32F103RC 的 12 位 ADC 对这个场景来说精度够用,但裸数据不能直接用。我在采集端做了两层过滤。
第一层是硬件 RC 滤波,在 3.2 节提过,时间常数约 1ms。第二层是软件滤波。我选用了中值滤波加滑动平均的组合:连续采样 7 次,先去掉最大最小值,剩下的 5 个点取平均。这个算法跑在 1kHz 的采样率下,每次净占用时间很短,两节电池各循环一轮,总耗时在微秒级,主循环的实时性完全不受影响。
滤波窗口长度不能太短,否则均衡开关动作引起的纹波会穿透到策略层;也不能太长,否则压差变化被磨平,策略响应迟钝。7 点中值滤波是我在多次实测中比较满意的折中。
ADC 转换我用的是规则通道连续扫描外加 DMA 搬运,CPU 只需要在每次转换完成中断里打标记,主循环从缓存读取结果。这样的好处是 CPU 能腾出更多时间做策略运算和通信。
4.2 均衡策略与迟滞设计
均衡策略的核心是状态机,状态设计必须防抖防振荡。
启动条件定在静置压差稳定大于 30mV 持续 10 秒。为什么要求"稳定持续 10 秒"?因为电池极化会造成虚假压差。刚停止充放电的电池,电压会有一个回弹过程,这个阶段读到的压差不一定真实。等 10 秒,电压曲线趋于平缓,再判断才有意义。
停止条件定在压差低于 10mV。注意这里不是压差低于 30mV 就停,而是有一个明显的回差区间。如果不做回差,均衡器会在 30mV 附近来回切换,状态机反复抖动,不但伤 MOS 管,还容易干扰其他功能模块的工作。
均衡进行中还要持续检查三件事:电芯电压是否越限、模块温度是否过高、单次均衡时长是否超过 30 分钟。任何一个条件触发都立即暂停均衡,进入错误日志状态,并保持关闭状态至少 60 秒再重新评估。
4.3 SOC 估算的实用做法
均衡目标只是压差,但真正决定长期使用效果的其实是荷电状态 SOC 的一致。电压一样不代表电量一样——不同内阻的电芯在同等电流下的极化电压不同,电压均衡完成后 SOC 还可能存在偏差。
我在这个项目里做了轻量的 SOC 估算:以开路电压法作为基准,配合库仑积分做动态修正。静置状态下用 OCV-SOC 曲线查表得到初始 SOC;工作状态下用电流采样做库仑积分,同时记录当前总放电容量和单体电压极值,周期性地用 OCV 修正积分漂移。
储能和备用电源系统的一个好处是可以利用相对固定的静置周期来做 SOC 校正。比如每天晚上进入待机静置,早上系统自检时重新读取开路电压,修正 SOC 估算值。这样做下来两节电芯的 SOC 偏差能控制在 3% 以内,对均衡策略的决策非常有价值。
4.4 状态机与保护逻辑的协同
软件状态机除了均衡状态,还必须把保护逻辑嵌进去。我定义了四个基本状态:空闲态、均衡态、观测态、错误态。
空闲态是默认状态,MCU 以 1Hz 的低频唤醒间隔采集电压,压差不超阈值就一直待在这里,功耗很低。均衡态执行电压搬移,同时不断比对实时电压和温度。观测态是均衡结束后的一段静默窗口,目的是等极化电压消散后再评估是否真的达到平衡,窗口时长我设为 60 秒。错误态记录异常原因,保存到片上 Flash 的日志区,方便事后调试。
保护逻辑分成硬件保护、软件保护两层。硬件保护由外围电路直接动作,响应在毫秒级,切断功率路径或者上报中断;软件保护管的是策略层面的合理性,比如均衡电流异常超限、电压采样连续偏差异常、温度爬升过快这类需要综合判断的问题。两层保护不互相替代,硬件保护做不到智能判断,软件保护做不到纳秒级反应,只有两者协同才能覆盖全场景。
核心代码骨架大致是这样:
typedef enum { BMS_IDLE, BMS_BALANCING, BMS_OBSERVING, BMS_ERROR } bms_state_t; #define VOLT_DIFF_START_MV 30 #define VOLT_DIFF_STOP_MV 10 #define VOLT_DIFF_STEADY_MS 10000 #define BALANCE_MAX_SEC 1800 #define OBSERVE_MS 60000 static bms_state_t state = BMS_IDLE; static uint32_t steady_start_ms = 0; static uint8_t diff_exceeded = 0; void balancing_task(void) { uint16_t v1 = get_cell_voltage(CHANNEL_1); uint16_t v2 = get_cell_voltage(CHANNEL_2); uint16_t diff = (v1 > v2) ? (v1 - v2) : (v2 - v1); uint32_t now_ms = get_tick_ms(); switch (state) { case BMS_IDLE: if (diff > VOLT_DIFF_START_MV) { if (!diff_exceeded) { diff_exceeded = 1; steady_start_ms = now_ms; } else if ((now_ms - steady_start_ms) >= VOLT_DIFF_STEADY_MS) { balance_enable(1); state = BMS_BALANCING; } } else { diff_exceeded = 0; } break; case BMS_BALANCING: if (diff <= VOLT_DIFF_STOP_MV || get_module_temp() > 65) { balance_enable(0); state = BMS_OBSERVING; } else if ((now_ms - balance_start_ms) >= BALANCE_MAX_SEC) { balance_enable(0); log_error(E_BAL_TIME_OUT); state = BMS_ERROR; } break; case BMS_OBSERVING: if (now_ms - observe_start_ms >= OBSERVE_MS) { if (diff > VOLT_DIFF_START_MV) { diff_exceeded = 0; state = BMS_IDLE; } else { state = BMS_IDLE; } } break; case BMS_ERROR: if (now_ms - error_start_ms >= 60000 && diff < VOLT_DIFF_START_MV) { state = BMS_IDLE; } break; } }这段代码比较直白。启动条件做 10 秒持续确认,停止条件带回差,观测窗口防极化误判,错误态自动恢复也做了时间垫底。实际产品里我还会把错误日志读到调试串口上,分析历史数据非常方便。
5. 实测结果与常见问题排查
5.1 一组有代表性的实测数据
我拿某2串磷酸铁锂电池组做了完整验证。初始状态下两节电芯静置压差 78mV,温度 25℃ 左右,采用 0.4A 的目标均衡电流。
均衡启动后,前 5 分钟压差快速下降到 32mV,这是表层极化电压率先被拉平的阶段;接下来的 15 分钟压差缓慢收窄到 12mV;继续均衡到第 22 分钟时压差降到 8mV,低于停止阈值 10mV,状态机自动退出均衡,进入观测态。观测 60 秒后压差稳定在 6mV,没有再反弹。
整个过程中模块温升只有 4.2℃,对储能柜内的温控压力几乎可以忽略。对比我之前用被动均衡方案做的测试,同等级的压差收敛耗时约需 2 小时,而且模块局部温度会升高 15℃ 以上。主动均衡的优势在这个场景下非常直观。
5.2 常见问题速查表
调试过程中我遇到过不少问题,整理成一张速查表方便后来人自查:
| 问题现象 | 可能原因 | 排查思路 |
|---|---|---|
| 均衡开启后压差反而变大 | 采样回路被功率噪声污染,或分压电阻精度不足 | 检查开尔文走线,用示波器看 ADC 引脚纹波,校准通道增益 |
| 均衡电流远小于设计值 | 电感饱和电流不够或 MOS 管驱动不足 | 更换更大饱和电流电感,减小栅极阻尼电阻,测量开关节点波形 |
| 均衡停止后电压明显回弹 | 停止过早,极化电压还未完全消除 | 延长观测窗口时间,或把停止阈值调到更低 |
| 模块表面温度异常高 | 均衡电流超出设计值,或连续均衡时间过长 | 降低电流设定,增补 30 分钟强制停止逻辑 |
| 低温环境下均衡效果变差 | 电芯内阻增大导致回路电流减小 | 按温度修正均衡电流目标,必要时加热策略联动 |
| 状态机频繁切换振荡 | 停止阈值和启动阈值之间的回差太小 | 加大回差,至少保证启动阈值高于停止阈值 15mV 以上 |
5.3 调试经验与一个小技巧
调试均衡模块最麻烦的是判断"当前压差是真实的电池状态,还是电路噪声叠加出来的假象"。我摸索出的一个土办法:关掉均衡后,用高精度万用表直接在电芯连接器两端并联测电压,同时读 MCU 上报的电压值,两者对比。如果 MCU 读数比万用表高出一截,八成是采样回路串入了地噪声;如果读数一致但均衡结果不对,那就要看策略层的时序逻辑了。
另外一个小技巧:软件里加一个把两节电池电压同时刷到调试串口的打印语句,格式用"v1=xxx, v2=xxx"的纯文本。看均衡过程不要只看最终结果,要把压差曲线打印出来。观察曲线形态就能快速分辨是极化主导的快速下降,还是内阻差异导致的缓慢拖尾。这个对调参很有帮助。
6. 项目总结与个人体会
这套 2 串主动均衡模块做下来,我的体会是:均衡芯片的选择决定了系统的效率上限,而 MCU 的策略设计决定了系统在实际工况下的稳健性。MP2642GR-Z 把功率级的脏活累活扛下来了,STM32F103RC 则负责把策略做得有条理、有回差、有保护——两者缺一不可。
给正在做类似项目的同行几个建议:第一,采样精度的高低直接决定均衡策略的成败,分压电阻别省那几毛钱,校准流程别偷懒;第二,均衡启动和停止条件一定要设计回差,否则状态机抖动能把你看晕;第三,主动均衡不是放电均衡策略,能量搬移效率高,但对功率回路的布局要求也高,首次打板建议留足测试点,方便示波器抓波形。
如果后面继续迭代这个模块,我会考虑把均衡策略和上位机连接打通,做到通过通信接口实时配置启动阈值和观测窗口,这样就不用每次改参数都重新烧录固件了。