前阵子帮某公司的备用电源模块做BMS改进,电池包是两串18650锂离子,标称7.4V,应用场景是应急照明、路由器小UPS这类长时间挂在待机电量上的设备。新需求听起来不复杂:待机时自动把两节电芯的电压差均衡到20mV以内,不能靠电阻发热硬耗,还得能通过串口把状态上报出来。我最终用MP2642GR-Z搭均衡功率通道、用PIC18F47J53做采样和状态机,把两串电池的均衡做成了一块独立小模块。这篇完整记录从选型、硬件、固件到调试踩坑的过程,重点是讲清楚每一步为什么这样做,以及那些常规文档里不会写的细节。
1. 需求拆解:两串电池的“均衡”到底在平衡什么
1.1 串联电池为什么会失衡
两节电池串联以后,回路电流处处相等,理论上它们应该同步充放电,但实际电芯之间的差异会随着循环次数被不断放大。原因主要有四个:制造本身的容量公差、内阻差异、自放电率差异、以及电芯所处位置的温度差异。这几个因素叠加以后,就会出现在同一套串联回路里,一节电芯还有不少余量,另一节却已经先到截止电压的情况。
充电端的问题最明显。两串电池共用一个充电器,充电器检测的是总电压。高电压那节已经到4.2V了,低电压那节可能还只有3.9V,但充电器看总电压8.1V不到8.4V就会继续充,结果就是高节长期处于过充边缘,低节长期充不满。放电时反过来,容量差导致低节先到保护电压,整包容量被最短的那块板子卡死。这是串联电池系统容量衰减和安全隐患的头号来源。
备用电源场景比动力电池更隐蔽:大部分时间系统都挂在浮充或涓流状态,偶尔才真正放电。电芯之间的差异不会像电动车那样快速爆发,但几个月下来电压差能拉到一两百毫伏。我们拆过几组旧模块,最严重的一组两节电芯静态电压差到了180mV,整包的有效容量只剩标称的六成。
1.2 备用电源场景对均衡的特殊要求
备用电源的均衡和动力电池的逻辑不太一样。动力电池讲究大电流、快转移,最好能在行驶或充电的间隙就把压差抹平。备用电源不一样,它不缺时间,缺的是稳定和低干扰。模块常年带电待机,均衡器最好满足几个条件:
- 均衡过程不能产生明显的热热点,否则影响设备长期可靠性
- 均衡电流不需要很大,几十毫安级别就够用,关键是可持续
- 均衡动作不能干扰主控采样和通信,避免电压跳变把系统搞得误动作
- 均衡目标电压要设置合理,不能把低节电芯硬顶到超过安全上限
另外一个容易被忽略的点是:备用电源的充电机会间歇性工作,均衡器必须在充电停止的空窗期也能独立运转,否则均衡周期会被切得七零八落。这意味着均衡系统一定要自带完整的判断和控制能力,不能只依赖外部充电机的管理逻辑。
1.3 为什么我放弃了被动均衡
被动均衡的原理很直白:把高电压那节电芯并联一颗功率电阻,让多余能量以热量形式耗散掉。成本低、逻辑简单,很多BMS保护板就是用这招。我一开始也试过,用一颗5欧的功率电阻配PWM控制,均衡电流大概能到300mA。实测发现几个硬伤。
首先是热量。300mA在5欧电阻上是0.45W的发热,板子小的话几颗电阻就是局部热源,长期待机时对旁边电芯的温度影响很不友好。其次是速度,被动均衡在充电末期才有效,而且电阻一直耗的是高节电芯的能量,如果充电机不工作,高节电芯很快会被拖到正常电压以下,搞出新的失衡。第三,被动均衡天生只能“耗高不补低”,两个电芯都低于理想电压但压差不大时,它毫无作为。备用电源需要的是把能量从高节搬去低节的有源方案,而不是烧掉。
2. 方案选型:MP2642GR-Z 与 PIC18F47J53 的分工
2.1 选型逻辑:功率通道与控制核心分离
均衡系统本质上解决两个问题:一是判断该往哪节电芯搬能量、搬多少,二是把能量实际搬过去。我习惯把这两件事拆开,分别交给不同器件,这样调试时能独立验证。
PIC18F47J53负责判断。它是一颗8位单片机,128KB Flash对均衡程序来说非常宽裕,自带12位ADC,采电芯电压的精度足够,内部振荡器跑满后连外部晶振都省了,串口上报也直接复用外设。我的任务简单说就是:读电压、算压差、按状态机切开关,顺便把日志通过UART发到调试工具。
MP2642GR-Z负责搬能量。这是一颗集成同步整流的降压转换器,工作电压范围覆盖两串锂电池包6V到8.4V的区间,输出通过反馈电阻可调,带软启动和使能引脚,非常适合被单片机直接当做一个受控电源来用。实际方案里,它专门负责把电池包的电压降到一个设定的目标电压(比如4.3V),给后面的储能电容充电。不需要它承担太多花哨功能,稳定、可关断、能限流,这就是全部要求。
这种选型思路有一个额外好处:均衡功率路径和控制逻辑完全隔离。即使单片机程序有Bug导致开关切错,MP2642这一级还有独立的过流保护,而且切换瞬间只需关掉EN就可以停掉能量搬运,调试安全很多。
2.2 均衡拓扑选择:飞行电容法为什么适合这个场景
两串均衡的经典拓扑有好几种。双向电感均衡效率高、电流能力大,但需要两对功率管和一个能双向工作的电流控制环,固件复杂度明显上升。反激式变压器隔离好,也能将能量搬运到任意电芯,但变压器体积和成本对一块小板子来说不太划算。我最后选了飞行电容法,也叫开关电容均衡法,核心思路是用一颗大容量电容当临时能量仓库,反复执行“充电—投切—放电”的循环。
飞行电容法最大的优势是天然解决了接地参考问题。上一节电芯的正极是电池包最高点,下一节电芯的负极是电池地,它们的地参考不同。如果用普通降压电路直接跨接在任一节电芯两端,参考电位很难处理。飞行电容在充电时由MP2642供电,投切时整个电容两端的电压是“浮起来”的,它可以被开关矩阵接到上节电芯两端,也可以被接到下节电芯两端。控制上只需要保证充电和投切两个阶段严格错开,就不会出现共地冲突。
这个方法还有一个工程上的好处:所有关键节点都能直接用示波器观察。电容两端电压、四颗开关的栅极波形、电池电压变化,全部可以看到,调起问题来比反激变压器直观得多。
2.3 系统框图与能量转移计算
整个系统可以分成几块来说明。电池包两端接到模块输入端,MP2642从电池包取电,输出经过预充电阻给飞行电容充电。飞行电容两端通过四颗MOS组成的开关矩阵,可以被投切到任意一节电芯的两端。PIC18F47J53负责采集两节电芯电压和飞行电容电压,对比压差后决定当前该给哪节电芯补充能量,并让开关矩阵执行投切。
能量转移的计算方式很简单:
E = 0.5 × C × (V充电完成² − V电芯当前²)
我用的飞行电容是两颗2200µF低ESR电解电容并联,等效约4.4mF。假如电容充到4.3V,电芯当前电压4.0V,单次投切换取的储能就是:
0.5 × 0.0044 × (18.49 − 16.00) = 5.48mJ
一次完整循环(充电加投切)大概需要500ms,平均搬运功率约11mW。虽然数字不大,但24小时累计下来大约能搬0.26Wh,折合到4V电压下大概是65mAh,对一个待机时漂移到几十毫伏压差的两串包来说完全够用。这套方案的本质是“细水长流的维护型均衡”,正好契合备用电源的时间充裕属性。
3. 硬件设计:采样、功率通道与开关矩阵
3.1 电压采样与校准:12位ADC的精度陷阱
电芯电压测量是整个系统的基础,做不准后面全是白费。两串电池只需要测两个点:电池包正极VTOP和中间点VMID,代码里相减得到两节电芯电压。每个采样点用两颗电阻分压,把最高4.5V左右的电压映射到ADC可接受的范围。分压电阻我选的是0.1%精度的低温漂型号,不要为了省几毛钱用1%,后面校准会补得很痛苦。
分压之后经过一级运放跟随器,再进ADC引脚。运放不是必须的,如果MCU的ADC输入阻抗足够高,可以直接采,但我还是加了,因为分压网络的输出阻抗会影响采样保持电容的建立时间,加一级跟随后采样结果稳定很多。每个ADC引脚附近放100nF和10nF两颗电容,滤掉高频开关噪声。采样引脚上再串一颗1k电阻,防止异常时外部电压倒灌损坏引脚。
固件里做两点校准:用高精度电源分别给采样通道加1.000V和4.200V,采集原始ADC码,算出每通道的增益和偏移存进Flash。实测校准以后,全量程误差可以压到±3mV以内。注意校准之后千万别换分压电阻,换了必须重做,我吃过这个亏。
3.2 MP2642GR-Z均衡电源通道的配置
MP2642的输入直接接电池包两端,输入电容用两颗22µF陶瓷电容紧贴芯片引脚摆放,这是降压转换器稳定工作的基本前提。反馈电阻网络把输出电压设定在4.30V,这个值比电芯最高电压4.2V高出一点,留出足够的充电压差,又不至于每次搬运都把电容打到太高电压。如果之后换用磷酸铁锂电芯,只需要改反馈电阻,把目标电压调到3.65V附近即可。
EN引脚接PIC的普通IO口,固件控制均衡时置高,不需要均衡时拉低,整条功率路径彻底关断。软启动引脚加上合适电容,让MP2642在上电时输出坡度平缓上升。这里有个细节:飞行电容初始是完全没电的,如果不做任何限制直接让MP2642输出给电容充电,瞬间浪涌电流会非常大,可能触发芯片过流保护,甚至把输入端的电池包电压拉出明显塌陷。我在MP2642输出和飞行电容之间串了一颗0.5欧的预充电阻,把充电峰值电流限制在安全的范围内,代价是充电时间稍长,但换来的是系统稳定。
充电阶段MP2642工作在恒压状态。刚开始电容电压低,电流大,随着电容电压接近4.3V,电流自然减小,整个过程不需要专门的恒流环路。
3.3 四开关飞行电容矩阵的设计与驱动
飞行电容的投切需要四颗开关,布局如下:两颗管接电容正端,分别能接到电池包正极VTOP和中间点VMID;两颗管接电容负端,分别能接到VMID和电池地GND。投给下节电芯时,导通电容正端到VMID、电容负端到GND;投给上节电芯时,导通电容正端到VTOP、电容负端到VMID。这样四颗管子刚好覆盖两种投切组合。
驱动上我用了高边P管加低边N管的组合,简化了电平转换问题。P管栅极用一颗小信号N管去拉,单片机IO口控制N管即可。开关管的耐压选25V以上,导通电阻要小,因为虽然平均均衡电流只有几十毫安,但投切瞬间电容放电的峰值电流可能到一两安培。栅极驱动电阻不能省,不然开关过程振铃会很难看。
软件上必须强制互锁:任何时刻都先关断全部四颗开关,等足够长的死区时间,再导通目标组合。如果出现交叉导通,等于把电容直接短路,轻则炸开关管,重则电芯短路保护。下面的固件状态机里我会专门讲这个时序。
3.4 供电树与整板保护
主控用的3.3V电源没有从MP2642的输出取,而是单独用了一颗低压差稳压器从电池包供电。这么做的原因很简单:均衡动作时MP2642的输入电流会周期性变化,如果主控和它共用一条电源路径,采样精度会受影响。分开供电以后,均衡开关引起的电池电压微跌就不会传导到ADC参考电压上。
整板保护方面,输入端加了反接保护和一颗慢熔保险丝,电池包正常工作时绝不会反插,但维修时总有人会犯这种错误,几毛钱换一块板子不值得。后端加了TVS管防浪涌,两串电池的储能密度不算特别高,但均衡开关的感性负载切换会产生尖峰,TVS管能兜底。主控IO口到功率部分的信号线上都加了串联电阻,防止功率侧的异常电压反馈到IO口造成单片机损伤。
4. 固件实现:状态机与均衡算法的细节
4.1 采样滤波与电芯状态判定
ADC采样看似简单,实际坑很多。均衡开关动作时电流突变,电池电压会有短暂波动,这时候采样必踩坑。我的做法是定义一个明确的采样窗口:均衡投切结束后等150ms,让所有瞬态平息,再开始采。
每个采样周期内连续采20个点,去掉最大和最小值,剩下18个取平均,这一套组合拳能把随机噪声压得很干净。两节电芯的电压按VTOP减VMID、VMID减GND分别算出来。还要把MCU内部基准电压也采一遍,用来修正VDD波动带来的误差,这一步对长期漂移非常有效。
电芯状态判定不只是看绝对电压,还要看电池包总电压是否在合理区间。电池包总电压低于6.0V或者高于8.4V时,整套均衡逻辑直接禁用,防止在异常状态下强行搬运能量。这个判定每个循环都做,不信任上次的判断结果。
4.2 均衡状态机的四个阶段
固件核心是一个四状态状态机:空闲、预充电、投切、稳定。空闲状态下系统只采样不动作,对比两节电芯压差;预充阶段打开MP2642的EN,让飞行电容充到目标电压;投切阶段先关MP2642、关闭全部开关、等待死区,再导通目标电芯对应的组合,让电容能量灌进去;稳定阶段关闭所有开关,等待电压回落,然后回到空闲循环。
typedef enum { BAL_IDLE, BAL_PRECHARGE, BAL_XFER, BAL_SETTLE } bal_state_t; void bal_loop(void) { switch (bal_state) { case BAL_IDLE: measure_cells(); if (should_balance()) { bal_charge_on(); bal_state = BAL_PRECHARGE; } break; case BAL_PRECHARGE: if (cap_voltage() >= CAP_TARGET) { bal_charge_off(); bal_switches_off(); delay_us(DEAD_TIME); bal_switches_select(bal_target_cell); bal_state = BAL_XFER; } break; case BAL_XFER: if (cap_voltage() <= bal_target_cell_voltage() + 20) { bal_switches_off(); bal_state = BAL_SETTLE; } break; case BAL_SETTLE: delay_ms(150); bal_state = BAL_IDLE; break; } }死区时间我取200µs,保证四颗开关彻底关断、电容和任何节点都断开之后,才导通目标组合。投切结束的判据是电容电压降到接近目标电芯电压,说明能量已经基本放完。这时候关断全部开关,再进入稳定期,避免电容残留电荷在下一轮充电前引起误判。
4.3 均衡结束条件与迟滞窗口
均衡不能一直跑,必须定义清晰的结束条件,否则系统会陷入“压差波动—反复均衡—再波动”的循环。我设计了三个条件:压差进入10mV以内即停止,这个精度对备用电源足够;低节电芯已经抬升到设定目标(默认4.18V,留一点缓冲避免充到4.20V触发过充保护)时停止,防止均衡器变成隐形过充器;连续均衡总时间超过预设的运行配额也强制停止,避免电芯异常时无谓地反复搬运能量。
启动阈值和停止阈值做成了迟滞窗口:压差超过25mV才启动均衡,压差降到10mV以下才停止。中间这段死区保证开关不会频繁启停。均衡运行配额我设成“运行时间不超过总时间的50%”,给电芯留出静置和电压回弹的时间。这些参数在实际调试中都值得用几个晚上慢慢磨,启停太频繁会造成开关管和电容的额外损耗。
5. 调试实录:从台架到实包的踩坑过程
5.1 台架搭建与初始测试
调试第一步不是直接上整包电池,而是用两台可调电源串联模拟两串电池。一台设为4.20V模拟高节,一台设为3.85V模拟低节,这样压差固定、内部功耗可控,遇到问题不会把电芯搞坏。模块通过USB转串口工具连接到电脑,实时看日志。示波器探在飞行电容两端和开关栅极,观察每个阶段的波形。
初始上电就遇到一个现象:MP2642输出不稳定,一会正常一会打嗝。查了一圈发现是预充电阻选太小,电容初始充电电流太大触发了芯片限流。把0.5欧串上去以后波形立刻正常。这一步验证了前面的设计判断,也说明调试台架的重要性——如果是拿真实电池组调试,这种限流打嗝可能直接引起电池保护板误动作。
5.2 典型测试数据与日志分析
台架稳定后,我记录了长时间均衡的数据。初始状态是V1=4.183V、V2=3.921V,压差262mV。均衡启动后低节电芯电压缓慢上升,高节电芯因为要给飞行电容充电也略有下降,两者相向而行。四个小时后的典型结果如下:
| 时间 | V1(高节) | V2(低节) | 压差 | 状态 |
|---|---|---|---|---|
| 0分钟 | 4.183V | 3.921V | 262mV | 均衡中 |
| 60分钟 | 4.151V | 3.963V | 188mV | 均衡中 |
| 120分钟 | 4.111V | 4.012V | 99mV | 均衡中 |
| 240分钟 | 4.058V | 4.049V | 9mV | 已收敛 |
这里有个现象值得解释:高节电芯电压也在下降,因为飞行电容充电时MP2642是从整个电池包取电,而电池包的正极在高节电芯这一侧,等效于高节电芯也在持续放电。最终两节电芯向着中间的电压值靠拢,而不是单方面抬高低节,这正是均衡该有的效果。
日志里每行包含时间戳、两节电压、压差和当前状态码,方便后期用脚本画趋势曲线。完整的UART日志片段类似:
T=0000 V1=4.183 V2=3.921 dV=262 ST=XFER T=0100 V1=4.151 V2=3.963 dV=188 ST=XFER T=0200 V1=4.111 V2=4.012 dV=99 ST=XFER T=0400 V1=4.058 V2=4.049 dV=9 ST=IDLE实测均衡过程正常,板温升稳定在6°C左右,对备用电源外壳内的小空间完全可接受。整板静态功耗约5mA,待机时也不会对电池包造成明显负担。
5.3 三个让我印象深刻的坑
第一个坑是飞行电容投切瞬间的电压跌落。第一次实包测试时,投切瞬间低节电芯电压被拉下去一大截,甚至误触发了一次欠压报警。示波器一看,是电容放电电流太大,在电芯内阻上产生了不小的压降。解决方法是控制投切前的电容目标电压不要过高,同时把预充过程做慢一点,让电容电荷相对“温和”地灌进电芯。
第二个坑是ADC采样被开关噪声污染。投切瞬间,开关管栅极驱动会向控制地注入一段干扰,即便采样窗口避开了投切时刻,传感器节点上的残影也会让某个值偶尔跳变。我加了软件上更严格的丢弃机制:投切后至少跳过三个完整采样周期,才允许刷新电芯电压缓存。
第三个坑是校准参数漂移。一开始分压电阻用了1%精度,校准完的第二天再测,误差又回到20mV以上。根源是电阻温度系数不一致,电芯工作温度稍微变化,分压比值就变了。全部换成0.1%、低温度系数的电阻后再校准,误差连续一周稳定在±3mV以内。这个教训让我明白了精密测量回路里,元件选型比算法更有决定权。
6. 常见问题速查与后续扩展
6.1 常见问题排查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 均衡启动后压差长时间不降 | 飞行电容容量太小、目标电压设置偏低、均衡配额限制过短 | 加大电容容量、调高电容目标电压、放宽运行配额 |
| MP2642发热明显 | 预充电阻太小导致充电电流过大 | 增大预充电阻,或降低开关频率 |
| 飞行电容电压充不上去 | 反馈分压错误、EN未拉高、软启动电容过大 | 检查反馈网络、测量EN电平、调小软启动电容 |
| 投切瞬间开关管损坏 | 死区时间不足,出现交叉导通 | 延长死区到200µs以上,检查栅极驱动波形 |
| 采样电压周期性跳动 | 采样时刻和投切时刻重叠 | 采样窗口避开投切,增加中值滤波 |
| 长期浮充后压差依然很大 | 均衡电流太小,维护速度赶不上漂移速度 | 升级电感拓扑,提高搬运功率 |
最后这一条尤其值得认真对待。飞行电容方案做维护型均衡够用,但如果系统经常深度放电、电芯漂移速度很快,就需要更大功率的搬运途径。
6.2 后续扩展方向
要把这个方案提升到更高功率,最自然的路线是改成双向电感均衡:用两颗半桥开关加一颗电感替代飞行电容,PIC18F47J53的PWM模块直接输出占空比控制,搬运功率能提升一个数量级。MP2642在这个升级里仍然有用,可以继续承担主控电源和预充电的职责。
如果从两串扩展到四串或更多串,飞行电容的开关组合会几何级增加,这时候更合理的是改用反激变压器或者逐个电芯扫描的思路。不过控制核心PIC18F47J53仍然够用,因为均衡本质上依然是“测量、判断、搬运、安全”这条链路的反复执行。另外,MP2642的反馈分压网络可以改成数字电位器或DAC驱动的形式,让目标电压可以在固件里按不同电芯化学体系动态调整,灵活性会大很多。
我在这个项目里最大的体会是:两串均衡虽然电路规模不大,但“测量准、判断稳、搬运可控、保护到位”四个环节一个都不能少。飞行电容拓扑胜在没有复杂的电流环,任何一环都能用示波器和日志直接验证。对备用电源这种时间充裕、稳定优先的场景来说,它虽然不是性能最强的方案,却是容错最好、最容易被调出来的方案。这套逻辑打通以后,后续换电感拓扑、扩串数、加通信,都只是在既有骨架上的自然延展。