做储能和备用电源的朋友应该都遇到过串联电池单元压差越拉越大的问题。两块电芯出厂时明明容量一致,跑几十个循环之后,容量、内阻、自放电都会出现差异;在备用电源这种长期浮充场景里,差异还会被持续放大。我这次要聊的方案,是用 MP2642GR-Z 这颗同步降压转换器做功率通道,用 PIC18F55K42 这颗 MCU 做采集、策略和保护,对两个串联电池单元做主动均衡。方案不复杂,但把里面的坑讲清楚,能少走不少弯路。
这套设计最终做出来的效果,是把两节磷酸铁锂单元的静置压差从 38mV 压到了 9mV 以内,均衡电流稳定在 0.5A 左右,整个均衡过程没有触发过压、欠压保护。如果你也在做 2S 电池组的 BMS、储能模组或者后备电源管理,这篇文章应该能给你一个可以直接参考的硬件结构和软件思路。
1. 项目到底在解决什么问题
1.1 串联电池单元为什么必须均衡
先说最基础的问题:两个串联的电池单元,为什么不能直接充放电完事?
因为没有任何两节电池是一模一样的。制造工艺再先进,同一批次的电芯也存在容量偏差、内阻偏差、自放电率偏差。这些出厂时的微小差异,在串联充电时会被同一个充电电流放大:容量偏小的那节电压升得更快,如果以整组电压为截止条件,它可能已经过充;容量偏大的那节还没充满,整组就已经停了。
放电时正好反过来,容量偏小的那节先放到底,如果继续放电,就会过放。铅酸电池也好,磷酸铁锂也好,过充过放都会造成不可逆的容量损失,而损失之后差异会更大,形成恶性循环。
在备用电源场景里还有个特殊情况:电池长时间处于浮充状态。浮充电流本身很小,但两节电池的自放电率只要差一点点,长期累积下来就可能出现“一节电压偏高、一节电压偏低”的失衡状态。浮充电压通常不能靠整组电压判断单体状态,所以必须引入单体级的管理。
很多入门者会想:既然只有两节,那我在充电到后期时人工看着电压,差不多就停。实际上储能和备电系统要求的是长时间无人值守,任何人工干预都不现实,均衡必须自动完成。
1.2 被动均衡和主动均衡怎么选
常规 BMS 里用得最多的是被动均衡:在每节电池旁边并联一个放电电阻,电压高的那节通过电阻把多余能量放掉,直到和低电压那节拉平。
这个方法简单、便宜,但有两个问题。第一,能量被白白浪费成热量,在密闭电池包内热量很难处理;第二,均衡速度很慢,因为电阻通常只有几十欧,均衡电流一般控制在 50mA 到 200mA 之间,想拉平几十毫伏的压差可能要跑十几个小时。
主动均衡的思路正好相反:用 DC-DC 变换器把能量从高电压电池搬给低电压电池,而不是直接放掉。这样做几乎不浪费能量,发热小,均衡电流也可以做得更大。
对于两个串联单元,主动均衡的常见拓扑有电感式、变压器式、电容飞度式。电容飞度式控制复杂,变压器式体积大、成本高,电感式磁芯小、结构简单,最适合这种 2S 小系统。
我最后选的方案是用 MP2642GR-Z 做降压功率级,用 PIC18F55K42 做控制核心。MP2642GR-Z 是一颗同步降压转换器,内部集成了功率管和同步整流管,外围就是电感、电容、电阻,比用分立 MOSFET 搭半桥简单得多。PIC18F55K42 则负责最关键的部分:测准电压、判断方向、控制均衡通道、保护电池。
1.3 整体架构一句话讲清
整套系统可以看成三个层次:
最底层是电池组:两节磷酸铁锂单元串联,中间引出中点,形成 B+、M、B- 三个电气节点。
中间层是功率通道:MP2642GR-Z 从整组电压取电,降压到一个适合给单体电池充电的电压。输出端通过一组 MOSFET 开关矩阵,可以选择把均衡电流灌到上单元,或者灌到下单元。
最上层是控制核心:PIC18F55K42 通过电阻分压网络采样 B+、M、B- 对地电压,算出两节单元各自的电压,再根据压差决定是否打开均衡、均衡哪个单元、何时停止。
这个架构的巧妙之处在于,均衡通道只有一路,但通过开关矩阵复用到两节电池上。成本低、体积小,也不存在两路 DC-DC 互相干扰的问题。
2. 硬件电路设计的关键环节
2.1 MP2642GR-Z 外围电路怎么搭
MP2642GR-Z 在这个项目里负责从整组电压取电,输出一个受控的直流电压。整组磷酸铁锂的电压范围大约是 5.4V 到 7.3V,均衡输出目标设定在 3.6V 左右,这样输入输出之间有足够的压差,Buck 电路可以稳定工作。
输入侧需要一只陶瓷电容,容量按手册推荐值选,通常 10uF 到 22uF。这个电容必须尽量靠近芯片的 VIN 引脚和 PGND,因为输入路径上的寄生电感会在开关瞬间产生尖峰,离得远一点就可能打坏芯片。我调试时遇到过 MP2642GR-Z 偶尔触发过流保护,最后发现是输入电容离芯片太远,开关噪声导致误触发,重新布局后问题消失。
输出侧用电感和输出电容组成 LC 滤波。电感选择主要看两点:额定饱和电流要大于均衡电流的峰值,感值按开关频率和允许纹波来定。我用了 10uH 电感,饱和电流 2A 以上。均衡电流只有 0.5A,所以余量很充足。
反馈电阻决定了输出电压。MP2642GR-Z 按照典型降压电路接法,FB 引脚通过两个电阻分压,把输出电压设定在 3.6V。这里有个细节:输出电压不能设得太高,不能超过单节电池的充电截止电压,否则均衡时间长了会把低电压那节充过压。我选 3.6V,磷酸铁锂充满电压 3.65V,留了一点安全空间。
均衡电流不需要完全依赖 MP2642GR-Z 内部的限流,因为内部限流点通常比较高,而均衡电流我们希望精确控制。更简单的做法是在输出回路串联一个功率电阻,利用输出电压和电池电压的差值限制电流。比如输出 3.6V,电池当前电压 3.2V,串联 0.8 欧姆电阻,初始电流就是 0.5A。随着电池电压上升,电流会自动减小,天然形成恒压减流特性,很适合均衡这种小电流充电场景。
2.2 电池选通开关矩阵的设计
均衡电压只有一路,但需要给上单元和下单元都能充电,所以我在 MP2642GR-Z 输出端和电池节点之间加了一组开关。
输出正极通过两个独立的开关分别连接到 B+ 和 M,输出负极通过另外两个开关分别连接到 M 和 B-。这样就有四种组合,但实际只用两种:给上单元充电时,输出正极接 B+,输出负极接 M;给下单元充电时,输出正极接 M,输出负极接 B-。
开关器件我用了低压 MOSFET。均衡电流不大,选导通电阻几十毫欧的小管子就够,关键在于方向。MOSFET 本身的体二极管在关断时可能形成不期望的电流通路,所以不能直接用单管,要用背靠背接法或者集成式的负载开关。我最后用的是两颗背靠背 N 沟道 MOSFET 组成的双向开关,控制极由 PIC18F55K42 的 GPIO 通过三极管驱动。
开关切换的顺序非常重要。如果在一个开关还导通的情况下导通另一个开关,可能会把 MP2642GR-Z 的输出直接短路到地,或者把两节电池并联起来,瞬间电流非常大。我的控制逻辑是:先关闭 MP2642GR-Z,再把所有开关全部关断,延时 200us 后,再导通目标方向的开关,最后启动 MP2642GR-Z。这个顺序必须写死在软件里,不能省。
2.3 电池电压采样电路怎么做才准
均衡判断的基础是电压测量,测不准一切都白搭。两节串联电池的采样和普通单节电池不一样,因为上单元的负极不在地参考点,它的电压是浮动的,直接用一个 ADC 引脚去测必然出错。
我用了分压电阻加差分运算放大器的方案。每一节电池电压先经过精密电阻分压,把 4V 级别的电压缩到 3.3V ADC 可以接受的范围,然后通过运放构成差分放大,把单端信号转换成以 MCU 地为参考的电压信号。
分压电阻一定要用 1% 精度的低温漂电阻,因为均衡阈值通常只有 20mV 到 50mV,如果采样电阻误差太大,两节电池的测量结果本身就不一致,软件会把正常电池误判成异常电池。我在调试中发现,用普通 5% 电阻时,同样的电池电压,两个采样通道读出来的值差了 60mV,完全没法用。
PIC18F55K42 内置 12 位 ADC,对 3.3V 量程来说,分辨率大约 0.8mV,足够捕捉几十毫伏的压差。我在采样引脚前各加了一阶 RC 滤波,截止频率设在几百赫兹,用来去掉开关电源带来的高频噪声。采样时刻也要注意,不能在 MP2642GR-Z 开关动作的瞬间读 ADC,否则读到的电压会带毛刺。我的做法是:让 MCU 在均衡通道关闭的短暂间隙里采样,或者对采样值做大量软件滤波。
温度采样用 NTC 做,放在两个电池表面。温度数据不参与均衡方向判断,但参与保护:电池温度超过 55 度就停止均衡,低于 -10 度也停止。磷酸铁锂低温充电容易析锂,这个保护必须做。
2.4 PIC18F55K42 的外设分配
PIC18F55K42 在外设配置上,我是个实用主义者:ADC 负责采样三路关键电压和一路 NTC,GPIO 控制开关矩阵和 MP2642GR-Z 的使能脚,一个定时器用来做软件状态机的时基,UART 用来输出调试信息。
我额外用了一个 GPIO 接指示灯。待机时灯灭,均衡时灯慢闪,故障时灯快闪。这个看似多余的指示在调试时帮了大忙,很多时候不用接示波器,看一眼灯的状态就能判断软件卡在哪个状态机里。
MCU 的供电从电池组整组电压经过一颗 LDO 降压到 3.3V。需要注意的是,均衡时电池电压会变化,LDO 输入电压范围要覆盖整组电池的 5.4V 到 7.3V,输出 3.3V 给 MCU 和运放供电。MP2642GR-Z 的使能脚和 MCU 之间最好加一级电平转换或者至少串一个电阻,避免 MCU 复位时未定义电平把均衡通道意外打开。
3. 软件状态机与均衡控制逻辑
3.1 电压采样和滤波的落地实现
软件方面我先把采样做扎实。PIC18F55K42 的 ADC 采集一轮基本电压需要依次切换通道:总电压、上单元电压、下单元电压、NTC。每个通道连续采 8 次,去掉最大值和最小值,剩下 6 次取平均。这样一组数据大约耗时几十毫秒,对均衡控制来说完全够用。
我定义了一个环形缓冲区,每次把原始值放进去,然后对缓冲区的 8 个值排序求中值。中值滤波对去除尖峰干扰非常有效,尤其是电源开关产生的偶发噪声。接着再做一次滑动平均,让电压数据平滑下来。
这里有个经验:不要把滤波后的电压直接用于均衡判断,要区分“静置电压”和“带载电压”。均衡通道启动后,被充电电池的端电压会立刻升高,这是电池内阻引起的极化,不是真实的荷电状态上升。如果拿这个瞬间抬高的电压作为判断依据,系统会误以为电池已经充满,过早停止均衡。所以我的状态机里规定:只有均衡停止超过 2 分钟后的稳定电压才作为均衡启动依据。
3.2 均衡开始和停止的条件怎么定
均衡阈值不能设太死。磷酸铁锂的电压平台很平,小电流下压差 30mV 可能对应的容量差非常小,但大电流波动一下也会造成几十毫伏的端电压变化。如果阈值设 10mV,系统会频繁启停,均衡开关的寿命和电池都会受影响。
我最后设置的启动阈值是 50mV,停止阈值是 20mV,中间还有 30mV 的迟滞区间。也就是说:测得两节单元压差超过 50mV 才启动均衡;启动后,每隔一段时间检查一次,压差降到 20mV 以下才停止。这个迟滞逻辑同时解决了启动瞬间电压跳变导致的反复横跳问题。
均衡方向选择很简单:电压高的那节,说明荷电状态偏高或内阻偏大;电压低的那节,说明需要补充电量。这套方案是给低电压那节充电,通过整组能量搬运过去,间接实现整组平衡。
3.3 主状态机的设计
软件主循环很简单,我把它拆成四个状态:IDLE、BALANCING、PROTECT、DONE。
IDLE 状态每 5 秒做一轮电压采样和判断,如果压差大于 50mV 且温度正常,就进入 BALANCING。BALANCING 状态先把均衡通道切换到目标电池,启动 MP2642GR-Z,然后每 10 秒采集一次电压,检查是否达到停止条件。如果在均衡过程中出现单体过压、温度超限,立即进入 PROTECT 状态关闭均衡通道。PROTECT 状态会锁存故障码,通过 UART 输出,只有人工复位或者故障条件消失一段时间后才恢复。DONE 状态表示本轮均衡完成,之后进入长周期的监控,防止压差再次扩大。
我还加了一个超时保护:单次均衡时间超过 8 小时强制停止。这个是为了防止软件逻辑在某个极端场景下失灵,一直给小电池充电。备用电源系统要求的就是可靠性,任何状态都不能无限循环。
3.4 核心代码片段
状态机的大致骨架是这样的:
typedef enum { IDLE, BALANCING, PROTECT, DONE } bal_state_t; bal_state_t state = IDLE; void main_loop(void) { switch (state) { case IDLE: if (is_balance_needed()) { select_target_cell(); enable_balancer(); state = BALANCING; } break; case BALANCING: if (is_protection_triggered()) { disable_balancer(); state = PROTECT; } else if (is_balance_done()) { disable_balancer(); state = DONE; } else if (balance_runtime > 8 * 3600) { disable_balancer(); state = PROTECT; } break; case PROTECT: if (protection_released()) { state = IDLE; } break; default: state = IDLE; break; } }实际工程里这个主循环还包含看门狗喂狗操作、LED 刷新、通信处理等,但核心逻辑不外乎如此。均衡的“智慧”不在算法本身,而在阈值的标定和异常处理是否完备。
4. 关键参数计算与实测数据
4.1 均衡电流怎么选
均衡电流的选择取决于电池容量、允许温升和均衡时间。我的验证板用的是两节 50Ah 磷酸铁锂单元。按照经验,均衡电流取 0.05C 到 0.1C 比较合理,也就是 2.5A 到 5A。但这个小模组散热条件有限,而且均衡并不是频繁运行的功能,没必要追求太快,我最终把电流限制在 0.5A。
0.5A 对 50Ah 电池来说只有 0.01C,属于很小的电流。均衡速度确实慢,但好处是安全、发热小。如果两节单元的容量差是 1Ah,理论上用 0.5A 补充需要 2 小时。实际因为存在极化、充电效率损耗,通常需要 2.5 到 3 小时。
如果未来需要加快速度,可以把输出回路的限流电阻减小,把均衡电流提高到 1.5A 左右。但电流提高后,MP2642GR-Z 的温度和开关矩阵 MOSFET 的发热会明显增加,需要重新评估散热。
4.2 均衡时间估算示例
我习惯先做一个粗略估算,避免实测时心里没底。
假设两节电池在容量上差了 1Ah,即低电压电池比高电压电池少 1Ah 电量。用 0.5A 充电,理论时间:
T = 1Ah / 0.5A = 2h
考虑磷酸铁锂充电末端电流逐渐减小,实际时间大约在 2.5h 到 3h。如果压差只有 30mV 到 50mV,对应的容量差通常不到 1Ah,均衡时间可能在 1 到 2 小时左右。
这个估算不用很精确,只要数量级对就行。真正要控制的是不能无限均衡,所以我加了 8 小时超时保护。
4.3 实测数据和结果
我用真实的 2S 磷酸铁锂电池组做了一轮验证。电池初始状态一节 3.28V,另一节 3.24V,静置压差 38mV。启动均衡后,每 30 分钟记录一次数据:
| 时间 | 上单元电压 | 下单元电压 | 压差 | 均衡电流 |
|---|---|---|---|---|
| 0min | 3.28V | 3.24V | 38mV | 0.52A |
| 30min | 3.28V | 3.25V | 30mV | 0.45A |
| 60min | 3.27V | 3.26V | 18mV | 0.30A |
| 90min | 3.27V | 3.26V | 12mV | 0.20A |
| 120min | 3.27V | 3.26V | 8mV | 0.12A |
在 90 分钟时压差已经降到 12mV,低于 20mV 停止阈值,但我在软件里加入了“确认机制”,要求连续两次采样压差都低于阈值才停止,所以实际运行到 120 分钟左右才切回 IDLE 状态。
实测结束后的静置压差 8mV,这个精度对于 2S 均衡来说已经足够。如果想继续压到 5mV 以内,需要更长的均衡时间和更精准的采样电路,但意义不大,因为电池本身在充放电循环中也会有几毫伏的波动。
4.4 效率与发热表现
主动均衡的优势在效率上体现得很明显。MP2642GR-Z 作为同步降压转换器,在 0.5A 输出电流下效率推算在 85% 到 90% 之间。输入功率大约 1.8W,输出功率大约 1.6W,损耗只有 0.2W 左右,分摊在芯片和电感上,温升非常小。
作为对比,如果用被动均衡电阻放掉这 1.6W 能量,需要一个至少 2W 的电阻,而且热量完全积在电池包内部。储能设备通常对温升敏感,主动均衡的散热优势很实在。
不过 MP2642GR-Z 的开关频率会直接影响损耗。频率高,电感可以选小一点,但开关损耗增大;频率低,效率高,但输出纹波变大。我按手册典型应用选了 500kHz 左右的频率,在体积和纹波之间取了平衡。实测输出纹波在 20mV 以内,对 3.2V 电池系统来说完全可以接受。
5. 调试中遇到的典型问题和排查方法
5.1 电压采样读数漂移严重
第一版板子刚上电的时候,两节电池电压读出来相差 100mV,但用万用表去量实际只有 20mV。这个问题折腾了我一晚上。
最后定位到三个原因:一是分压电阻精度不够,两个通道的电阻网络不对称;二是采样地线走线不合理,ADC 参考地离电源地的噪声太近;三是采样时刻正好落在 MP2642GR-Z 开关边沿附近,电源噪声直接耦合进了模拟前端。
解决办法是:换 1% 低温漂电阻,模拟地和功率地在 MCU 附近单点连接,采样任务放在均衡通道稳定之后执行。软件里再加中值滤波和滑动平均,问题基本消失。
5.2 均衡一启动就被误判为过压
这个坑很典型。均衡通道刚打开时,MP2642GR-Z 给低电压电池灌入 0.5A 电流,电池端电压瞬间抬升。磷酸铁锂内阻虽然不大,但极化效应足以产生 30mV 到 50mV 的端电压跳变。如果保护阈值和均衡阈值太接近,系统会把这种正常的极化电压当成过压,立即关断均衡。
处理方法是把过压保护阈值抬高到 3.9V,明显高于磷酸铁锂充满电压 3.65V,留足极化空间。同时把均衡停止阈值从 20mV 放宽到 30mV,避免末端电流减小后电压回落造成的反复启停。
5.3 开关矩阵切换时出现瞬时短路
有次调试时,均衡方向从下单元切换到上单元,MP2642GR-Z 直接打嗝,输入电流突然飙升。原因就是切换时序没做好:下单元方向的开关还开着,我就导通了上单元方向的开关,瞬间把两节电池通过 MP2642GR-Z 输出回路短接了一部分。
后来我把切换流程改成严格的四步:关 MP2642GR-Z、断开所有开关、延时 200us、导通目标开关。同时把每个开关的控制信号加上下拉电阻,确保 MCU 复位时开关处于全关状态。这个改动之后,切换过程再也没有出现过电流尖峰。
5.4 MP2642GR-Z 输出导致均衡过充
最后一版调试还发现一个问题:均衡后期,低电压电池电压已经接近 3.5V,但 MP2642GR-Z 的输出仍然固定是 3.6V,所以均衡电流一直没有降到零,时间长了有轻微过充风险。
解决办法是在软件里增加“电压跟随停止”:当检测到被充电电池电压超过 3.55V 时,不管压差是否达到目标,都强制停止均衡。硬件上 3.6V 的固定输出只是提供上限,软件 3.55V 的停止点才是真正起保护作用的。
5.5 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 电压读数来回跳 | 采样电阻精度差、地线噪声 | 换高精度电阻,采样时避开开关动作 |
| 均衡启动后立即停止 | 极化导致端电压抬升 | 抬高过压阈值,加入延时确认 |
| 切换方向时电流尖峰 | MOS 管时序错误 | 先全关再导通,加死区延时 |
| 均衡时间特别长 | 限流电阻偏大、电流太小 | 减小限流电阻,或提高输出电流 |
| 均衡后期电压反超 | 浮充电压设定偏高 | 加入软件截止电压,强制停止 |
6. 写在最后的实在话
这套 MP2642GR-Z 加 PIC18F55K42 的方案,本质上不是一个高深算法项目,而是一个把测量、开关、保护这些基础功夫做扎实的工程实践。硬件上真正难的其实只有两个地方:第一,电压采样要准,所有均衡判断都建立在这之上;第二,开关切换顺序要对,时序错了轻则均衡失败,重则短路打火。软件上最重要的一点是保护冗余,哪怕均衡逻辑写错了,8 小时超时和过压截止也能把系统拉回安全状态。
我做这个验证板时踩得最深的一次,就是盲目追求大均衡电流,把限流电阻改小之后热到不敢摸。后来想明白了,均衡本来就不是一个需要持续快速运行的功能,小电流、长时间、早启动,才是串联电池均衡最可靠的方式。如果你也在做类似的项目,建议第一步先不要纠结拓扑和控制算法多花哨,把采样电路和状态保护做扎实,再往上加功能。等到压差稳定在 10mV 以内的时候,你会发现前面那些折腾都是值得的。