ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于STM32与MP2642GR-Z的电池主动均衡方案设计与调试实践

基于STM32与MP2642GR-Z的电池主动均衡方案设计与调试实践

做储能和备用电源系统,最不能将就的就是电池均衡。MP2642GR-Z 这种主动均衡芯片配上 STM32F303RC 做采样、判断与控制,能把两个串联电池单元的压差稳稳压到十几毫伏以内。我最近在一套 24V 非标 UPS 样机里试过这个组合,后续又把它移植到一个小型储能模块上,整体稳定性和排查效率都比纯电阻被动均衡方案好太多。这篇笔记把背后的原理、硬件设计、软件策略和调试时踩过的坑完整拆一遍,正好给做 BMS、UPS、ESS 或者想自己组电池均衡系统的朋友参考。

均衡这件事,乍看很简单:电压高了就放一点,电压低了就充一点。可一旦把长时浮充、循环老化、环境温度这些因素叠进来,问题立刻变得复杂。下面先从“为什么要均衡”讲起,再展开 MCU 加均衡芯片这套方案的具体做法。

1. 为什么串联电池越用越不平衡

1.1 单体不一致的来源比想象中多

电池出厂时标称电压、容量、内阻看着差不多,但内部极片厚度、电解液浸润程度、自放电率都存在离散性。出厂的一致性好,并不代表使用一年后还能一致,实际运行中温度梯度会直接拉大差异:靠近发热器件的那节电池温度高,化学反应快,自放电也快;散热差的那节老得更快,内阻升高得更明显。

储能系统里,两节电池串联后流过同一个电流,但每节电池的内部状态完全不同。内阻高一点的那节,在充放电瞬间的端电压压降更大;自放电快一点的那节,静置时的电压掉得更多。这些差异一开始可能只有几毫伏,随着时间累积,会慢慢变成几十甚至上百毫伏。

铅酸电池和锂电池的表现还不一样。铅酸电池在浮充状态下,电压高的一节会持续析气失水,极板硫酸盐化速度加快;锂电池则更敏感,过充到保护电压会触发充电终止,过放又会造成不可逆的容量损伤。无论哪种化学体系,串联不一致都是系统寿命的头号杀手。

1.2 “木桶效应”直接吃掉可用容量

两节电池串联,充电时管理系统以总电压为参考,但真正危险的是单体电压。假设两节磷酸铁锂电池,一节已经充到 3.55V,另一节才 3.35V,总电压 6.9V。如果继续按总压往上充,高的那节会先到 3.65V 甚至更高,保护板只能强制停充,结果低的那节永远充不满。

放电时反过来,容量小或者内阻大的那节先把电压拖到放电截止值,整个系统为了保护它而停止放电,另一节剩下的电量全部浪费。这就好比两个人抬水,走得慢的那个决定了整体速度,走得快的那位再有力气也白搭。

我经常遇到客户反馈“电池组用了半年感觉容量少了一半”,拆开来测单体电压,差 200mV 的情况很常见。系统层面看到的还是正常总压,实际上可用容量已经被严重压缩。均衡的作用,就是把这些被“短板”限制住的容量重新释放出来。

1.3 被动均衡为什么在储能场景不够用

被动均衡是让电压高的单体通过电阻放电,把多余的能量变成热量耗散掉。电路简单、成本低,早期 BMS 基本都用它。但它的短板很明显:均衡电流小,通常只有几十到几百毫安;只能在充电阶段靠近末端时动作;能量全部变成热量,散热设计很头疼。

主动均衡不一样,它用 DC-DC 变换把能量从高电压单体搬到低电压单体,而不是烧掉。均衡电流可以做到 1A 以上,效率高,发热小,而且理论上在充电、放电、静置各个阶段都能工作。对需要长期浮充的备用电源和每天频繁充放电的储能系统来说,主动均衡带来的收益远大于那点硬件成本。

2. 方案拆解:MP2642GR-Z 与 STM32F303RC 各负责什么

2.1 MP2642GR-Z 的核心价值:双向能量搬移

要做主动均衡,芯片必须支持能量在两个电池之间双向流动。MP2642GR-Z 本质上是一个专门用于串联电池均衡的控制器,外部挂上功率电感、功率开关和电流采样电阻,就和两节电池一起构成一个双向升降压变换器。

当第一节电池电压高于第二节时,电路工作在降压模式,从高压侧取电,经过电感给低压侧充电;反过来,如果第二节更高,则切换成升压模式,把能量往第一节搬。整个过程不需要 MCU 去干涉 PWM 细节,芯片自身会处理同步整流和开关逻辑,MCU 只需要控制使能、读取状态、设定电流上限。

按我实际调过的板子,外围器件的选型对均衡效果影响非常大。电感的饱和电流至少要留出 1.5 倍余量,否则大压差均衡时电感饱和,电流波形畸变,均衡效率会明显下降。采样电阻的精度直接决定最大均衡电流的设定误差,最好用工况电阻或者低温漂贴片电阻。MOSFET 的导通电阻尽量选小一点,虽然均衡电流也就一两安,但内阻大了一样发热。

实际项目里我会先根据电池容量定一个目标均衡电流。比如 20Ah 的锂电池组,均衡电流设为 1A 比较合适;如果是 100Ah 的储能电芯,1A 就偏小,至少做到 2A。电流设得越大,外围 MOSFET 和电感的成本、体积都会跟着上去,所以设计之初要先算清楚。

2.2 STM32F303RC 的角色:采集、判定、保护与通信

均衡芯片解决了“怎么转移能量”的问题,但“什么时候转移、转移多少、是否该停止”需要 MCU 来判断。STM32F303RC 在这套系统里承担四个任务。

第一是采集。两节电池的电压通过分压电阻送到 F303 的 ADC,均衡电流通过采样电阻两端压降换算得到,电池和电感的温度用 NTC 采集。F303 内部有运算放大器和比较器,信号调理可以做得非常简洁,外部基本不用额外加运放。

第二是判定。MCU 实时计算两节电池的电压差,和目标阈值比较。压差超过启动阈值就开启均衡,压差收敛到停止阈值就关闭。为了防止在临界点反复抖动,必须加滞回逻辑,这一点后面详细说。

第三是保护。电流异常、温度过高、均衡超时、采样断线,任何一个故障触发都要立刻关闭均衡并上报状态。备用电源系统经常处于无人值守状态,保护逻辑必须可靠到在异常时宁可少均衡也不能出危险。

第四是通信。通过 UART 或者 RS485 和上位机或 BMS 主控交换状态信息,方便远程监控。在一些实际项目里,这部分的调试工作量甚至比均衡算法本身还大。

F303RC 的处理器性能对这个任务来说是冗余的,但冗余不是坏事。留出来的余量可以做更复杂的滤波算法、故障诊断,以后扩展成更多节电池的管理也不至于性能焦虑。

2.3 为什么选这两颗料而不是别的方案

市面上做主动均衡的方案不少,有的是全集成 SoC,内部自带 MOSFET,外围非常少,但均衡电流和灵活性受限。有的用通用 Buck-Boost 控制器自己搭,灵活性高,但环路设计和保护逻辑全部要自己写,调试周期长。MP2642GR-Z 算是一个折中选项,功率部分不用自己从头搭,同时又把电流设定、使能控制这些关键决策留给上层 MCU,适合做自定义策略。

STM32F303RC 选择它,主要是看中内置运放和 ADC 的采样能力。均衡系统对电压精度要求很高,十几毫伏的压差就要有可靠判断,外部如果还要额外加仪表放大器,成本和布板复杂度都会上升。F303 的 12 位 ADC 配合硬件过采样和内部运放,能省掉不少外围,PCB 面积也更紧凑。

3. 硬件设计实操:从原理图到 PCB 的关键细节

3.1 功率回路的选型参考

功率回路是均衡电流实际流过的路径,选型和布局直接决定发热、EMI 和均衡效率。我把几处关键器件的参考参数列出来,这些都是实际调试后觉得比较稳妥的取值起点。

器件推荐参数说明
功率电感10uH ~ 22uH,饱和电流 ≥ 1.5 倍最大均衡电流优先选屏蔽电感,降低对采样线的干扰
功率 MOSFET40V ~ 60V 耐压,Rds(on) ≤ 15mΩ耐压留两倍余量,避免开关尖峰击穿
采样电阻1mΩ ~ 5mΩ,低温漂四端开尔文连接,不能走普通过孔转接
输入输出电容22uF 陶瓷电容并联 0.1uF 高频电容靠近功率开关引脚放置
均衡目标电流1A ~ 2A(视电池容量而定)大电流必须加大散热铜箔面积

电感的选择有个常见误区:只看电感量不看饱和电流。电感在接近饱和时电感量骤降,电流会失去限制,可能导致开关管过流。我第一次做这个方案时选的 10uH 功率电感,样机实测均衡电流只有标称值的一半,后来才发现是电感在 1A 出头就饱和了。换成饱和电流 3A 的屏蔽电感后,电流波形立刻正常。

MOSFET 的栅极驱动能力也要关注,尤其是手里只有 3.3V 逻辑电平的时候。尽量选择低栅极电荷、逻辑电平可驱动的型号,否则 MOSFET 半开半闭,发热会非常明显。

3.2 电压采样和 ADC 调理的坑

电压采样是整个系统的眼睛。ADC 读数不准,后面所有判断都是空中楼阁。我做这套系统时采用的是电阻分压加 ADC 采样的经典结构,但有三处细节非常影响精度。

分压电阻的功耗不能忽视。两节电池如果直接挂固定分压电阻,24V 电压下即使分压网络总阻值上百千欧,也会持续消耗零点几毫安的电流。备用电源系统长期浮充,这点电流看着不大,但整年累计算下来是浪费。解决办法是把分压电阻靠近 MCU 一侧加一个 MOSFET 开关,只在采样瞬间导通,平时完全断开。

采样噪声是另一个大头。功率开关管的开关动作会通过寄生电容和地回路耦合到 ADC 引脚,造成采样值跳跃。我在每个 ADC 通道靠近引脚处加了 100nF 滤波电容,软件里再做中值滤波加均值滤波,终于把抖动压到几个毫伏以内。

布线上还要注意开尔文连接。采样线尽量从电池端子单独引出细线,不要在功率线上就近取电压。功率线上的大电流会在铜箔电阻上产生压降,这个压降会把真实的单体电压淹没掉。所以采样线必须独立走线,而且和功率回路保持距离,避免开关噪声耦合进来。

3.3 保护电路与备用电源场景的额外考虑

硬件保护不能全指望 MCU 程序。功率输入口要加 TVS 管吸收尖峰,输入端串保险丝防止短路事故扩大。如果系统经常接反电池,最好加一个低导通电阻的防反接 MOSFET,比二极管方案压降小得多。

温度和散热设计很容易被低估。均衡工作时的发热主要来自 MOSFET 导通损耗、电感铜损和采样电阻的发热。持续 2A 均衡时,如果板子面积小,局部温度轻松超过 60℃。我习惯在 MOSFET 附近直接覆大面积铜箔,同时把 NTC 贴在电感和 MOSFET 中间的位置,用 MCU 实时监测,温度超过 60℃ 就先停均衡降温。

备用电源的浮充场景还有一个特殊要求:均衡器在非工作状态下功耗必须尽量低。设计时把 MP2642GR-Z 的使能引脚和 MCU 的休眠策略联动,平时 MCU 进入低功耗模式,均衡芯片完全关断,只有周期唤醒的瞬间才进行电压检测和均衡判断。这套机制做下来,整板待机功耗可以控制在微安级别,对备用电源非常友好。

4. 软件与策略:均衡状态机的写法和调参过程

4.1 状态机框架与 ADC 采集逻辑

软件部分我用的还是经典的三状态状态机:IDLE、BALANCING、FAULT。整个系统的核心逻辑很直白,但细节全都藏在“如何防抖”和“如何容错”里面。

typedef enum { IDLE, BALANCING, FAULT } bal_state_t; volatile uint16_t adc_raw[ADC_CH_NUM]; float cell1_v, cell2_v, balance_current, temperature; void bal_tick(void) { float dv = cell1_v - cell2_v; switch (bal_state) { case IDLE: // 压差超过启动阈值,且温度、电流无异常,才打开均衡 if (dv > BAL_START_MV || dv < -BAL_START_MV) { bal_amp_enable(); bal_state = BALANCING; } break; case BALANCING: // 压差收敛到停止阈值,或者触发保护,立即关闭 if (dv < BAL_STOP_MV || over_temp || over_current) { bal_amp_disable(); bal_state = IDLE; } break; case FAULT: // 需要人为清除或者确认故障恢复后才能重新进入 IDLE if (fault_cleared) { bal_state = IDLE; } break; } }

ADC 采集我用 DMA 加循环采样的方式,每个通道连续采 16 个点,软件里去掉最大最小值,再对剩下的值求平均。这些点都是相同工况下采的,中值滤波已经能滤掉大部分尖峰毛刺,均值再平滑一次基本稳定。

有一个细节值得强调:每次采集电压之前,要先把分压网络的采样 MOS 管打开,等几个毫秒让分压电容充分稳定后再启动 ADC。如果一打开就立刻采样,读到的电压会比真实值偏低,均衡启动的阈值判断就不准。

4.2 阈值、滞回与均衡超时保护

均衡阈值的选择要有实际数据支撑,而不是随便拍脑袋。压差启动阈值设得太小,均衡器频繁启停,白白消耗寿命;设得太大,又起不到及时均衡的作用。我通常把启动阈值设在 20mV 到 50mV 之间,停止阈值设在 5mV 到 10mV 之间,中间留出滞回区。

举例说明:启动阈值设 40mV,停止阈值设 10mV。压差从 0 增长到 40mV 以上时才启动均衡,均衡开始后电压差逐渐缩小,直到低于 10mV 才停止。这样中间有 30mV 的滞回窗口,任何短时波动都不至于让均衡器反复通断。实际调试中我发现,如果没有滞回,哪怕滤波做得很好,临界点附近还是会出现百万秒级左右的反复抖动,伴随电感轻微啸叫,听着就很想砸板子。

均衡超时保护同样重要。正常情况下 1A 均衡电流,几百毫伏压差应该在一两个小时内收敛。如果跑了三小时压差都没动,大概率是电池内部微短路、采样异常或者均衡回路断路,继续盲刷均衡已经没有意义。软件的默认超时时间设成两小时,超时就报 Cell_Unbalance 故障并锁定均衡动作。

电流调节方面,MP2642GR-Z 的最大电流由采样电阻决定,但 MCU 还可以通过 PWM 或者 DAC 动态调整电流参考值。压差大的时候全电流均衡,压差接近停止阈值时降低电流,避免冲到目标值以下还硬顶。这种降额策略对防止过冲和减少发热很有帮助。

4.3 故障诊断与调试输出

只做均衡还不够,系统要把自己的状态和数据说出来。我保留了 UART 调试口,每秒打印一次均衡状态、单体电压、温差和均衡电流,现场调参时非常方便。打印出来是这种格式:

state=BALANCING cell1=13.517V cell2=13.482V delta=35mV ibal=1.02A temp=38C

这些日志在项目交付后一样有用。客户反馈“电池电压不对”时,翻日志能立刻看出问题出在采样还是均衡回路。

故障检测方面,除了过温、过流、超时,我还会做一次总压一致性校验:把两节电池的电压相加,再和总线电压读数对比。如果偏差超过 200mV,基本可以断定采样线松动或者接触不良。这个检查在备用电源现场安装后尤其好用,很多问题其实是接线问题,根本不是均衡板问题。

5. 调试实录与常见问题排查

5.1 现场最常遇到的六个问题

调试这套均衡系统的过程中,我整理了一个快速排查表,每个问题基本都踩过。

现象可能原因解决方向
电感发出啸叫均衡器反复启停,或者环路不稳定加大滞回窗口,设置最短开启时间,换屏蔽电感
实际均衡电流远低于设定电感饱和、MOSFET 驱动不足、采样电阻偏大更换饱和电流更大的电感,检查栅极波形,减小采样电阻
ADC 电压跳动超过 10mV采样线靠近功率回路、地平面不干净采样线单独走线,靠近 MCU 引脚加滤波电容
电池电压显示偏高或偏低分压电阻精度不足、接触电阻压降使用高精度电阻,校准采样系数,开尔文接法采样
均衡器反复开启又停止滞回不足,或者采样噪声触发边界扩大滞回区间,增加软件滤波强度
板子局部高温MOSFET 散热铜箔面积不足、持续大电流均衡加大铺铜,减小最大均衡电流,强制风冷

第一个问题其实很有迷惑性。我最初以为啸叫是电感本身质量不好,换了三款电感都没解决,后来示波器一测才发现,是芯片在压差临界点附近反复使能,导致电感电流频繁建立和消失。加滞回、设了 500ms 最短工作时间后,啸叫彻底消失。

5.2 实验室里我推荐的调试顺序

整套系统别一上来就接真电池,那样不方便观察,也容易因为接线错误把板子烧了。我习惯分四步走。

第一步,用两台独立可调电源模拟两节电池。把 MP2642GR-Z 的功率部分单独点亮,手动给它一个使能信号,确认能量真的能从高电压侧搬到低电压侧。示波器挂采样电阻两端,看均衡电流波形是否稳定。

第二步,把 STM32F303RC 的采样和状态机跑起来,但先不实际控制均衡芯片,只对比 ADC 读数和可调电源的设定电压。把精度校准到 ±5mV 以内,再继续下一步。

第三步,让 MCU 的 GPIO 接管均衡芯片使能,用上位机或者串口指令手动开均衡、关均衡,观察电流建立和截止的响应过程。

第四步,才接上真正的电池组,在常温下跑完整的充放循环,观察均衡策略的自动判断和收敛过程。这一步建议用已经出现 100mV 以上压差的旧电池组测试,更能验证均衡效果。

调试设备方面,普通万用表不够用,至少要有一台双通道示波器和一台可编程电子负载。示波器看开关节点波形和栅极驱动波形,电子负载用来模拟放电工况,确认均衡在带载状态下也不会干扰系统供电。

5.3 从两节串联扩展到更多节电池

两节串联只是最小系统,实际储能和备用电源往往有更多电芯。扩展方式有两种思路,各有优劣。

第一种是每一对相邻电池配一个均衡模块。四节电池需要三个模块,六节电池需要五个模块,硬件上线性增加,但软件只需要把多个状态机实例化,各自均衡相邻单元即可。这种做法的优点是均衡电流路径短,效率高,控制策略直观;缺点是器件数量多,板子和成本跟着涨。

第二种是分层均衡。先把四节电池两两做单元内均衡,再用一个模组级的均衡器在模组之间搬移能量。这个思路适合大规模 ESS,均衡电流需求小,器件利用率更高。软件上需要把模组电压均值作为上层均衡的参考,逻辑会复杂一些。

无论扩展到多少节,这套以 MCU 为核心加专用均衡芯片的框架都不用推翻,只需要把采样通道数和均衡器数量扩上去就行。我在实际项目里正是这样做的,第一版两台串联验证算法,第二版直接改成四节串联的模组均衡,软件的迁移成本很低。

最后说一点个人体会。均衡系统最难的不是硬件选型和 MCU 代码本身,而是对“什么时候该均衡,什么时候不该均衡”的判断。过度均衡和从不均衡同样危险。我把所有阈值参数都做成可以在线修改的变量,每次现场调试都带一份参数表,反复试出来的数值才是真正适合这个电池包的数值。任何照搬参考设计的行为,到了真实电池工况下都会露馅。做储能和备用电源,耐心和实测比什么理论都重要。

RELATED READING

延伸阅读

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