前阵子做储能项目的BMS,被两组串联电池单元的压差问题折腾得够呛。电芯出厂参数明明一致,系统上电时两组电压也差不多,可跑了几十个循环后,静置状态下的压差就慢慢拉到了200mV以上,整柜可充放电容量肉眼可见地缩水。最后敲定的方案是用MP2642GR-Z做均衡功率级、STM32L152RE做采样和决策,把高压单元的能量一点一点搬给低压单元。这篇文章把从拓扑选择、参数计算,到软件策略和调试踩坑的完整过程写下来,给做储能BMS、备用电源管理的同行做个参考。
如果你正在纠结用被动均衡还是主动均衡,或者面对两个串联的电池包不知道怎么处理,又或者拿到一颗DC-DC芯片想把它改造成能量转移均衡器,这篇应该都能帮到你。文中涉及的采样精度问题、滞回控制、超时保护这些点,都是实际项目中绕不开的细节,我会把推导过程和现场记录都放出来。
1. 两个串联电池单元,为什么也要专门做均衡
1.1 先看串联电池组的“木桶效应”
先从一个最基础的现象说起。两个电池单元串联,回路里流过的电流完全相同,所以充进去的电荷量、放出来的电荷量也是一样的。但问题在于:两个单元的可用容量不一定一样,老化速度也不一样。
充电时,容量小的单元会先达到充电截止电压。为了保护电池,系统只能停止充电,这时候容量大的单元还没充满。放电时,容量小的单元先降到放电截止电压,系统又得停止放电,容量大的单元还剩不少电没用出来。整个系统能用的电量,永远被容量最小的那个单元限制住,这就叫“木桶效应”。
用生活里的例子类比就是:两个水桶串在一起装水,决定总装水量的不是最大的桶,而是最小的桶。储能系统里这种浪费尤其可惜,因为设备按整柜容量标称,用户付的是全额的钱,实际可用的却打了折扣。
更麻烦的是恶性循环。容量小的单元每次循环都会比容量大的单元承受更深的充放电区间,老化速度更快,压差越来越大,木桶短板越来越短。如果放任不管,整套系统的寿命会被这个“短板单元”直接拖垮。
1.2 储能和备电场景里为什么会出现两个串联单元
有人可能会问:电芯不均衡我理解,但标题里说的是“电池单元”而不是“电芯”。确实,在很多储能和备用电源系统里,结构并不是“一堆电芯直接串联成整组”,而是先封装成两个独立的电池包,再串联成母线电压。
比如家用储能柜里,母线电压是48V,柜内可能放两组24V电池包串联;备用电源系统里,常见两组12V电池串联成24V给设备供电。每个电池包内部可能已经有自己的电芯均衡,但包与包之间是老死不相往来的:各自的BMS独立工作,散热条件不一样,充放电循环次数也可能不一样,时间一长,两个包之间的不均衡就被放大了。
这种单元级不均衡的代价,比电芯级不均衡更直观。单元容量差异3%的时候,整系统可用容量可能损失超过10%。如果差异超过10%,系统甚至会出现“小单元过充、大单元长期吃不饱”的危险状态。所以,单元之间的均衡不是锦上添花,而是必须做的维护性功能。
2. 均衡拓扑与芯片选型思路
2.1 被动均衡和主动均衡怎么选:一张表看明白
均衡的本质是让两个单元的电压或荷电状态(SOC)趋于一致。实现手段大致分两类:被动均衡和主动均衡。
被动均衡很好理解,就是给高电压单元并联一个电阻,多余的能量以热量的形式耗散掉。优点是电路极简、成本低、技术成熟,电芯级BMS里大量使用。缺点也很明显:能量白白浪费了,均衡电流大一点发热就吃不消,而且它只能“削高”,不能“补低”,削下来的能量也没法给另一侧用。
主动均衡则相反,通过功率变换电路把能量从高电压单元搬到低电压单元,属于“取高补低”。能量没有浪费,效率可以达到90%以上,均衡电流也能做得比较大。代价是电路复杂、成本高、控制策略需要仔细设计。
| 对比项 | 被动均衡(电阻耗散) | 主动均衡(能量转移) |
|---|---|---|
| 能量去向 | 变成热量散掉 | 转移到低电压单元 |
| 均衡电流能力 | 受散热限制,一般在100mA以下 | 可以做到几百mA甚至A级 |
| 电路复杂度 | 低,一颗MOS加一颗电阻 | 中高,需要功率级和控制逻辑 |
| 成本 | 低 | 较高 |
| 适用场景 | 小容量电芯级均衡 | 大容量单元级均衡、储能/备电 |
为什么储能和备用电源系统更适合主动均衡?因为这两个场景对能量利用率和系统寿命非常敏感,被动均衡那种“耗电求平衡”的方式,在几十Ah甚至上百Ah的电池包面前完全不够看。均衡电流如果只有几十毫安,面对上百mV的压差,可能要均衡十几个小时才能见效,实用性很差。主动均衡能做到数百毫安级别,同时能量不外耗,这才是大容量场景的正解。
2.2 为什么是MP2642GR-Z加STM32L152RE的组合
确定走主动均衡路线后,最关键的问题就是用什么芯片实现“能量搬移”。市面上的方案有分立MOS加电感自己搭、专用均衡芯片、还有拿现成的DC-DC控制器来做功率级。我们最后选了MP2642GR-Z作为均衡功率级,STM32L152RE作为主控,分工很明确。
MP2642GR-Z这颗芯片集成了同步整流功率级,本质上是一个完整的半桥驱动方案,配一个储能电感和少量外围就能组成高效的Buck/Boost拓扑。这对主动均衡特别合适:均衡的核心就是“把某一侧的能量先存进电感,再释放到另一侧”,本质上就是一个非隔离双向变换器。用这颗芯片做功率级,省掉了自己搭半桥驱动和同步整流的麻烦,可靠性也更高。
选STM32L152RE做主控,理由更直接。均衡判定依赖电压采集,而电压采集需要高分辨率、低噪声的ADC。L152RE内置12位ADC,配合DMA可以连续扫描多个采样通道,不用CPU频繁介入。再加上它本身是超低功耗系列,储能设备长期待机时电流可以压得很低,符合备用电源对静态功耗的要求。内部有足够Flash存校准参数,掉电不丢失。综合下来,这套组合既有执行能力,又有决策能力,均衡效果才有保障。
3. 硬件电路核心设计与参数计算
3.1 电压采样链路:均衡精度的生死线
主动均衡做得好不好,首先取决于你“看”得准不准。如果电压采样误差有20mV,均衡判定的任何阈值都是笑话。串联结构里,两个电池单元共用一个中点,采样拓扑很简单:一路测上单元正极到中点,一路测中点到下单元负极,必要时再测总电压。我这里以两个12V单元组成的24V系统为例展开。
ADC输入范围通常受限,直接采12V电压是不行的,必须分压。分压电阻的选型有讲究:阻值不能太大,否则ADC输入阻抗会引入误差;也不能太小,否则分压网络本身一直在耗电。我用的总阻抗大概在10kΩ级别,配合STM32L152的ADC输入阻抗完全够用,同时静态损耗也在可接受范围。
分压比按下式折算:实际电压 = ADC读数 × 参考电压 ÷ 4096 × 分压比。比如参考电压3.3V,ADC读数2048,分压比4,那么实际电压就是3.3 × 2048 / 4096 × 4 ≈ 6.6V。这个计算要固化到固件里,并且一定要留校准接口。
ADC的参考电压选择也很关键。STM32L152内部有个VREFINT,但用来做绝对电压测量精度一般,温漂也偏大。我们实际做法是用外部基准,或者用VDDA供电并单独滤波。调试中发现,参考电压即使只是0.1V的偏差,折算到12V量程上就是0.4V误差,这种误差会直接毁掉均衡判断,所以这一块不能省。
采样线路上还要加RC低通滤波,我用的100Ω串100nF,截止频率大约16kHz,主要滤掉均衡功率级开关带来的纹波。采样走线一定要远离功率回路,最好单独走差分线,否则板上开关噪声耦合进来,ADC读数会跳得让你怀疑人生。
3.2 均衡功率级:电流设定与电感参数
MP2642GR-Z作为功率级,外围最重要的两个参数是均衡电流和储能电感。均衡电流定多少,取决于电池容量和可用的均衡时间。
我按均衡电流0.3A来设计。这个电流下,如果两个单元压差200mV,理论上每小时能搬运0.3A × 3600秒 = 1080库仑电量,约0.3Ah,换算成电压变化大约几十毫伏,几个小时内能把明显的压差拉回到合理范围。电流再大当然更快,但电感、MOS管和PCB的发热压力都会上来,对长时间运行的可靠性不利。
电感值的计算要用Buck/Boost的经典公式。假定输入电压Vin=13V,输出电压Vout=11V,开关频率fsw=500kHz,允许的电流纹波取均衡电流的20%,即ΔI=0.06A。占空比D≈Vout/Vin≈0.85,那么电感值L=(Vin−Vout)×D/(fsw×ΔI)=(13−11)×0.85/(500000×0.06)≈56.7μH。我实际选了68μH,留了一点裕量,纹波比理论值更小,对采样干扰也更低。
电流采样用输出端的低阻采样电阻加反馈网络实现恒流控制。采样电阻0.1Ω,反馈阈值电压30mV,对应0.3A均衡电流。如果要调整电流,只需要软件改PWM占空比或硬件调反馈分压就行。调试时建议先从小电流开始,确认方向无误后再逐步提高到目标值。
PCB布局上有个注意事项:MP2642GR-Z的功率回路要尽量短粗,电感要远离模拟采样区。功率线一分米外的采样走线和功率线旁边的采样走线,测出来的噪声完全是两个级别,这一点直接影响后面的压差判定。
3.3 主控系统与安全保护设计
主控系统以STM32L152RE为核心,供电、复位、时钟、调试接口四件套配齐。供电直接由系统母线通过降压稳压得到3.3V,复位电路用外部看门狗配合内部独立看门狗,双保险。调试接口在量产板上保留但不引出到外部壳体,方便产线校准。
保护电路是储能设备的重中之重。均衡通道的输入和输出都要做过压、欠压判断。我设置了两个硬性保护条件:单元电压超过14.5V或低于10V时,直接禁止均衡;持续工作温度超过65℃时,功率级强制关断。这些保护除了在MCU软件里做,还通过硬件比较器直接接到MP2642GR-Z的使能脚,即使MCU死机也不影响安全关断。
和上位BMS的联动也要考虑。我们的系统在外部BMS发出故障信号时,会通过硬线信号切断均衡功率级,不经过软件处理,从信号到动作的延时在微秒级别。因为均衡本来就是锦上添花的功能,在不安全的状态下,宁可不去均衡也不能给电池带来额外风险。
4. 软件架构与控制策略实现
4.1 ADC采集与数据预处理
软件架构上我习惯用一个轻量级的前后台系统:主循环负责均衡状态机、策略判定和异常处理,定时器中断里触发ADC采样,DMA把结果搬运到内存缓冲区,完全不阻塞CPU。
ADC采样配置成扫描模式,三个通道分别对应:上单元电压、下单元电压、温度。温度用NTC热敏电阻,通过分压进采样。为了消除噪声,每次采集16个样本,去掉最大最小值后取平均。这种“去极值平均”的滤波方法对尖峰干扰特别有效,而且不会像普通滑动平均那样把真实的电压变化拖得过于迟钝。
换算公式如下:
float ConvertVoltage(uint16_t adc_raw, float ref_voltage, float divider_ratio) { float v = (float)adc_raw * ref_voltage / 4096.0f * divider_ratio; return v; }校准环节绝对不能少。板上电后,用高精度万用表实测两节单元电压,和MCU读出来的值对比,算出增益误差和偏移误差,写进Flash。我实测下来,不做校准时两路采样可能差15mV左右,做完校准能压到3mV以内。这个精度对均衡判定才是有意义的。
4.2 均衡启动判定与滞回控制
均衡策略上我采用的是“静置均衡”为主:系统处于既不充电也不放电的静置状态时,电压才近似等于开路电压(OCV),这时候的电压差异才能可靠反映SOC差异。带载时电池内阻会制造虚假压差,这时候去均衡反而会误判。
启动条件整理如下:
- 系统静置时间超过30秒,充电和放电电流都小于0.5A
- 上单元电压与下单元电压之差的绝对值大于启动阈值
- 温度正常,无任何故障标志
- 均衡超时计时器未耗尽
启动阈值我一开始设的是30mV,后来改到50mV。原因后面调试部分细说。停止条件则是压差小于20mV,或者均衡持续时间超过8小时,又或者系统检测到超过1A的充放电电流。
这里有一个细节很关键:滞回控制。启动阈值50mV,停止阈值20mV,两个值之间留了30mV的缓冲。如果启动和停止阈值设成同一个值,在临界点附近会出现“均衡一下、停一下、再均衡”的振荡,MOS管和电感反复冲击,发热和应力都不健康。加上滞回,振荡问题就自然消失了。
4.3 均衡状态机与保护逻辑
状态机是整个软件的核心,我定义了六个状态:空闲、静置监测、充电中、放电中、均衡运行、均衡超时保护。状态转移条件如下表:
| 当前状态 | 转移条件 | 下一状态 |
|---|---|---|
| 空闲 | 检测到充电电流 | 充电中 |
| 空闲 | 检测到放电电流 | 放电中 |
| 空闲 | 静置满足,且压差大于启动阈值 | 均衡运行 |
| 充电中/放电中 | 电流恢复正常,静置超30秒 | 静置监测 |
| 均衡运行 | 压差小于停止阈值 | 空闲 |
| 均衡运行 | 均衡时间超过8小时 | 超时保护 |
| 超时保护 | 人工清除或系统重新上电 | 空闲 |
均衡运行状态下,软件通过PWM控制功率级的占空比,实现软启动和稳流。启动时先把均衡电流限制在设定值的50%,运行1秒后提到100%,避免上电瞬间的电流冲击。停止时也做斜坡降流,不直接切断。这个细节让电感和电容上的振铃小了很多。
均衡超时保护非常重要。如果系统判断“需要均衡”却始终达不到停止条件,可能是电池已经损坏,或者采样出问题,这时候不能让它无限跑下去。8小时超时后,状态机会进入保护状态并报故障,需要人工介入检查。这个设计在实际项目中救了我一次:有一颗电池内部微短路,均衡一直拉不平,如果没有超时保护,功率级会一直满载运行发热。
代码骨架大概是这个风格:
typedef enum { STATE_IDLE, STATE_STANDBY, STATE_CHARGING, STATE_DISCHARGING, STATE_EQ_RUN, STATE_EQ_TIMEOUT } BmsState; BmsState current_state = STATE_IDLE; void BmsStateMachine(void) { float v1 = ReadCellVoltage(CELL_UPPER); float v2 = ReadCellVoltage(CELL_LOWER); float diff = v1 - v2; switch (current_state) { case STATE_IDLE: if (diff > EQ_START_THRESHOLD) { EnableEqualizer(1); current_state = STATE_EQ_RUN; } break; case STATE_EQ_RUN: if (fabsf(diff) < EQ_STOP_THRESHOLD) { DisableEqualizer(); current_state = STATE_IDLE; } break; /* 其他状态类似处理 */ } }实际工程代码会比这个长不少,但核心逻辑就是这张状态表。清晰的状态机让代码可维护性高很多,后续加新功能也不用担心把策略逻辑改乱。
4.4 温度降额与多机协调
储能机柜里可能不止一组电池,均衡策略上需要考虑温度差异的影响。两个电池单元通常会分布在机柜的不同位置,散热条件不同,同一时刻的温度可能差不少。电压和温度是强相关的,低温单元电压偏低,但并不意味着它的SOC真的低。
我加了温度降额逻辑:如果两个单元温差大于5℃,把启动阈值临时提高到80mV,优先让温差回落再谈均衡。如果温度超过55℃,均衡电流自动降为设定值的50%,超65℃彻底关闭。这个逻辑用一次简单的分段函数实现,不需要复杂的模型,但能避免很多误判。
多机协调方面,我们的方案是每套均衡系统独立工作,但不和主BMS抢控制权。高端BMS下达的充放电指令优先级高于均衡状态机,系统一旦进入大功率充放电状态,均衡立刻挂起。道理很简单:均衡是在“空闲时间”做的事情,不能干扰主功能。
5. 实测数据与调试心得
5.1 均衡前后的压差变化
整机调通后,我专门做了72小时连续均衡测试。测试对象是两个标称12V的铅炭电池单元,一个静置电压12.85V,一个12.63V,初始压差220mV。测试记录如下:
| 时间点 | 上单元电压 | 下单元电压 | 压差 | 说明 |
|---|---|---|---|---|
| 起始 | 12.85V | 12.63V | 220mV | 均衡启动 |
| 1小时后 | 12.78V | 12.70V | 80mV | 压差快速缩小 |
| 2小时后 | 12.74V | 12.71V | 30mV | 接近停止阈值 |
| 3小时后 | 12.73V | 12.71V | 20mV | 均衡自动停止 |
| 24小时后 | 12.73V | 12.72V | 10mV | 静置回弹后仍稳定 |
| 72小时后 | 12.74V | 12.72V | 20mV | 无明显反弹 |
最明显的感觉是均衡过程前期速度快,后期变慢。原因是恒流均衡模式下,单位时间搬运的电量相同,但同样的电量在低压差阶段引起的电压变化更小,因为充电曲线的斜率在平台区更平缓。这很正常,不要指望主动均衡能把压差做到0mV,能稳定在20mV以内已经非常理想。
5.2 调试中遇到的三个核心问题
第一个问题:ADC采样读数总比万用表低将近20mV。排查了一圈,发现是分压电阻用了5%精度的普通电阻,两颗电阻的误差叠加起来足以造成这么大的偏差。解决办法是把分压网络换成了0.1%精度电阻,并在固件里做了两点校准。这事给我提了个醒:均衡系统的精度瓶颈经常在最不起眼的分压电阻上。
第二个问题:临界点附近的均衡振荡。第一次实测时,我把启动阈值和停止阈值都设成30mV,结果系统在26mV到34mV之间反复启动、停止,功率级的开关频率和温度都有明显波动。引入50mV启动/20mV停止的滞回区间后,问题彻底消失。这个经验后来也用到其他项目的阈值设计上。
第三个问题:均衡MOS管和电感温度偏高。0.3A均衡电流设计值下实测温度到了70℃以上,明显超出预期。拆开分析发现是PCB功率回路走线过长,寄生电感导致开关损耗增大。重新布局铺铜,将功率回路面积缩小到原来的三分之一后,温度降到了50℃以内。这类问题在低压大电流电路里非常典型,板级布局对效率的影响往往比芯片本身更大。
5.3 参数调优的经验值
几轮测试下来,我最终定的参数组合是:均衡启动阈值50mV,停止阈值20mV,均衡电流0.3A,最长均衡时间8小时,温度保护65℃。如果你的系统电池容量更大,或者对均衡速度有更高要求,可以把电流往上调,但每增加0.1A均衡电流,都需要重新核算电感和MOS管的散热。散热不够就降低电流,不要硬扛。
6. 常见问题排查速查
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 均衡从未启动过 | 压差采样误差大,实际压差未触发阈值 | 校准ADC,检查分压电阻精度 |
| 均衡一直运行不停止 | 停止阈值设太低;电池损坏;均衡时间上限未生效 | 检查压差数据,确认超时保护是否开启 |
| 均衡时系统电压波动大 | 软启动未做或功率级关断过急 | 增加启停斜坡控制 |
| 采样读数跳动明显 | 采样走线靠近功率回路 | 重新布局,增加RC滤波电容 |
| 功率级过热 | 电感选小了或回路面积太大 | 增大电感,缩小功率回路面积 |
| 均衡效果不明显 | 均衡电流太小或者本来就是电池组内故障 | 实测均衡电流,确认功率级是否真正工作 |
| 上电后ADC读数异常 | 参考电压不稳 | 检查VDDA滤波,考虑外部基准 |
排查问题切忌只盯软件或者只盯硬件,均衡系统是软硬件的交叉体,很大概率问题出在采样上而不是功率上。多准备一块高精度万用表,直接把电压读数打到芯片侧的ADC引脚上,从源头一级一级缩小范围,效率最高。
写在最后的实际操作体会
项目做到现在,我最深的体会是:均衡系统真正的难点不在那颗功率芯片,而在采样精度和控制逻辑的细节里。MP2642GR-Z的功率级表现很稳定,反而是采样链路让我折腾了最久。如果重新做一版,我会在硬件设计阶段就直接预留外部基准和校准接口,而不是依赖封装内部的参考,这样能省掉大量后期校准的返工。
最后分享一个调试技巧:对比两个单元电压时,用两块高精度万用表同时测量,比一块表轮流测量更靠谱。轮流测会引入时间差,而两块表同时读才能抓到同一时刻的真实压差。这个细节看起来不起眼,但排查采样问题时能帮你少绕很大一圈弯路。