两串电池均衡这个题目,我盯了很久。做储能和备用电源的朋友应该都有同感:电芯数量只要超过一节,串联一致性就是个绕不开的坎。两串听起来简单,实际做下来,该踩的坑一个不少——静置压差能从几十毫伏慢慢爬到上百毫伏,充电保护频繁被高电压那节触发,整组可用容量被最差的一节死死锁住。
这个项目就是用PIC18F57K42做主控,配合MP2642GR-Z搭主动均衡功率级,在两个串联的电池单元之间做能量搬运,目标是让压差收敛到10mV以内。整套东西用在小型储能和备用电源系统里,实测均衡电流最高到1.5A,一次完整的压差修正大概几十分钟。这篇文章我把方案选型思路、硬件电路要点、软件逻辑和调试实录完整过一遍,正在做BMS、或者想给自家备用电源加均衡功能的工程师,应该能直接拿去用。
1. 方案选型:为什么是主动均衡,而不是传统耗能式
1.1 被动均衡的先天短板
很多人一开始会想:两串而已,直接上被动均衡不就行了——高电压那节接个功率电阻放电,压差降下来就完事。表面看确实省钱省事,但在储能和备用电源这个场景里,被动均衡有几个很现实的问题。
首先是能量浪费。备电系统讲究的是待机时间长、应急时电量足,被动均衡把高电量的电芯能量直接变成电阻上的热,这等于把宝贵的备电容量白白烧掉。打个比方,备用电源在断电瞬间要顶住的负载是固定的,你均衡时烧掉100mAh,关键时刻可能就少顶几分钟。
其次是发热和温差。均衡电阻哪怕只走0.5A电流,功耗也有接近1瓦,贴在电池仓里会让电芯局部升温。而锂电池的电压和容量特性对温度很敏感,局部温差会反过来加剧电芯不一致,形成恶性循环。我在之前一个小项目里试过被动均衡,均衡到后半段,高电压电芯比低电压电芯表面温度高了三度多,压差反而迟迟收不动。
最后是均衡速度。被动均衡的放电电流受限于电阻功耗,通常做到0.2A到0.5A就不敢往上加了,要处理几百毫伏的压差得跑好几个小时。备用电源的维护窗口往往很短,你不可能让运维人员等半天。
1.2 主动均衡的定位:能量搬移,不是能量消耗
主动均衡的思路完全反过来:不是把多出来的电烧掉,而是把能量从高电压电芯搬到低电压电芯。这样高电芯降一点,低电芯升一点,总能量不变,系统整体电量利用率和均衡速度都上来了。
实现主动均衡的功率拓扑有好几种,常见的有开关电容式、双向反激式、以及基于升降压变换器的电感式。这个项目里用MP2642GR-Z搭的是双向升降压式的单电感结构:MP2642GR-Z本身是一颗高性能的同步开关电源控制器,工作频率可以设置到几百千赫,内部集成驱动和同步整流相关功能,外部配上开关管、电感和采样电阻,就能构成一个双向可控的能量转移通道。
为什么选它而不是直接买一颗带均衡功能的电池保护AFE芯片?两个原因。第一是两串这个规格很尴尬,市面上很多AFE芯片最低支持3串起跳,两串专用的选择反而不多。第二是独立的电源控制器加通用MCU方案灵活性高很多——均衡电流可以调、均衡策略可以自己写死、还能和系统里的充电管理、告警逻辑灵活联动。对于储能和备用电源这类对策略定制要求高的场景,这种自由度很有价值。
1.3 "MCU + 专用控制器"的架构优势
用PIC18F57K42做主控,搭MP2642GR-Z做功率级,这套架构的边界很干净:MCU管采样、管逻辑、管保护和通信,功率级管能量搬移。比起把所有功能塞进一颗SoC,这种拆分让每一部分都能做到极致。
PIC18F57K42在8位MCU里算资源比较充裕的:12位ADC满足电池电压采样精度需求,内置DMA可以连续采集多通道电压而不用占着CPU,还有可配置逻辑单元和多个PWM输出,用来做均衡控制和保护联动很方便。更关键的是它的引脚耐压和5V逻辑电平,在电池供电系统里和模拟前端直接对接比较从容,不用额外加一堆电平转换。
做系统设计时我给自己定了三条原则:均衡动作必须可关断、可限流、可与保护逻辑联动。这套架构天然满足前两条,第三条需要在软件里明确设计进状态机,后面会细说。
2. 硬件设计:采样、功率级与供电的关键细节
2.1 系统模块划分
硬件上我把它分成四个模块:电池采样模块、均衡功率级模块、主控与保护模块、系统供电模块。
采样模块负责两节电芯的电压测量,同时兼顾温度采集(至少一个NTC,最好两个)。均衡功率级模块就是MP2642GR-Z为核心的那一小块电路,负责在两个电芯之间搬移能量。主控模块以PIC18F57K42为中心,负责ADC采样、均衡方向判定、PWM控制和异常保护。系统供电模块则从整组电池取电,降压后给MCU和控制电路供电。
这里有个重要设计决策:整个系统的地参考点。电池串联组里有两个天然可用的参考点——组负极和电芯中点。我选择把系统参考地放在整组电池负极,也就是两串的总负极,这样MCU的参考地和外部通信、调试设备的地是同一个,省去很多浮地测量带来的麻烦。
2.2 采样回路:两串电压怎么测才准
两串电池的电压采集有一个容易翻车的点:第一节电芯(位置靠下的那节)直接对系统地,采集很容易;第二节电芯(位置靠上的那节)的对地电压是两节电压之和,你要的是它的单独电压,必须做差计算。
我在采样电路上用了高阻分压加电压跟随器的结构。每节电芯的正极先经过一个100k级别的分压电阻网络,把电压降到ADC输入范围以内,再接一级跟随器缓冲。分压电阻的选择要仔细看两点:一是阻值不能太小,否则长期挂在电池上会形成额外的漏电流,待机时把电池耗空;二是精度和温漂要够,分压比一旦漂移,软件里再校准也救不回来。
为了省PCB面积,第一版我偷懒用了0603封装的高阻值电阻,结果发现采样值在温度变化时有小幅度漂移。后来换成0805封装、精度1%的电阻,这个问题就消失了。高阻值回路对PCB漏电流和助焊剂残留非常敏感,清洗不干净的话,潮湿环境下采样会莫名其妙偏高。这个坑后面调试部分还会再提。
ADC参考电压用的是PIC18F57K42内部参考,配合软件校准来消除增益误差。实际测下来,经过两路独立校准后,两节电芯电压的读数偏差能控制在±3mV以内,这个精度对均衡判断足够了。
2.3 均衡功率级:MP2642GR-Z的外围电路怎么搭
MP2642GR-Z这部分的电路设计,我的做法是把它当作一个可控的双向升降压变换器来用。电芯中点挂在变换器的一端,整组电池的正负端分别作为能量来源和去向。
具体到外围元器件,最核心的是电感、功率开关管(如果芯片没集成)、电流采样电阻和输入输出电容。电感值的选择要兼顾电流纹波和效率,我的经验值是选感值能保证在最大均衡电流下电流纹波不超过30%左右即可。电流采样电阻放在主功率回路里,它的阻值决定了均衡电流的检测精度,我用了10mΩ级别的合金电阻,在1.5A电流下产生15mV压降,足够让控制环路稳定工作。
这里必须强调一点:功率回路的走线和布局比元器件选型重要得多。MP2642GR-Z这类高频开关控制器,开关节点的寄生电感会导致振铃和EMI问题。我把功率回路尽量收紧,开关节点的铜皮面积在不影响散热的条件下做小,电流采样电阻采用开尔文接法,也就是采样走线直接连到电阻两端而不是从大电流走线上引,这样可以避免地线压降污染ADC读数。
关于MOSFET的选择,要注意两个参数:栅极电荷要小,不然驱动可能不够;导通电阻要低,不然大均衡电流下发热严重。我实际选的是导通电阻在10mΩ以内、采用逻辑电平驱动的型号,这样MP2642GR-Z的驱动可以直接推动,不必再加一级驱动电路。
2.4 供电设计:不能给电池留下漏电通道
主控和均衡控制电路通电后要一直待机,所以系统供电的低功耗设计很关键。我用了从整组电池取电的降压方案,静态功耗控制在几十微安级别,在备用电源这个场景下完全可以接受。
供电设计有一个容易忽视的点:断电或异常时,供电电路的输入电容会通过分压电阻或者防反二极管向电池反向漏电。这个漏电虽然很小,但在长期存放的备用电源里可能会造成电池过放。解决方法是加一颗低漏电流的防反MOS管,或者选择带关断控制的降压芯片,在系统休眠时彻底切断从电池取电的路径。
PIC18F57K42的复位引脚要加上拉电阻和滤波电容,避免均衡开关瞬间的电磁干扰引起MCU误复位。这个我在调试时遇到过,后面会细说。
3. 软件逻辑:均衡不是简单的电压比较
3.1 均衡的时机:静置窗口判定
均衡最忌讳的是在充电或放电过程中盲目动作。充电时电池电压和SOC之间的关系不稳定,极化电压会让电压读数失真,这时强行均衡反而会把本来均衡好的电芯搞乱。所以软件里第一步是判断系统处于静置状态。
我的判定条件是:整组电流小于某一阈值(比如50mA)持续超过30秒,同时没有充电和放电的使能信号,温度在10度到45度之间。满足这些条件后,系统进入允许均衡的状态。这个判定单独做了一个函数,每次主循环都跑一遍,状态变化时记录下来方便调试。为了可靠,我用了两个不同量程的电流检测通路,低量程通道专门负责静置判定,避免大电流传感器在小电流时的零漂影响判断。
3.2 压差判定与迟滞逻辑
压差判定看起来简单——两节电芯电压相减,超过阈值就均衡。但实际操作里必须加迟滞,否则会发生在阈值附近来回抖动的情况:均衡启动后,高电压电芯电压下降,一旦压差刚低于启动阈值就关闭均衡,随后电芯极化电压反弹,压差又升上来,系统就在开启和关闭之间反复横跳。
我的做法是设置两个阈值:启动阈值为20mV,停止阈值为10mV。也就是说,只有在压差超过20mV时才启动均衡,一旦开始均衡,就一直运行到压差低于10mV才停止。这个5mV的迟滞窗口看起来不大,实际上足以避免那种反复启停的抖动。
另外,方向判定不要只依赖一次采样。我做了连续8次采样的滑动平均,每次采样间隔100ms,全部采样完成后再做方向判定。这样做的好处是可以滤掉电芯电压的瞬时波动,尤其是均衡刚启动时,电芯内阻上压降会引起1%量级的电压跳变,如果不滤波,方向判断很容易反掉。
3.3 均衡强度控制:从满速到精准收敛
均衡不是永远跑满最大电流。启动时如果压差很大(比如大于100mV),用最大电流快速搬移能量;当压差接近停止阈值时,如果还跑最大电流,很容易因为过冲把另一节电芯抬过头。
我在软件里做了三档均衡强度:压差大于100mV时跑100%占空比(最大电流档),压差在50到100mV之间时降到50%占空比,压差小于50mV时降到25%占空比。实际测试下来,这个策略让均衡全程的收敛速度都快,而且末段不会出现明显过冲。
如果需要更精细的控制,PIC18F57K42的PWM模块可以直接输出可调开关信号给MP2642GR-Z的使能端,通过控制有效占空比来调节平均均衡电流。我第一版用的是使能开闭方式,也就是使能一段时间、关断一段时间,简单但效率和纹波不如PWM方式。后来改成直接用PWM控制,效果好了不少。
// 均衡控制主逻辑(简化示意) if (system_state == IDLE) { uint16_t diff = get_voltage_filtered(CH_BAT1) - get_voltage_filtered(CH_BAT2); if (diff > START_THRESHOLD) { // BAT1偏高,能量从BAT1搬向BAT2 balance_set_direction(DIR_BAT1_TO_BAT2); balance_set_pwm(get_duty_by_diff(diff)); balance_enable(true); } else if (diff < -START_THRESHOLD) { balance_set_direction(DIR_BAT2_TO_BAT1); balance_set_pwm(get_duty_by_diff(-diff)); balance_enable(true); } else { balance_enable(false); } }代码里的核心就是先判方向,再按压差大小选择均衡强度。整个控制逻辑其实不复杂,真正让均衡可靠的是那些边界条件的处理。
3.4 保护联动:什么情况下必须立即停止均衡
均衡只是一个系统功能,不能凌驾于安全保护之上。我在状态机里写了几条硬性的优先规则,任何一条触发,均衡立即关断:
- 任意电芯电压超过充电保护阈值或低于放电保护阈值,立即停止均衡。低压时继续均衡可能把低电压电芯进一步拉低,造成过放。
- 温度超过55度或低于0度,停止均衡。均衡过程本身会产生一部分热量,环境温度不适宜时容易引发热失控。
- 检测到充电或放电电流重新出现,立即停止均衡并复位均衡时间累积,等待下一次静置窗口。
- MCU内部出现ADC异常、通信超时等内部故障时,均衡强制关断。
这些保护规则的优先级高于均衡逻辑本身,我用了独立于主循环的中断标志来触发,确保任何情况下保护都能及时生效。另外还有一个看门狗定时器,防止MCU死机后均衡却一直开着的危险情况。
4. 调试实录:上电到稳定收敛的全过程
4.1 上电前必须确认的几件事
打样回来别急着上电池,先做几个确认动作。我每次都会用直流稳压电源限流供电,检查各部分电流是否在预期范围,不正常的功耗尽早暴露。然后检查MP2642GR-Z的开关节点波形,确认振荡频率和占空比和设计一致,电源控制器如果有异常,波形一眼就能看出来。
接入真实电池前还有一个关键检查:用万用表确认两节电芯与系统参考地之间没有短路,确认所有均衡相关的使能信号处于关断状态。这个步骤看着简单,真出事往往就是因为少做了这一步。
4.2 分步调试流程
我的调试顺序是先测采样、再测方向、最后调收敛。
第一步是验证电压采样精度。用高精度台式万用表作为基准,分别测量两节电芯的实际电压,和MCU读到的ADC值做对比。这一步会暴露出分压电阻精度误差、ADC偏移和增益误差,直接在软件里做一个两点校准表。
第二步是验证均衡方向。手动在软件里固定均衡方向,观察电压变化趋势:是均衡方向对应的那节电芯电压在下降,另一节在上升。方向搞反了是最隐蔽的bug,因为均衡后压差确实变小了,但方向反了会出现"低电芯更低"的异常,甚至触发欠压保护。我第一版就遇到过这种情况,花了一晚上排查才发现是方向定义反了。
第三步才是验证自动收敛。让两节电芯产生一个200mV左右的压差(我给其中一节单独充电),然后启动自动均衡。记录每30秒的电压数据,观察压差是否单调收敛、有没有过冲、停止阈值是否准确命中。
4.3 三个典型的坑
第一个坑是地弹噪声导致ADC读数跳动。开均衡的瞬间,功率级的电流突变会引起系统参考地电平波动,ADC读到的电压值跟着跳,严重时甚至能达到几十mV。这个问题的根源是采样电路的地参考点和功率回路共用了一段走线。解决方法是调整布线,把采样电路的模拟地和功率地分开走,单点汇合,同时在软件里对均衡启动后的前几秒采样结果做丢弃处理,等功率级工作稳定了再开始采集。
第二个坑是电芯极化造成的"假压差"。均衡刚开始时,电芯内阻上产生的压降方向正好和均衡方向相反,也就是说,均衡从高电压电芯取电时,高电压电芯端电压会立刻下降,如果不加滤波会让系统误以为均衡过头了。我的三层滑动平均滤波方案就是在这个阶段加上的。
第三个坑是静置判定的微小电流误判。备用电源系统里常常有指示灯、通信模块等小负载,它们虽然不在充放电主回路里,但也会产生几十毫安的电流。如果我设置的静置判定阈值太紧,系统永远等不到静置窗口,均衡功能形同虚设。后来我把判定电流放宽到50mA,并且要求持续30秒,既保证了可靠性,又不会误杀实际静置状态。
4.4 MP2642GR-Z的布局心得
功率级的PCB布局我说几个实操经验。开关节点的铜皮要尽量小,但又要够承载电流,这是一个平衡,多试几次就能找到合适尺寸。电感要放在靠近开关节点的地方,走线短粗,避免辐射。芯片底部的散热焊盘必须可靠接地,不然温度一高功率降额很严重。电流采样电阻的开尔文接法一定要做,连接不当均衡电流会不稳。
我还在均衡功率级周围加了几个测试点,方便调试时用示波器测量各关键节点波形。这些测试点平时不贴料只留焊盘,调试时临时焊线,量产时省成本,调试时省时间,值得推荐。
5. 常见问题速查与避坑清单
5.1 问题速查表
| 问题现象 | 可能原因 | 排查方法和解决措施 |
|---|---|---|
| 均衡启动后电压采样明显跳动 | 功率回路地噪声串入采样地 | 模拟地与功率地分开走线,单点汇合;均衡启动后丢弃前几秒采样数据 |
| 均衡方向反了,压差反而变大 | 方向判断逻辑写反,或采样通道接反 | 先固定方向做开环验证,用万用表确认电压升降趋势 |
| 均衡一直不启动 | 静置判定被系统小电流阻塞 | 检查系统待机电流大小,适当放宽静置判定的电流阈值和持续时间 |
| 压差收敛到停止阈值后又反弹 | 迟滞窗口太小,或电芯极化电压释放 | 检查停止阈值和迟滞设置,适当加大迟滞范围 |
| 均衡电流远远达不到预期 | 电感饱和或电流采样电阻偏大 | 检查电感额定饱和电流,确认采样电阻阻值和功率裕量 |
| 均衡过程中MCU复位 | 开关噪声干扰复位引脚 | 复位引脚加RC滤波,功率回路和MCU电源之间加LDO和去耦电容 |
| 长期存放后电池电压偏低 | 系统待机消耗,或存在反向漏电通道 | 检查供电电路是否有从输入电容向电池漏电的路径,增加防反关断 |
5.2 避坑清单
写到这里,把几个印象最深的教训总结成清单:
第一,别图省事跳过校准。分压电阻、ADC参考、电流采样电阻都是离散器件,每一路都有误差。两点校准看起来麻烦,但它是均衡判断准确性的基础。没有校准就上自动均衡,绝对会出问题。
第二,均衡控制逻辑一定要有独立于主循环的保护通道。如果保护逻辑里面还有延时,那它就称不上保护了。
第三,MP2642GR-Z这类高频开关控制器对布局极其敏感,原理图抄袭容易,布局照搬才是真的考验。我自己至少改了两版布局才把EMI和采样稳定性调好。
第四,也是我个人吃过最大亏的教训:均衡方向定义一定要用注释写在代码里,配合原理图的名称统一命名。这种低级问题排查起来最费时间。
结尾的小体会
这个项目做到后来,我发现两串电池均衡的核心难点其实不在电路,而在"判断什么时候该均衡、什么时候不该均衡"。功率级搭好之后,剩下的工作全是和电压毛刺、电流噪声、极化效应这些物理层面的东西较劲。我在实际调试中最大的体会是,每一个看起来随机的采样跳变背后都有它的物理来源,找到了原因,解决办法往往很朴素。
如果你也正在做类似的两串或低串数BMS,我的建议是先别急着追求大均衡电流。把采样做稳、把静置判定做准、把迟滞和保护理清楚,均衡自然就收敛了。稳定运行比极限速度重要得多,这是我在这个项目里最值回票价的收获。