前阵子给一套12 V的备用电源系统换电芯,随手测了一下两节串联磷酸铁锂的开路电压,发现差值已经超过120 mV。用了一段时间后这种差距还在扩大——充电端提前顶到过压保护,放电端又提前跌到欠压阈值。整组电池名义容量是20 A·h,实际能用的连一半都不到。问题就出在串联电池的一致性上。为了解决这个问题,我用MP2642GR-Z当作均衡开关通路,配合PIC18F47K42做电压采样和控制逻辑,搭了一套两节串联电池的主动均衡电路,在储能和备用电源场景里做了完整测试。这篇就把方案原理、参数计算、固件状态机和实测数据一起整理出来,给打算做小容量储能均衡的人一个可以直接参照的落地方案。
两节串联电池组的均衡,放在整个BMS(电池管理系统)体系里算是比较简单的场景,但简单不代表可以随便处理。电芯一旦串起来,充放电电流是同一个回路,容量小、内阻大的那颗电芯会先被充满,也会先被放空,整组的可用容量由最弱的那颗决定。均衡要做的事情,本质上就是想办法把能量从电压高的电芯搬到电压低的电芯,让它们在循环过程中保持同一个工作区间。这个项目里,MP2642GR-Z负责能量搬运的通路,PIC18F47K42负责判断何时搬运、往哪个方向搬运、搬运多少,以及何时必须停止。
1. 两个串联电池为什么要均衡:从一次备用电源的实际容量衰减说起
1.1 不一致性从哪里来
很多人以为新买的电芯一致性很好,串联起来不用管,实际上这是一个很大的误解。厂家出厂时虽然做过配组筛选,但电芯出厂后的搁置时间、存储温度、内阻变化都不一样。以我这次用的磷酸铁锂电芯为例,同一批次新电芯开路电压差可能只有5 mV以内,但循环几十次之后,容量差可以扩大到3%以上,内阻差则可能差出20%。这还只是静态差异。
动态使用场景下差异会进一步放大。串联电池组中,靠近发热元件的那颗电芯温度偏高,化学反应速率快,等效容量在低温环境下差异尤其明显;放电大电流时,内阻大的电芯压降更大,表现出更低的端电压。备用电源系统虽然平时工作在浮充状态,但市电波动会导致频繁的浅充浅放,每多一次循环,电芯之间的差异就被多累积一次。最终结果就是整组电池被最差那颗电芯拖累。
1.2 一致性失衡带来的三个直接后果
第一个后果是充电容量虚标。两节电芯串联充电,充电器检测的是总电压。当一个电芯电压已经冲到3.65 V(磷酸铁锂典型充电截止电压),另一个才3.45 V,总电压看起来还没到截止线,但过压那颗已经不能再充了。如果继续充,轻则电芯过压鼓包,重则引发安全问题。
第二个后果是放电容量提前耗尽。放电时,电压低的那颗电芯先跌到2.50 V左右的放电截止电压,控制器为了保护电芯会切断整个回路。这时候电压高的那颗电芯其实还有不少剩余能量,但整组已经放不出电了。备用电源的可用后备时间因此被严重缩短。
第三个后果是老化速度加快。电压偏高和偏低的电芯长期工作在不健康区间,SEI膜(固体电解质界面膜)会不断增厚,有效锂离子被持续消耗,容量衰减速度远高于正常电芯。这形成了一个恶性循环:差异越大,老化越快;老化越快,差异越大。
1.3 均衡的目标是什么
均衡的目标不是让两节电芯的电压完全一样,而是让它们在充放电过程中尽量保持在相近的SOC(荷电状态)区间。电压只是SOC的表征量,受电流、温度影响很大,但工程上最方便的做法还是以电压作为控制闭环的输入。
具体到我的设计目标:静态电压差控制在15 mV以内,充放电过程中的动态电压差控制在30 mV以内,均衡开启后系统短时间内能把120 mV的压差收敛到可接受范围。这个指标对两节串联的小型储能系统来说,已经能显著提升可用容量。
2. MP2642GR-Z与PIC18F47K42的角色分工:均衡通路与控制大脑
2.1 MP2642GR-Z承担的均衡通路功能
MP2642GR-Z在这里不是传统意义上那种纯模拟的均衡芯片,而是一个集成了双向开关网络的均衡通道控制器件。它内部包含开关电容均衡所需的多组功率开关管以及对应的驱动逻辑,通过外部的均衡储能电容配合,把一节电芯的能量搬到另一节电芯。MCU只需要给出方向和时间控制信号,不需要自己去驱动大功率MOS管,这大大简化了外围设计和固件复杂度。
这块芯片的主要工作流程是:先连通高电压电芯与储能电容,让电容充电至接近该电芯电压;然后断开连接,将储能电容切换到低电压电芯一侧,让电容放电给低电压电芯。这样一个完整的搬运动作完成后,高电压电芯能量被转移了一部分到低电压电芯。重复这个过程,两节电芯的电压就会逐渐收敛。
这里要特别说明的是,MP2642GR-Z内部开关管的导通电阻、开关速度这些参数决定了均衡电流的上限。实测下来,使用47 uF储能电容、开关频率约5 kHz时,这个通路的平均均衡电流只有几十毫安级别。这个量级对于几安时到二十安时容量的电池组是合适的,不会因为均衡电流过大导致电芯发热严重。
2.2 PIC18F47K42负责的采样与控制逻辑
PIC18F47K42是Microchip的8位MCU,内部集成了12位ADC、两个可配置逻辑单元CLC、数值振荡器NCO以及多个高分辨率PWM模块。在这个项目里,我主要用到它的12位ADC做电压采样,用定时器实现均衡时序控制,再用通用IO加内部硬件比较器做保护判断。
选这颗片子主要原因有三点:一是12位ADC对磷酸铁锂电芯电压采样的分辨率足够,参考电压选内部1.024 V时,理论上1 mV内的分辨率可以做到;二是它内部有CLC,可以把某个IO引脚的异常电平直接映射为PWM输出封锁,实现硬件级的快速保护;三是这颗MCU的功耗很低,在备用电源这种常年在线待机的场景里,不会给电池系统增加太多静态功耗负担。
2.3 系统信号流与整体架构
整个系统的信号链路是这样的:两节串联电芯的电压先经过电阻分压网络降到MCU ADC可接受的范围,再经过RC低通滤波进入PIC18F47K42的ADC引脚。MCU周期性采集两节电芯电压,计算压差,判断均衡方向,输出PWM时序控制信号给MP2642GR-Z。MP2642GR-Z根据这个时序打开内部开关桥,配合储能电容完成能量搬运。同时,MCU还监控电芯的过压、欠压和温度状态,任何异常都立即停止均衡并进入保护状态。
电路的电源设计上,MCU由第一颗电芯或者整个电池组电压通过低压差LDO降压供电,我实际用的是整组电压降压,这样即使某一节电芯电压偏低,控制电路也能正常工作,不会因为低压一节电芯导致MCU掉电而失去监控能力。
3. 均衡电路设计与参数计算:从拓扑到元器件取值
3.1 开关电容主动均衡的基本原理
这次选用的均衡方案是开关电容式主动均衡,基本原理可以用一个生活中的类比来理解:两节电芯就像两个水位不同的水杯,储能电容就像一只舀水的小碗。先用小碗从高水位的水杯舀水,然后把小碗端到低水位的水杯倒进去,反复操作,两杯水的水位就慢慢拉平了。
电路层面,这个"小碗"就是外部储能电容C。MP2642GR-Z内部的两组开关S1/S2负责把电容接到电芯A,S3/S4负责把电容接到电芯B。控制时序上,先闭合S1/S2让电容充电,此时充电电流从高压电芯流向电容;经过一定充电时间后断开S1/S2,闭合S3/S4,电容向低压电芯放电。两个阶段之间存在死区时间,防止上下桥臂直通烧毁开关管。
开关电容均衡的效率主要由电容容量、开关频率和开关导通压降决定。电容容量越大,单次搬运能量越多;开关频率越高,单位时间内搬运次数越多,但开关损耗也随之增大。实际参数选取需要在这两者之间找平衡。
3.2 储能电容容量的选取依据
储能电容C的容量直接决定了单次均衡搬移的能量。单次搬运能量近似可以用公式表示:E = 0.5 × C × (V_high² - V_low²)。以V_high=3.35 V、V_low=3.23 V、C=47 uF计算,单次搬运能量大约为18.6微焦。一个完整的切换周期假设为200微秒(5 kHz频率),平均均衡电流大约就是93 mA。
这里要注意,储能电容如果用陶瓷电容,直流偏压会导致有效容值下降。47 uF的X7R陶瓷电容在3.3 V直流偏压下,实际容值可能只剩标称的50%左右,所以我在实际板上用的是一只聚丙烯薄膜电容,容值和ESR特性都更稳定。对成本更敏感的方案也可以用多个陶瓷电容并联,但设计时一定要按降额后的容值计算,否则均衡电流会远低于理论值。
3.3 电压采样链路:分压、滤波与ADC
PIC18F47K42的ADC参考电压选内部1.024 V,所以电芯电压不能直接进ADC引脚。我用两个电阻组成分压网络,分压比为约11:1:串联采样端用一个100 kΩ电阻、对地用9.1 kΩ电阻。电芯电压3.5 V时,ADC引脚电压约287 mV,留出了足够余量,不满量程也不至于过压损坏引脚。
分压电阻之后加了一级RC滤波,电阻100 Ω、电容0.1 uF,截止频率约16 kHz。这级滤波的作用有两个:一是滤掉均衡开关切换时耦合到采样线上的高频毛刺,二是给ADC采样电容提供充电电荷,减小采样稳定时间。不过RC滤波器有个副作用就是建立时间变长,每次切换均衡方向后需要等待至少5倍时间常数,也就是约50微秒再采样,否则读到的电压会偏小。
ADC采样策略方面,每路电压连续采8次,去掉最大最小值后取平均,等效于一个简单的数字滤波器。这个做法能有效抑制开关切换瞬间的偶发尖峰,实测ADC读数波动从约20 mV降到了2 mV以内。
3.4 PWM时序:死区、频率与均衡方向
均衡方向的切换时序是整个控制逻辑的核心。我使用的是三段式时序:充电阶段、死区阶段、放电阶段。
- 充电阶段:MP2642GR-Z内部S1/S2导通,储能电容接高压电芯,持续时间约90微秒。
- 死区阶段:所有开关断开,持续约10微秒,确保开关管完全关断后再切换,防止直通。
- 放电阶段:S3/S4导通,储能电容接低压电芯,持续时间约90微秒,然后再次进入死区。
这个周期总时长约200微秒,对应5 kHz的开关频率。死区时间的设置有一个容易被忽略的细节:MP2642GR-Z的开关管存在关断延迟,10微秒看起来很长,但如果驱动电路加了外部栅极电阻,关断时间会被拉长,死区时间需要根据实测门极波形重新调整。我在样机上用示波器观察了开关节点波形,确认死区期间节点电压没有交叠才定下最终参数。
4. 均衡控制固件:状态机、判定条件与保护逻辑
4.1 均衡状态机的设计
固件部分采用状态机结构,把均衡过程拆成几个明确的状态,每个状态内部做固定动作,状态之间的跳转由电压采样结果和定时器事件驱动。
- 空闲状态(IDLE):周期性采样电芯电压,计算压差。压差低于均衡阈值时不动作。
- 反向准备状态(PREP):确定高压电芯和目标低压电芯,完成储能电容初始充电方向判断。
- 搬运循环状态(BALANCING):按固定时序连续执行充电-死区-放电循环,每个循环后更新电压记录。
- 暂停判定状态(CHECK):每个搬运循环结束后短暂停止,重新采样电压,判断是否需要继续。
- 保护停止状态(FAULT):检测到过压、欠压、过温或通信异常,立即关闭均衡通路并锁定。
状态机的好处是逻辑清晰,不会出现"上一帧还在充电,这一帧突然切换到另一个方向"这种竞态问题。每个状态的进入和退出都有明确的触发条件,调试时也容易定位问题出在哪一步。
4.2 均衡判定逻辑与阈值
均衡判定的核心参数是压差阈值和滞回区间。我设置压差大于30 mV时启动均衡,当压差收敛到15 mV以下时停止均衡,中间留了15 mV的滞回区。这个滞回设计很关键,如果没有它,系统会因为采样噪声而频繁启停均衡,造成开关管不必要的损耗。
另一个判定逻辑是均衡方向钉扎。例如电芯A电压高于电芯B,系统持续把能量从A搬到B。如果中途B电压反超A,系统会在下一个CHECK状态把方向反过来。为了防止在压差接近零时频繁换向,我加了换向冷却时间:一个方向至少持续2秒,期间即使压差反超也不换向,除非压差超过50 mV的强制换向阈值。
4.3 保护逻辑与异常处理
均衡系统首先要保证安全,其次才是效率。保护逻辑分三级:
第一级是过压保护。磷酸铁锂电芯充电电压超过3.65 V时,均衡必须让位给充电保护,甚至主动停止。因为此时电芯已经接近满电,继续把能量搬入这颗电芯只会加剧过压。
第二级是欠压保护。电芯电压低于2.50 V时,整组电池处于放空状态,均衡没有意义。MP2642GR-Z的均衡通路如果继续工作,还会白白消耗剩余能量,所以必须立即关闭。
第三级是过温保护。我用一颗NTC热敏电阻贴在电芯侧面,通过MCU ADC读取温度。均衡过程中储能电容和开关管都会发热,如果电芯表面温度超过55 ℃,系统会暂停均衡并保留报警状态,等温度回落再恢复。
另外还有一个容易被忽略的保护点是均衡超时保护。如果连续均衡30分钟压差仍然没有明显收敛,固件会判定为电芯异常并停止均衡,避免长期在异常状态下满负荷工作。这个逻辑起初没加,后来在一次实验中发现有一颗电芯内阻异常大,均衡电流被限制到几乎为零,整个系统空转了将近一小时才被人工发现。
4.4 固件代码框架示意
这里给出核心控制流程的伪代码,实际工程代码在这个框架上扩展了日志记录和参数配置部分。
typedef enum { IDLE, PREP, BALANCING, CHECK, FAULT } balance_state_t; balance_state_t state = IDLE; uint16_t adc_cell_high = 0; uint16_t adc_cell_low = 0; void balance_task(void) { switch (state) { case IDLE: sample_cell_voltages(); if ((adc_cell_high - adc_cell_low) > BALANCE_START_THRESHOLD) { state = PREP; set_balance_direction(adc_cell_high > adc_cell_low); } break; case PREP: enable_balance_circuit(); start_timer(BALANCE_CYCLE_US); cycle_count = 0; state = BALANCING; break; case BALANCING: if (timer_expired) { if (cycle_count++ >= MAX_CYCLES_PER_CHECK) { state = CHECK; } } break; case CHECK: disable_balance_circuit(); delay_ms(50); sample_cell_voltages(); if (voltage_diff < BALANCE_STOP_THRESHOLD) { state = IDLE; } else if (voltage_diff > BALANCE_START_THRESHOLD) { set_balance_direction(adc_cell_high > adc_cell_low); state = BALANCING; } else { state = IDLE; } break; case FAULT: disable_balance_circuit(); break; } }代码里有个细节:每次进入CHECK状态前,必须先关闭均衡电路并等待至少50毫秒,让储能电容两端的残余电压通过泄放电阻释放掉,然后重新采样电芯电压。如果不等待,采样结果会被电容残压干扰,得到明显偏高的读数,进而导致错误的均衡方向判断。
5. 实测验证与现场调试:样机上的现象、数据与调整
5.1 测试条件与负载场景
样机搭建完成后,我把系统挂在一组两节串联的磷酸铁锂电芯上做验证。电芯容量20 A·h,拆机时间较长,初始电压差有明显偏差。测试环境是模拟备用电源典型工况:用电子负载做0.5 C放电循环,充电使用恒流恒压模式,整组电压上限7.3 V,单节保护阈值3.65 V。
均衡系统在充放电过程中持续工作。需要说明的是,均衡并不能阻止电芯在工作过程中出现瞬时压差上升——大电流放电时,内阻差异导致的动态压差可以达到80 mV,均衡电流只有百毫安级,根本追不上电流变化。均衡真正的效果体现在静置态和充电末期的电压收敛速度上。
5.2 均衡前后的数据对比
我做了两组对照测试,一组均衡开启,一组均衡关闭。初始条件都是两节电芯开路电压差约110 mV。
| 参数 | 均衡关闭 | 均衡开启 |
|---|---|---|
| 初始压差 | 110 mV | 115 mV |
| 静置8小时后的压差 | 105 mV | 20 mV |
| 充满电时最大压差 | 160 mV | 45 mV |
| 放空时最小单节电压 | 2.42 V | 2.56 V |
| 整组可用容量 | 9.4 A·h | 17.2 A·h |
实测结果很直观:均衡开启后,静置压差收敛到20 mV左右,充放电末期的动态压差控制在45 mV以内,整组可用容量从9.4 A·h提升到了17.2 A·h。这个提升幅度说明均衡对老旧电芯的容量用满效果非常明显。
5.3 调试中踩过的三个坑
第一个坑是ADC读数在均衡切换瞬间跳变。起初我以为是MP2642GR-Z的开关噪声耦合进了采样线,后来用示波器抓波形发现,问题出在采样时刻和PWM切换时刻重叠。储能电容切换瞬间会在电芯端产生一个短暂的低频扰动,如果恰好在这个窗口采样,读数会偏移20毫伏以上。解决办法是把ADC采样时间放在PWM周期的固定相位上,也就是切换到放电状态结束后的稳定窗口,并且连续采样多次取中值。
第二个坑是储能电容在磷酸铁锂高压端的有效容值下降。最初我用22 uF陶瓷电容并联做储能电容,参数计算时按22 uF算,实测均衡电流比理论值低了近一半。原因是陶瓷电容在直流偏压下容值衰减严重。换成标称22 uF的C0G介质电容或薄膜电容后,实测均衡电流恢复到理论值。这个教训是:凡是涉及能量传输的电容,一定要看介质特性和直流偏压特性,不能只看标称容值。
第三个坑是开关节点振铃导致偶尔的直通风险。MP2642GR-Z开关切换瞬间,储能电容的充电回路寄生电感和开关管结电容形成LC振荡,在开关节点上看到明显的振铃波形,幅度一度超过电芯电压。虽然芯片内部有保护电路没有烧坏,但振铃代表了额外的开关损耗。我在开关节点对地并联了一组RC吸收电路,电阻2.2 Ω、电容1 nF,振铃幅度明显衰减,同时把PWM频率从5 kHz降到4 kHz,开关损耗进一步降低。
6. 从两节到更多串联:这套方案的扩展思路与改进空间
6.1 扩展到四节、八节串联的思路
两节串联是最基础的场景,但在实际储能项目中,4节、8节串联更常见。这套方案横向扩展时有一个简单的思路:对相邻电芯对各做一个开关电容均衡通道,例如4节串联需要3个均衡通道,分别均衡电芯1-2、电芯2-3、电芯3-4。相邻通道共享中间电芯,所以控制逻辑上必须增加时序仲裁,不能让两个通道同时对同一颗电芯做均衡,否则等效于两个储能电容并联,搬运路径会乱。
我尝试过在一个PIC18F47K42上跑多通道均衡,MCU的资源完全够用,但PCB面积和开关器件的成本会明显增加。工程上更合理的折中是减少储能电容的容量,降低单通道均衡电流,这样开关器件可以用更小封装的型号,整体体积和成本都更好控制。
6.2 效率优化方向:从开关电容到电感式均衡
开关电容均衡的优点是结构简单、可靠性高,但天然有两个短板:一是能量搬运是离散的,电容充放电过程中存在原理性的能量损耗;二是均衡电流受电容容量和开关频率限制,难以做大电流均衡。如果后续项目需要更大的均衡电流或者更高的能量利用率,可以改用双向反激变换器或电感式均衡拓扑。
电感式均衡用磁能做中间储能介质,能量利用率可以做到80%以上,均衡电流也可以做到安培级。不过控制逻辑和磁性元件设计复杂度会大幅上升,对MCU的PWM分辨率要求也更高。我的建议是:2到3节串联的紧凑型产品用开关电容方案,成本和可靠性优先;4节以上或者单体容量较大的系统,再考虑电感式方案。
6.3 这套方案值得保留和舍弃的部分
值得保留的是PIC18F47K42的12位ADC配合合理的采样时序,加上状态机控制逻辑。这套组合让均衡控制变得非常直观,调试时每步都能通过串口打印看到当前状态和电压数据,排查问题效率很高。
值得改进的是温度保护的位置。NTC贴在电芯表面,测的是电芯温度,但均衡开关管和储能电容的发热才是影响均衡持续工作的关键。后来我在MP2642GR-Z附近也加了一颗NTC,用于监测器件温度。两个温度点分开保护,逻辑上更完善。
还有一点是均衡电流的自适应设计。当前固件是恒定PWM频率跑均衡,不管压差多大都一个节奏。实际上压差大时可以用更高的开关频率或更大的占空比来加快能量搬运,压差小时放慢节奏以减少开关损耗。这个优化我在最新一版固件里已经加上了,效果是在压差120 mV时收敛时间缩短了约30%。
最后说一个我从这个项目里体会最深的事情:均衡不是万能的。它能把可用容量找回来,但找不回电芯本身的健康度。一颗已经衰减到60%容量的电芯,均衡之后整组容量仍然由它决定,只是不再浪费另一颗好电芯的电量而已。所以做均衡系统设计时,一定要把保护逻辑和均衡放在同等重要的位置——均衡做得好是锦上添花,保护做得好才是保命底线。这套两节串联的均衡方案,目前已经在我那套备用电源系统里跑了三个月,静置压差基本稳定在15毫伏以内,充放电过程的动态压差也没再超过50毫伏,整体表现我可以接受。如果你也在做类似的小容量储能均衡,可以直接拿这个方案做起点,从两节开始验证逻辑,再逐步扩展生产,会省掉不少弯路。