前阵子给一套两串磷酸铁锂备用电源做电池管理补强,均衡这一块让我反复折腾了好几轮。最终定下来的方案是 MP2642GR-Z 负责功率级能量搬运、PIC18F65K40 负责电压采集和均衡策略,两串电池通过主动均衡把不一致性收敛下来。这个组合在储能和备电系统里很有代表性,但查资料要翻很多文件,外围设计细节和调试踩坑文档里根本没写。这篇文章就把整套方案的原理、参数计算、控制逻辑、调试过程完整拆开讲一遍,适合正在做BMS、储能PACK或备用电源的硬件和嵌入式工程师,也能帮刚入门的朋友理解主动均衡到底是怎么回事。
1. 方案框架与选型逻辑
1.1 为什么是主动均衡:从“耗能放电”到“能量搬运”
电池成组之后,容量、内阻、自放电率不可能完全一致,充放电循环越久,不一致越明显。尤其磷酸铁锂这种平台电压很平的电池,在充电末端一旦出现容量差,单体电压会迅速劈叉:容量小的那节先到满电,容量大的还在半山腰,整组电池只好被迫降流甚至停机。
最常见的均衡方式是被动均衡,也就是在每个单体上并联一颗电阻,把电压高的电池多余电量直接耗成热。这个方案成本低、电路简单,很多低速车和通信备电里都在用,但它的缺点非常直接:均衡电流不敢做大,因为热量完全靠PCB和外壳散;能量白白浪费;更重要的是容量不一致本身没有被修复,只是把高容量电池的可用能量强行“削”掉。放在储能这种循环次数高、一天充放好几次的场景,被动均衡基本只能稳定表象,不能让电池组的实际可用容量回升。
主动均衡的思路完全不同。它用电感或者电容做中介,把电压较高的电池的电量搬到电压较低的电池,能量不变成热,均衡电流也可以做到几百毫安甚至几安培。放在两串备用电源系统里,我们需要的不是“让两块电池表面电压一样”,而是“让两块电池在充放电循环里始终同步”。主动均衡才是真正在搬能量,这也是我坚持用 MP2642GR-Z 这类电感式主动均衡芯片而不是依赖被动电阻均衡的原因。
1.2 MP2642GR-Z 与 PIC18F65K40 的分工配合
这套系统里两个器件的角色非常清晰:MP2642GR-Z 是执行者,负责功率级的能量双向搬运;PIC18F65K40 是决策者,负责感知电池状态、判断均衡方向、决定什么时候开启什么时候关断,以及保护系统安全。
| 模块 | 职责 |
|---|---|
| MP2642GR-Z | 双向DC-DC功率级,内部集成功率开关和电流检测,外围配一颗电感和限流电阻,完成电池单体之间的能量搬移 |
| PIC18F65K40 | 采集两节电芯电压和温度,运行均衡状态机,控制方向信号和使能信号,处理过压、过温、超时等保护逻辑 |
这个分工是整个系统稳定的基础。如果完全用分立MOS自己搭一个双向升降压电路,死区控制、过流检测、同步整流时序全都要自己做,一旦出错就是炸管,调试周期很长。MP2642GR-Z 把功率级做了集成,对MCU只暴露使能、方向和限流设定这些接口,硬件可靠性高了很多,我们才能把主要精力放在均衡策略上。
PIC18F65K40 用来做控制也很合适。这颗MCU除了供货稳定、耐温范围宽,关键是片上12位ADC和内置运放正好覆盖电池电压采样的需求,内部定时器也能在不占用CPU的情况下按固定周期触发采样。储能设备里EMC环境并不干净,K40系列的强项之一就是外设配置灵活,可以在采样时刻避开功率开关动作,这对后续章节讲的调试问题影响非常大。
1.3 为什么第一版从两串电池开始
很多人一上来就想着做完整的多串系统,比如48V的13串或者72V的20串,我建议先不要急。两串电池是整个问题的最小闭环:它恰好能体现“哪节高就往哪节搬”的完整逻辑,方向判断简单,功率拓扑清晰,调试也只需要关注两颗电芯。备用电源场景里,两串磷酸铁锂替换传统12V铅酸电池是非常常见的需求,小型UPS、工业备电、应急照明装置都在用,所以这个方案并不是阉割版,本身就是一种真实可交付的产品形态。
我选择 MP2642GR-Z 还有一个原因:它并不是只支持两串的芯片,规格上是面向多节串联场景的。两串阶段把硬件平台和软件状态机跑通,后续把它扩展到四串、乃至用多个模块去覆盖更大串数的电池组,路径是平滑的。所以我们第一版把所有精力集中在两串上,把电压采集、方向控制、保护机制这些最基础的问题吃透。
2. 基于 MP2642GR-Z 的功率链路与硬件设计
2.1 能量搬运的基本工作过程
理解主动均衡最直观的方式是把它想成两个水池。一个水池水位高,一个水池水位低,被动均衡的做法是在两个水池之间开一个漏水的小口,高水池的水流到低水池,但途中有大量水渗进土里;主动均衡则是用一个水桶,从高水池舀水,端过去倒进低水池。电感就是那个水桶。
具体到电路上,MP2642GR-Z 内部其实就是一个电感储能式双向变换器。假设第一节电池CELL1电压高,第二节CELL2电压低,需要把能量从CELL1搬到CELL2。芯片先让CELL1给电感充电,电感电流从零开始上升,这段时间里电感把能量以磁场形式存储;然后芯片断开CELL1,把电感接到CELL2上,电感通过续流把能量释放到CELL2。下一周期重复同样动作,开关频率越高、电感越大、限流值越高,单位时间搬移的能量就越多。如果CELL2比CELL1高,芯片把开关时序反向,能量流动方向就反过来。
在这个过程里,MCU的角色不是去控制每一个PWM周期,芯片自己会完成斩波逻辑、同步整流和电流限制。MCU只需要告诉它“现在开始工作”和“往哪个方向搬”。MP2642GR-Z 接收到的方向信号决定内部开关组的动作顺序,使能信号则控制整颗芯片的工作和休眠。对应到项目里,就是PIC18F65K40 输出两路数字信号:一路使能,一路方向,再加一颗外部电阻把目标均衡电流设定好,功率部分就闭环了。
主动均衡也不是100%无损的。开关管的导通电阻、电感直流电阻、同步整流的压降都会带来一定损耗,整体效率通常能落在85%到95%之间。听起来不如被动均衡“损耗为0”省事,但被动均衡是把整份能量变成热,主动均衡只是把搬运过程的损耗变成热,两者完全不是一个数量级。在两串备电这种空间紧凑、散热能力有限的系统里,热量控制往往是决定方案可行性的关键。
2.2 电感、限流电阻、采样电路的关键参数计算
功率链路里最重要的三个外部参数是电感量、限流设定电阻、采样分压电阻,每个都得算清楚,不能拍脑袋。
电感量主要影响电流纹波和峰值电流。开关电路里电感纹波电流的经典公式是:
ΔI = (V_L / L) × T_on
我这一版使用的开关频率是300kHz,两节电池在典型压差下占空比D大约是0.89,对应导通时间T_on约2.97微秒,高压侧电压按3.6V估算。如果电感选择100μH,纹波电流理论值就是:
(3.6 / 100e-6) × 2.97e-6 ≈ 0.107A
也就是0.1A左右的纹波,对目标0.5A的平均均衡电流来说是合理折中。如果把电感降到47μH,纹波会翻倍到0.23A,虽然也能工作,但电感峰值电流和芯片开关损耗都会增加,发热明显变大。我最终选的是100μH、额定电流1A以上、饱和电流大于1.5A的功率电感,留足余量。
限流设定电阻直接决定均衡电流目标值。这颗芯片的电流设定本质上是通过外部电阻对内部基准电流做镜像,电阻越小,设定电流越大。我参照数据手册的ISET对照曲线,按目标0.4A到0.5A选了一颗5.6kΩ、温漂控制在1%以内的贴片电阻。这里要特别提醒:计算值只是起点,芯片批次差异、电感实际值、PCB走线阻抗都会影响最终电流,上电后一定要用电流探头去验证,按实测值去微调电阻。
电池采样部分,两节电芯电压需要经过分压才能进入PIC18F65K40的ADC。ADC参考电压我设为2.5V,电芯最高电压按4.5V留余量,分压比取2:1,采样电阻选用0.1%精度、温漂1%的精密电阻,并且在ADC管脚到地之间并联一个100nF电容做RC滤波。采样分压电阻的阻值要尽量大,比如每路取100kΩ以上,把对电池侧的负载影响降到最小。除此之外,电池组输入端要放一颗双向TVS,防止热插拔或负载切换时产生尖峰,把瞬态电压钳在芯片能够承受的范围以内。
2.3 PCB布局与走线取舍
MP2642GR-Z 工作时的开关电流很大,PCB布局如果草率,后面的调试会让你怀疑人生。我的经验可以浓缩成几条。
第一,高频功率回路尺寸必须短。电感、芯片的SW节点、输入输出电容要尽量靠近,让功率电流在一个紧凑闭环里流动。这个环路面积越大,辐射噪声越强,叠加在采样线上的干扰就越难滤掉。第二,电池采样线必须单独走。用细线从电池端子直接引到分压电阻,千万不要在功率电流通路上取分压,因为功率地线上的大电流会产生毫伏级压降,直接影响ADC读数。第三,电感在板上的位置尽量远离MCU和采样走线。电感漏磁会耦合到模拟信号上,让电压采集出现周期性噪声,特别是储能设备附近还有别的通信线路时问题更明显。第四,PIC18F65K40 的ADC参考电压不能直接接在系统电源地上,最好用一颗低噪声LDO单独供电或者加磁珠隔离,否则采集到的电压噪声会很大,均衡方向判断就会一抖一抖的。
3. PIC18F65K40 的均衡控制软件实现
3.1 电压采集与一致性判定的完整流程
硬件铺好之后,软件才是均衡系统的灵魂。PIC18F65K40 的软件逻辑看起来简单,实际做下来要考虑的细节非常多。
先讲电压采集。系统上电后不能立刻进入均衡状态,因为刚上电时电池还在恢复期,端电压并不代表真实一致性。我的做法是先等30秒到1分钟,让电池组静置,然后才开始连续采样。PIC内部的12位ADC按200毫秒左右的周期循环采样CELL1、CELL2和两个NTC温度通道,每次连续读16次取平均再存入缓冲区。
一致性判定不能只看瞬时值。我用三个条件同时满足才允许进入均衡:电压差值大于开启阈值、持续至少1秒以上、当前没有充电器大电流接入。这里有个很关键的工程细节,阈值必须加滞回。比如开启阈值设15mV,关断阈值设8mV,这样系统在临界点附近不会反复开启、关断均衡器。如果只有一个阈值,压差在14mV上下抖动时,均衡器会以几秒钟一次的频率来回切换,电感电流反复冲击,设备整体寿命都会受影响。
采集完成之后还要做一步校准。两路分压电阻虽然精度很高,但实际使用时会在分压比上产生细微差异,这个差异足以影响十几毫伏的判断。我在出厂前会做一次两点校准,把两路ADC读数分别用基准电压源校正,补偿系数写进PIC的Flash。别小看这一步,均衡方向判断错误往往就是差这么几个毫伏。
3.2 均衡状态机与方向控制逻辑
软件主体我用了三态状态机:空闲、均衡、保护。相比用一堆if/else直接处理,状态机的优势是可扩展性:以后从两串扩展到四串,只需要在状态机里记录“当前正在均衡哪一对电池”,而不会出现多个模块相互打架的问题。
下面这段是核心代码的骨架,语言是PIC18系列常用的C语言风格,实际工程里要补上底层驱动接口:
#define THR_BAL_ON 15 // 单位mV,开启阈值 #define THR_BAL_OFF 8 // 单位mV,关断阈值 #define BAL_TIMEOUT_MIN 30 // 单位min,最长均衡时间 void balance_task(void) { int16_t diff_mv = (int16_t)(vcell1_mv - vcell2_mv); // 压差在滞回区间内,关断均衡 if ((diff_mv > -THR_BAL_ON) && (diff_mv < THR_BAL_ON)) { BAL_EN = 0; bal_state = 0; return; } // 判断方向:CELL1偏高则正向,CELL2偏高则反向 if (diff_mv >= THR_BAL_ON) { BAL_DIR = 0; // 正向:能量从CELL1搬到CELL2 } else { BAL_DIR = 1; // 反向:能量从CELL2搬到CELL1 } if (bal_state == 0) { BAL_EN = 1; bal_start_tick = uptime_min(); bal_state = 1; } // 超时保护:30分钟还没收敛,说明电芯或接触有问题 if ((uptime_min() - bal_start_tick) > BAL_TIMEOUT_MIN) { BAL_EN = 0; bal_state = 2; report_fault(FAULT_EQ_TIMEOUT); } }这里 BAL_DIR=0 和 BAL_DIR=1 的方向定义要先在底层驱动里和芯片手册确认,不同板子上的连接方式可能会让逻辑反相,代码里一个注释写错,调试时就多花半天。我还加了一个均衡超时保护:开启均衡30分钟后如果压差仍然没有收敛到关断阈值以内,就把均衡器关掉并上报故障,因为这说明电池可能已经损坏或者连接出现了接触电阻问题,继续盲目均衡只是在消耗能量。
3.3 保护机制与安全边界
电源系统做安全设计,必须假设电池本身会出问题,不能假设所有情况下电池都是健康的。
首先是过温保护。两颗NTC分别贴在电芯表面,软件里温度阈值设为60摄氏度触发暂停,50摄氏度恢复。如果在均衡过程中温度快速上升,优先怀疑电感饱和或者电流设定偏高,但作为系统级策略,PIC要第一时间停止均衡,避免热量叠加。然后是充电末端保护。磷酸铁锂单体电压到3.65V左右就进入满电区,一旦发现某节电池电压达到过压阈值,任何均衡动作都要停止,优先让充电策略接管。充电末尾的均衡很容易造成金属锂析出的风险,这一步必须做到优先级最高。
方向切换中间不能直接翻转,要留一个释放窗口。电感是储能元件,电流不能突变,如果上一秒从CELL1搬向CELL2,下一秒突然要求从CELL2搬向CELL1,电感瞬间开路会产生高压尖峰,严重时直接打坏功率开关。我的做法是在方向切换前先把使能关掉,等待至少10毫秒,让电感电流完全回零,再设置新方向并重新使能。这个时间在系统响应里完全感知不到,但对硬件寿命影响很大。
最后是通信上报。如果这套均衡系统被纳入整个储能系统的BMS,PIC18F65K40 会把均衡启动、方向变化、超时关断、过温这些事件通过UART或者RS485发给上位机。这个不仅是为了监控,更是为后续算法优化留数据:均衡时间变长、温度异常偏高等现象,在长期数据曲线里都能提前看出电池老化趋势。
4. 调试实录与常见问题排查
4.1 搭建两节电池等效测试平台
没有真电池也能调试均衡,这是最早的准备工作。我用了两台可调电源串联起来模拟两节电芯:一台设3.60V,一台设3.20V,组合成一个虚拟的两串电池组。这个方法的优点是可以随时制造任意压差,不用等真电池自己充电放电。
但这里有个坑必须说明:可调电源在本质上是电压源,它不擅长吸收外部灌入的电流。均衡器把能量从高压侧搬到低压侧时,低压侧的可调电源相当于在被动吸收电流,很多普通电源不能正常工作。我的处理是在低压侧并联一个电子负载,或者在电源输出端串联一个防倒灌二极管,把异常情况先隔离开。调试初期记录电流时也别完全相信电源面板读数,更准确的做法是用电流探头测电感或者串联一个50mΩ采样电阻,让PIC的ADC自己读电压算电流。
温度监控要跟上。我准备了热电偶贴在电感和两个功率管位置,因为均衡电流比较大时,最脆弱的往往不是电池,而是电感。电感是否接近饱和温度、是否有异常啸叫,这些信息比单纯看电压曲线更能提前暴露问题。
4.2 均衡过程实测数据
我用两组真实磷酸铁锂电芯做了完整测试,初始状态是一节3.58V、一节3.29V,压差达到270mV,均衡目标电流设定为0.45A左右。实测数据记录如下:
| 时间(min) | 高压侧电压(V) | 低压侧电压(V) | 压差(mV) | 平均均衡电流(A) |
|---|---|---|---|---|
| 0 | 3.58 | 3.29 | 270 | 0.44 |
| 15 | 3.52 | 3.34 | 180 | 0.42 |
| 30 | 3.48 | 3.37 | 110 | 0.36 |
| 45 | 3.46 | 3.41 | 45 | 0.22 |
| 52 | 3.44 | 3.43 | 8 | 已关断 |
可以看到一个趋势:虽然芯片限制的是峰值电流,但平均均衡电流会随着压差缩小而自然回落。这是因为压差变小后,单次开关周期里能搬运的能量本身在减少,搬移功率和压差近似成正比。所以均衡过程越到后期越“温和”,不会出现最后阶段还在猛灌电流的现象。
这个数据也回应了一个常见疑问:为什么均衡不能一次解决所有问题。两次测试之间如果电池又经历过几轮充放电,压差会重新出现,这是电池本身的化学特性决定的。主动均衡解决的是每一次循环中的失配问题,让每次都由平衡点起步,长远下来电池衰减速率才会一致。
4.3 高频问题速查与排查思路
调试期间踩过的坑,我整理成下面这张速查表,每个现象后面都附了排查路径:
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 均衡电流几乎为零 | 电感虚焊、电感饱和、限流电阻值过大、使能极性接反 | 电流探头测SW节点波形,确认是否有开关动作;万用表通断档测电感通路;替换限流电阻试机 |
| 均衡方向总是反 | MCU方向位定义和芯片实际方向不一致 | 在代码里加LED指示期望方向,用示波器对比芯片两端电压变化,确认逻辑后再核对芯片手册 |
| 打开均衡后ADC电压跳动剧烈 | 采样地和功率回流共地、没有RC滤波、电感漏磁干扰 | 采样线单独走地,加1kΩ串联电阻加100nF并联电容做低通,把电感移到远离ADC走线的位置 |
| 均衡运行但压差下降缓慢 | 电感饱和导致有效电流不足、限流电阻偏差、接插件接触电阻大 | 实测电感温升判断是否饱和;用电流钳复核实际电流;检查电池连接端子压接质量 |
| 压差很小但均衡器反复启停 | 缺少滞回阈值、采样噪声进入判断 | 把开启和关断阈值分开,至少留5mV以上死区;加大采样平均次数 |
这些问题的共性根源,大部分可以归结到两个点:功率回路和采样回路的相互干扰,以及控制逻辑缺少滞回和防抖。把这两点处理好,均衡器基本就稳了一大半。
5. 从两串迈向多串
5.1 基于该方案的扩展路径
两串玩透之后,面向更大的储能系统扩展就顺理成章了。MP2642GR-Z 这类芯片并不是设计成只能处理两串,一片芯片可以管理的电芯数量是有明确规格上限的。更常见的方式是“模块化级联”:每个均衡模块负责相邻的几节电池,多个模块覆盖整组电池,每个模块由独立MCU控制,或者由一个主控MCU通过多组控制接口分时管理。
具体到四串系统,最简单的做法是用两个两串模块,第一块管理CELL1和CELL2,第二块管理CELL3和CELL4。两块模块各自完成模块内部的均衡,跨模块的压差则通过更高一层的策略处理。到了十几串的储能电池组,整个系统会变成一个多级均衡架构:先做模块内均衡,再做模块间均衡。这也是为什么我在两串阶段就在状态机里预留“当前均衡对象”字段的原因,软件结构从一开始就不是只给两串用的。
5.2 多串场景下的均衡调度策略
多串和两串有一个本质差异:不能所有均衡模块同时工作。因为所有模块都挂在同一组电池总线上,如果同时搬移电流,总线电压会波动,均衡方向还会相互影响。我在两串阶段没有明显感受到这个问题,但做四串原型时立刻就碰到了。
策略其实很朴素:每次只选择压差最大的一组电池进行均衡,完成之后再重新扫描整个电池组,定位新的最大压差组合,然后继续。每5分钟左右做一次全局扫描,让均衡资源优先去处理最严重的不一致。这个策略复杂度低,代码容易维护,在储能系统里被验证过很多次。
另一个要特别注意的是相邻模块的方向冲突。比如第一块模块正在把CELL2的能量往CELL1搬,第二块模块又在把CELL3的能量往CELL4搬,当CELL2和CELL3是串行连接的两节相邻电池时,它们的电流路径实际上会叠加干扰。主控MCU在做全局调度时必须知道每个模块当前方向,避免出现相互对推的局面。
做完整套两串方案,我最大的体会是:主动均衡设计的真正门槛不在“把能量搬过去”,而在“什么时候搬、什么时候停、搬多少”。MCU给了我们做策略的充分自由度,但自由也意味着责任,阈值、滞回、超时、温度权重,每一项都需要根据电池化学体系和实际工况反复调试。如果让我给刚开始接触这个领域的人一个建议,那就是先把两串平台玩透,把示波器、电流探头、热电偶准备好,运行至少一个月后再谈优化。另外还有一个小技巧:均衡的停止条件别设成压差为零,用一个8到10mV的停止阈值加上一分钟静默确认,既能保护电池,又不会让系统频繁切换。这套代码和电路后来被我改到四串平台只花了小半天,前期在两串上花的时间完全值回来。