最近在做一套带储能备份功能的电源系统,遇到了一个很典型的实际问题:两节锂电池串联使用时,电池电压会越用越不均衡。第一次实测时,一组电池放了不到二十个循环,其中一节已经掉到保护电压,另一节还剩不少容量,整组系统直接罢工。这种场景在储能、UPS、太阳能备电里太常见了,如果不做均衡控制,电池组的可用容量和寿命都会大打折扣。
这篇文章就把我的实际做法展开讲讲:主控选了微芯的 PIC24FV32KA302,能量转移部分用了 MP2642GR-Z 这颗升降压控制芯片,两者配合实现对两节串联电池的主动均衡。整个过程涵盖了方案比选、硬件设计、控制逻辑、采样校准、故障排查这几个环节,适合正在做电池管理相关项目的开发者参考。内容不涉及复杂的数学推导,重点是讲清楚每一步为什么这么选、怎么做、会遇到什么坑,尽量让有单片机基础但第一次做均衡的朋友也能照着自己搭一套。
1. 均衡方案的整体设计与器件选型思路
1.1 为什么两节串联电池必须做均衡
先把这个最基础的问题讲透。锂电池串联之后,流过每节电池的电流是完全相同的,但每节电池的容量、内阻、自放电率、温度特性不可能一模一样。哪怕出厂时配对得再好,使用一段时间后,荷电状态(SOC)的差异也会越拉越大。更麻烦的是,充电时容量偏低的那节会先达到截止电压,保护板一旦触发过充保护,整组充电就停了;放电时容量偏低的那节会先跌到截止电压,又触发过放保护,整组放电也跟着停了。结果就是整组电池的实际可用容量被最弱的那节死死卡住。
这种情况放大了说就是木桶效应,但在电池组里更隐蔽一些。用户往往看到的是系统没电了、设备关机了,而根本原因是某一节电池拖了后腿。尤其在储能和备用电源场景里,系统经常处于浮充、间歇充放电的状态,均衡问题更突出。所以一个合格的电池管理方案,必须把单体电压差异控制在一个可接受的范围内,这就是均衡电路存在的意义。
1.2 被动均衡与主动均衡的取舍
均衡方案大致分两类:被动均衡和主动均衡。被动均衡简单粗暴,就是给每节电池并联一个放电电阻,充电过程中电压偏高那节会被电阻持续泄放,把多余的能量变成热量消耗掉。成本低、控制简单,但有两个硬伤:一是均衡电流不能太大,否则发热严重,一般做到几十毫安到一百毫安就到头了;二是能量被白白浪费,在储能这种对效率敏感的场景里并不划算。
主动均衡的思路完全不同。它是把能量从电压高的电池“搬”到电压低的电池,本质是能量转移而不是能量消耗,理论上效率可以做得很高。主动均衡又分多种拓扑,比如电感式、电容式、变压器式。我做的是两节串联,最适合的结构就是 buck-boost 升降压拓扑:能量可以从第一节搬到第二节,也可以反方向从第二节搬到第一节。这个拓扑结构清晰、器件少、控制起来也好理解,是两节串联主动均衡里性价比最高的方案。
MP2642GR-Z 在这里承担的就是升降压变换的核心控制。它的主要特点是内部集成了两个功率管,通过合适的电感外接就能搭成同步升降压电路,配合外部开关管和采样电路,可以实现双向的能量转移。PIC24FV32KA302 则负责整个系统的控制和监测:采集两节电池的电压、判断均衡方向、控制 MP2642GR-Z 使能、调节目标电压或者均衡电流、处理各种保护逻辑。两颗芯片一个管功率、一个管策略,配合得当的话,系统既简单又可靠。
1.3 为什么最终选了这两颗芯片的组合
先说 PIC24FV32KA302 这边。选单片机主要看几件事:AD 精度够不够、自带外设全不全、功耗和封装是否合适。PIC24FV32KA302 本身带有内置充电管理模块,虽然是给锂电池充电管理用的,但在电池电压监测和充电控制上可以复用很多功能,省掉一部分外围电路。AD 采样方面,它有 12 位分辨率的 ADC,用于电池电压采集是足够的,只要参考电压源做好,理论上分辨率可以做到毫伏级别。再加上它在低功耗模式下能保持 ADC 唤醒功能,对备用电源这种需要长期待机、偶尔工作的场景比较友好。
再讲 MP2642GR-Z。升降压控制器市面上选择不少,选择这颗的核心理由有三个:一是它支持较宽的输入输出电压范围,能够覆盖两节锂电池从 3.0V 到 8.4V 的动态区间;二是集成度高,外围器件相对较少,硬件设计压力小;三是它的控制模式适合做双向能量转移,在逻辑上配合单片机比较容易实现恒流均衡。需要说明的是,具体型号的详细电气参数要以官方数据手册为准,我这里分享的是它在两节串联均衡场景下的典型用法。
2. 硬件核心电路设计与参数计算
2.1 主功率拓扑:如何用 MP2642GR-Z 搭建双向升降压
两节电池串联时,节点定义我习惯这样叫:BAT+ 是总正极,BAT- 是总负极,中间节点叫 MID,第一节电池(Cell1)是 BAT+ 到 MID,第二节电池(Cell2)是 MID 到 BAT-。均衡的目标就是让 Cell1 和 Cell2 的电压差缩小,理想情况是两者电压基本一致,此时 MID 点电压约为总电压的一半。
双向升降压电路的连接方式如下:用一个功率电感,一端接 MID 点,另一端接开关节点(SW)。MP2642GR-Z 的开关节点通过内部控制逻辑和外部引脚配合,配合 MOSFET 组成同步整流结构,当 Cell1 电压高于 Cell2 时,能量从 Cell1 经电感泵入 Cell2;当 Cell2 电压高于 Cell1 时,能量反向流动。严格来说,MP2642GR-Z 是控制器,功率通路上的核心器件还需要按照数据手册配置外部 MOSFET 或者利用部分集成驱动能力,这个要看具体型号内部集成的程度。
我画板的时候习惯把功率回路分成三段来审查:第一段是 Cell1 正极到开关节点的回路,第二段是电感、电容组成的储能回路,第三段是 Cell2 负极的返回回路。每一段回路的面积都要尽量小,环路面积太大会带来寄生电感和辐射干扰,均衡电流大时容易出问题。
2.2 电感选型与均衡电流的确定
电感的取值直接影响均衡电流大小和开关管应力。两节电池的电压差一般不会超过几百毫伏,所以均衡器的工作状态其实是很温和的——输入输出电压很接近,占空比接近 50%,电感电流的纹波主要取决于电感值和开关频率。实际设计时,我先确定了期望的最大均衡电流,再反推电感值。
例如,设开关频率为 400kHz,输入输出压差约为 0.3V,期望均衡电流为 800mA。在降压模式下,电感的纹波电流按公式估算:
ΔI = (Vin - Vout) × D / (f × L)
这里 Vin 是高压侧电压,Vout 是低压侧电压,D 是占空比。以 3.8V 对 3.5V 为例,压差 0.3V,D 约 0.48,代入频率 400kHz,若取电感 10μH,纹波电流约为:
ΔI = 0.3 × 0.48 / (400000 × 0.00001) ≈ 36mA
这个纹波相对于 800mA 的均衡电流来说非常小,完全可以接受。实际我选的是 10μH 的功率电感,饱和电流留了 1.5 倍余量,也就是至少 1.2A 以上。电感的内阻 DCR 要尽量低,因为均衡器长期工作时,DCR 上的损耗直接就是发热量。选型时我要求 DCR 在 50mΩ 以内,实测温升可以控制在合理范围内。
如果均衡电流需要更大,可以适当降低电感值,比如取 4.7μH,纹波电流会大一些,但均值电流可以提上去。代价是电感饱和电流要求更高,开关管的峰值电流应力也更大。所以均衡电流不是越大越好,而是要根据电池容量、散热条件、PCB 面积综合确定。我的原则是:均衡电流控制在电池容量的 0.1C 到 0.2C 之间比较合适。比如 2Ah 的电芯,均衡电流取 200mA 到 400mA 足够,一味加大均衡电流对提升均衡速度的帮助有限,反而会带来发热和损耗问题。
2.3 电容、MOSFET 的选型要点
输入输出电容在这个拓扑里承担的任务是吸收开关纹波、稳定电压。因为均衡器连接的是电池,电池本身的内阻很低,但连接线缆和 PCB 走线的电感不可忽视。我在 MID 点、BAT+、BAT- 两端分别放置了 22μF 的陶瓷电容和 100μF 的电解电容组合。陶瓷电容负责高频去耦,电解电容负责低频能量缓冲。这样搭配下来,开关噪声对电池电压采样的影响可以压到很小。
MOSFET 的选型要看电压应力、电流能力和栅极驱动电压。两节电池满电时总电压 8.4V,加上开关振铃,器件耐压留到 20V 以上比较稳妥。导通电阻 RDS(on) 要低,因为均衡电流在几百毫安级别时,RDS(on) 造成的损耗占比不小。我选的是 RDS(on) 在 30mΩ 左右的低压 MOSFET,这样一对管子加起来的导通损耗可以控制在毫瓦级。如果 MP2642GR-Z 内部集成了 MOSFET,那这一步可以省不少心,只需要根据数据手册的额定电流确认余量即可。
2.4 电压采样电路与分压电阻网络
均衡控制的闭环前提是采样准确。这里我单独拿出来强调,是因为很多人第一次做均衡器,硬件焊好了、代码也写了,但均衡效果差,最后发现是采样电路的问题。
两节电池的电压采样,关键在于参考地的选择。我把 ADC 的参考地直接接在 BAT-,用两个分压电阻分别从 BAT+ 和 MID 取信号。这样 Cell2 的电压可以直接通过 MID 节点对 BAT- 分压测得,但 Cell1 的电压不能直接从 BAT+ 对 BAT- 测——那是总电压,想要得到 Cell1 电压,要么用总压减去 Cell2 电压,要么把采样参考地接到 MID 点。我第二种方法也试过,但单片机的地和功率地之间会有压差,而且随着均衡电流方向变化,压差方向也跟着变,会引入误差。所以我最终选择了:测 Cell1 时用 MID 做参考地,测 Cell2 时用 BAT- 做参考地,通过一个模拟开关切换参考地。这个做法在软件里需要做一点补偿,后面讲。
分压电阻的选值也有讲究。电阻值太大,ADC 输入端的偏置电流和采样电容充放电会造成电压跌落;电阻值太小,分压电阻自身消耗的电流又太大,对电池是持续负载。我取的是 100kΩ 和 20kΩ 的组合,分压比 6:1,对应 8.4V 输入时 ADC 引脚电压约 1.4V。这个值配合 PIC24FV32KA302 的 12 位 ADC,在参考电压为 2.048V 时,分辨率大约是 0.5mV,足够了。
3. 软件控制逻辑与核心代码实现
3.1 均衡策略:滞环控制是最稳的起点
软件部分的核心问题就一个:单片机怎么决定当前要不要均衡、往哪个方向均衡、均衡多久。最基础也最实用的策略是滞环控制。设定一个滞环窗口,比如 20mV,当两节电池电压差大于 20mV 时开启均衡,等到压差小于 5mV 时关闭均衡。这个窗口的意义在于避免反复启停——如果没有滞环,压差在阈值附近波动时,均衡器会高频开关,对 MOSFET 和电感都是考验。
另一个需要考虑的点是静置和充电状态下的均衡策略差异。静置时,电池电压基本等于开路电压,这时均衡的是真正的容量差异。充电时,电池电压包含极化电压,均衡效果会被干扰。我实际测试发现,在充电过程中做均衡,容易把电压高的那节短暂拉低,看起来均衡完成了,但停止均衡后电压又会反弹。所以我做了一套简单的状态判断:只有在无充电电流(或者电流很小)的状态下才允许执行均衡。如果系统的充放电管理也是在同一个 MCU 里,那这个条件很容易判断;如果是独立系统,就要留一个通信接口把状态传给均衡控制器。
3.2 主状态机的架构设计
软件架构我建议这样设计:系统运行在一个周期性的主循环里,每个周期执行一次采样、一次状态判断、一次控制输出。采样周期不能太快也不能太慢,太快会占用 CPU 时间而且没必要,太慢则均衡动态响应差。我取的是 100ms 一个周期。
主循环里的状态大致分为四类:
- IDLE:压差在滞环窗口内,均衡器关闭。
- BALANCE_CELL1_TO_CELL2:Cell1 电压高,能量从 Cell1 流向 Cell2。
- BALANCE_CELL2_TO_CELL1:Cell2 电压高,能量从 Cell2 流向 Cell1。
- FAULT:出现过压、欠压、温度异常等故障,停止均衡并记录状态。
这个状态机的好处是思路清晰,每个状态的行为都是确定的。后续要加新功能,比如 SOC 估算、通信上报,也只需要在 IDLE 状态里挂新的逻辑就行。
3.3 核心代码示例:ADC 采样与滤波
下面给一段简化的 C 代码,展示电压采样和滤波的核心逻辑。PIC24F 系列通常在 MPLAB X 环境下用 MCC 生成初始化代码,这里假设 ADC 和模拟开关的初始化已完成。
#define HYSTERESIS_HIGH_MV 20 // 开启均衡的压差阈值 #define HYSTERESIS_LOW_MV 5 // 停止均衡的压差阈值 #define ADC_FULL_SCALE_MV 2048 // 参考电压对应的满量程 // 用滑动平均滤波降低采样噪声 #define FILTER_TAPS 8 uint16_t cell1_buffer[FILTER_TAPS]; uint16_t cell2_buffer[FILTER_TAPS]; uint8_t filter_index = 0; uint16_t get_cell1_mv(void) { // 将参考地切换到 MID switch_ref_ground(CELL1_REF_MID); delay_us(10); // 等待参考电压稳定 uint16_t adc_raw = read_adc(CHANNEL_CELL1); uint16_t mv = (uint32_t)adc_raw * ADC_FULL_SCALE_MV / 4096; // 乘分压比 6 mv = mv * 6; return mv; } uint16_t get_cell2_mv(void) { // 将参考地切换到 BAT- switch_ref_ground(CELL2_REF_BATN); delay_us(10); uint16_t adc_raw = read_adc(CHANNEL_CELL2); uint16_t mv = (uint32_t)adc_raw * ADC_FULL_SCALE_MV / 4096; mv = mv * 6; return mv; } uint16_t moving_average(uint16_t *buffer, uint16_t new_value) { uint32_t sum = 0; buffer[filter_index] = new_value; filter_index = (filter_index + 1) % FILTER_TAPS; for (uint8_t i = 0; i < FILTER_TAPS; i++) { sum += buffer[i]; } return (uint16_t)(sum / FILTER_TAPS); }滑动平均滤波在这个场景里很实用。ADC 采样本身有噪声,加上均衡器开关时会产生一定的电磁干扰,单次采样的结果波动可能有十几毫伏,而均衡阈值是 20 毫伏量级,如果不滤波,状态机会在阈值附近来回跳。8 次滑动平均之后,采样值的稳定性好了很多,实测抖动压到了 2 毫伏以内。
3.4 均衡控制与使能逻辑
采样和滤波做完之后,进入均衡控制函数。这里补充说明一点:均衡控制不是简单的让 MP2642GR-Z 使能,而是要控制它的目标和输出电流。MP2642GR-Z 作为升降压控制器,可以通过外围的反馈电阻设置输出电压目标,也可以通过单片机的 PWM/DAC 去动态调节。更稳妥的做法是把它配置成恒流模式,由单片机给出均衡电流目标值,比如 300mA,然后用使能引脚控制启动和停止。这样软件不介入具体的电压环、电流环调节,控制难度大大降低。
void balance_control(void) { uint16_t cell1_mv = moving_average(cell1_buffer, get_cell1_mv()); uint16_t cell2_mv = moving_average(cell2_buffer, get_cell2_mv()); int16_t diff_mv = (int16_t)cell1_mv - (int16_t)cell2_mv; if (system_status == STATUS_FAULT) { disable_balancer(); return; } if (diff_mv > HYSTERESIS_HIGH_MV) { // Cell1 偏高,Cell1 -> Cell2 set_balance_direction(DIR_CELL1_TO_CELL2); set_balance_current(300); // 300mA enable_balancer(); balance_state = STATE_C1_TO_C2; } else if (diff_mv < -HYSTERESIS_HIGH_MV) { // Cell2 偏高,Cell2 -> Cell1 set_balance_direction(DIR_CELL2_TO_CELL1); set_balance_current(300); enable_balancer(); balance_state = STATE_C2_TO_C1; } else if (balance_state != STATE_IDLE) { // 压差回落到窗口内,停止均衡 disable_balancer(); balance_state = STATE_IDLE; } }这里需要注意一个执行细节:使能均衡器之后,压差不会立即缩小到窗口内,因为能量转移需要时间。如果在均衡过程中每 100ms 检查一次,压差仍大于 5mV 但小于 20mV,按照上面的逻辑,会走到 else if 分支直接关闭均衡器,这就把问题搞错了。所以正确做法是增加一个均衡运行最小时间保护,或者把关闭条件做得更聪明一点:一旦均衡器被开启,至少要持续运行比如 2 秒,之后才允许根据压差决定是否关闭。这一条我一开始没注意,导致均衡器在板子上高频启停,电感吱吱叫,MOSFET 发烫,后来加上最小运行时间保护才解决。
3.5 均衡结束条件的深入处理
仅仅比较电压差来判断均衡完成,在某些场景下不够准确。举个例子,Cell1 的容量比 Cell2 小,但内阻也小,静置时两者电压可能非常接近,系统认为不需要均衡。但一旦带载,Cell1 的端电压会被拉得更低,深度放电时 Cell1 先到欠压保护,均衡系统却没有提前介入。所以要真正做好均衡,最好引入动态参数判断,而不只是看静态电压差。
一种改进思路是记录均衡时间。如果系统持续运行了数百秒的均衡,但压差始终无法收敛到窗口内,说明电池可能存在异常(内阻增大、微短路、自放电偏大),这时候要及时上报故障而不是无限期均衡。另一种思路是在允许的条件下做静置电压比对——系统在离线状态下,或者负载断开时,分别测两节电池的开路电压差,这才是更真实的 SOC 差。
我在实际产品里加了三个结束条件:一是压差小于滞环低阈值;二是均衡时间超过最大预设值;三是任一单体电压触发了过压或欠压保护。三者任一触发都停止均衡并记录原因,便于后期分析。
4. 常见问题排查与调试经验
4.1 均衡器开启后电感异响
这个问题我遇到不止一次。电感发出可听噪声,通常是开关频率落在了可听范围内,或者控制环路产生了低频振荡。对于 MP2642GR-Z 这类控制器,如果开关频率设计在 400kHz 以上,理论上人耳听不到,但单片机通过使能引脚直接启停均衡器时,如果软件循环周期是 100ms,这个低频就是 10Hz 的方波包络,电感自然就会发出让人烦躁的吱吱声。解决方法是:不要用 GPIO 直接硬切使能端,而是让 MP2642GR-Z 保持运行状态,通过外部反馈或电流设定引脚进行软起停,把电流斜率限制住。如果硬件上做不到软起停,那就在软件里做渐变——在几十毫秒内逐步提高均衡电流指令,避免突然拉满。
另外一个可能的原因是电感本体质量问题。便宜的功率电感线圈绕制松散,在高 di/dt 下会产生机械振动。如果软件排除了问题,换用磁屏蔽电感可以解决。
4.2 采样电压跳变和漂移
采样值跳变的排查顺序是这样的:先看硬件,再看软件。硬件上重点检查分压电阻的精度和温漂,我选的是 1% 精度、温漂 50ppm 的电阻。如果用了普通的 5% 电阻,分压比误差直接导致电压计算偏差几十毫伏,均衡阈值设置得再精细也白搭。其次是检查 ADC 参考电压引脚的去耦电容,参考电压不稳,所有通道的采样都会漂。
软件上最常见的问题是参考地切换带来的毛刺。模拟开关在切换瞬间会有一个短暂的导通电阻变化,如果此时采样,读到的值就是错的。我的做法是在切换之后加延时,并且丢弃切换后的第一次采样值。还有一个细节:模拟开关的导通电阻不是零,大约有几欧到几十欧,和分压电阻串联后会引入比例误差。如果分压电阻是 100kΩ 量级,模拟开关的导通电阻相比之下可以忽略;但如果分压网络阻值比较低,这部分误差就不可忽视了,需要软件里做标定补偿。
4.3 均衡效果不明显怎么办
均衡器跑起来,讲道理压差应该收敛,但实际上很多人发现跑了一天压差还是那样。这种情况我建议从三个角度排查。
第一是均衡电流是否真的流入了目标电池。可以用电流探头或者采样电阻实测,如果设定 300mA 但实际只有几十毫安,多半是 MP2642GR-Z 的输出目标电压设置得太接近电池电压,导致压差不够,电流上不去。这里有个常识:能量转移式均衡的电流大小取决于压差和回路阻抗,压差只有 0.3V、回路阻抗 0.5Ω,那电流极限就是 0.6A,这是欧姆定律决定的,不是控制器设定的问题。所以在压差很小时,均衡电流自然下降是正常现象。想要在低压差下维持较大电流,就需要把控制模式设置为恒流源模式。
第二是均衡时间是否够长。很多人测试时只跑几分钟,看到压差没变化就认为均衡失效。两节电池的容量差异如果是 50mAh,均衡电流 300mA,理论上也需要 10 分钟搬移 50mAh 的能量,实际加上效率和滞环关闭的时间,半小时能完成已经算很快了。所以测试均衡效果至少要跑一小时以上。
第三是采样是不是根本就没做好。我曾经遇到过一版固件,分压比系数写错了,Cell1 的电压被高估了 80mV,导致系统一直朝错误方向均衡,把本来均衡的电池硬生生搬出不均衡。这里建议在调试阶段用一个外部的万用表监控 MID 点电压,和系统上报的 Cell1、Cell2 电压做实时比对,一旦发现偏差立刻检查采样链路。
4.4 故障状态与保护机制的建立
电池管理系统的故障保护比功能逻辑优先级更高。我的代码里把 FAULT 状态放在最高优先级,任何故障标志置位都会立即关闭均衡器并清空控制输出。故障源包括:单体电压超过 4.25V、低于 2.8V、温度超过 55 度、均衡电流超出设定值、控制环路异常(比如长时间检测不到反馈信号)。每个故障源对应独立的标志位和上报代码,方便后期在调试串口上定位。
特别强调一下过压保护的联动逻辑。均衡器工作时,能量从高电压电池转移到低电压电池,如果低压侧电池被充满到截止电压,均衡器应当立即停止,否则会变成“灌”电流到已经满的电芯,造成过充。这个保护不能只靠软件里的电压阈值,硬件上最好在 MP2642GR-Z 的反馈回路也做一级硬件限压。双保险的意义在于:单片机跑飞或者看门狗复位期间,硬件限压依然有效,电池安全不会悬在软件的可靠性上。
5. 调试工具、测试流程与实测数据分析
5.1 需要准备的调试工具和测试环境
均衡器调试不算复杂,但工具要备齐。数字万用表两台,一台测总电压、一台测单体电压,这是最低配置。电子负载或者功率电阻用来模拟充放电工况。示波器建议用四通道以上的,同时观察开关节点波形、电感电流波形、两路电池电压的变化趋势。电流探头如果有条件一定要用,没有的话可以用低阻值的采样电阻配合差分探头代替。
测试环境上,我建议先用可调电源模拟电池电压,而不是直接接真实电池做首次验证。可调电源的好处是可以精确设定每一节电池的电压值,人为制造任意压差,而且不会有过放、过充的风险。等控制逻辑验证稳定之后,再切换到真实电池组做长期测试。这个顺序能省去很多调试时的提心吊胆。
5.2 从空载到带载的分级测试流程
我的测试流程分四级,每一级验证通过才进下一级。
第一级是空载逻辑测试。用两台可调电源分别模拟 Cell1 = 3.9V、Cell2 = 3.6V,观察系统是否正确进入 Cell1 到 Cell2 的均衡状态,使能指示灯是否点亮,MP2642GR-Z 的开关节点是否有正常波形。这一级主要验证代码逻辑和硬件接线是否正确。
第二级是小电流均衡测试。把均衡电流设定值下调到 100mA,观察压差是否缓慢收敛,同时用万用表测量电压变化是否符合预期的能量转移方向。这一级重点是验证采样和滤波算法的稳定性。
第三级是额定电流测试。将均衡电流设定为设计值 300mA,长时间运行 30 分钟以上,用热成像仪检查电感、MOSFET、采样电阻的温升。同时观察压差收敛曲线,记录均衡速率。
第四级是真实电池组测试。用实际容量有差异的电芯串联,完整跑一次静置均衡、充电均衡、放电均衡的组合工况,验证系统在实际使用中是否稳定。
5.3 均衡过程的实测数据分析
我拿一组摸底测试的数据来说。两节电池,一节 3.92V,另一节 3.57V,压差 350mV,设定均衡电流 300mA。开始均衡后,前 5 分钟压差下降很快,从 350mV 降到 200mV 左右,这是因为能量转移初期,高压侧电池的极化电压迅速下降,表现为端电压快速走低。之后压差下降速度变慢,从 200mV 降到 50mV 用了大约 18 分钟。最后从 50mV 降到 5mV 反而又用了一段时间,大约 10 分钟。整个过程约 33 分钟压差收敛到滞环窗口内,均衡器自动关闭。
这个曲线符合预期。能量转移均衡的过程不是线性的,压差大时转移效率高,压差小时因为回路阻抗的存在,转移功率自然变低。所以在设计均衡时间指标时,不要按线性速度外推,要留足余量。另外,均衡结束后电池电压会有反弹现象,高压侧电池在停止均衡后电压会回升几个毫伏,这是电池的去极化效应,属于正常现象。因此滞环的低阈值不能设得太小,否则停止均衡后电压反弹,又会重新触发均衡,形成“均衡-停止-反弹-再均衡”的循环。
5.4 软硬件联调时值得养成的几个习惯
最后说几个调试习惯的问题。
第一个习惯是给每个调试点留测试位。我画 PCB 时会在关键节点上预留测试焊盘,比如 MID 点、开关节点、两个分压网络的输出点。调试时探针直接点上去就能测,不用从芯片引脚上飞线,方便得多。
第二个习惯是固件里预留一个调试模式。调试模式下通过串口或 I2C 实时输出两节电池的电压值、滤波前后的差值和均衡状态、使能状态。不要小看这一步,有了实时数据,定位采样漂移、状态机异常这类问题能快十倍。我甚至在正式版本的固件里也保留了调试模式,只是通过一个编译宏默认关闭,出问题时现场打开即可。
第三个习惯是日志的持久化。均衡器长期运行的数据,比如每天的均衡时长、触发次数、故障码,记录下来对电池健康度的判断非常有用。PIC24FV32KA302 的内部 Flash 可以存一部分数据,但寿命有限,更适合的做法是外挂一个 EEPROM,或者通过通信口上抛。长期数据积累之后,你就能分析出哪节电池的容量衰减速度异常,提前预警。
6. 控制端口的通信扩展与整机联动建议
6.1 与充放电管理模块的联动方式
均衡器不应该是孤岛,它必须和整个储能系统的充放电管理模块联动。最简单的联动方式是数字 IO:充放电管理模块给均衡器一个允许均衡的信号,均衡器只在允许窗口内工作。进阶的方式是通信联动:通过 I2C 或 UART 把均衡状态、单体电压、故障码上报给系统主控,主控根据整机工况决定是否调整均衡策略。
PIC24FV32KA302 自带多种通信接口,和主控通信时我优先用 I2C,因为线少、速率足够、抗干扰也还行。通信协议不用设计得太复杂,核心就是寄存器读写:主控写“允许均衡”寄存器,均衡器回报“当前压差”和“均衡状态”。把寄存器地址固定好,主控侧的驱动代码写起来很省事。
6.2 均衡策略在系统生命周期中的定位
在储能和备用电源场景里,均衡不是一个持续全速运行的功能,而是周期性维护动作。系统上电后,先完成自检和电压测量,如果压差超过阈值就进均衡状态;压差收敛后就退出均衡,回到低功耗值守状态。过一段时间再重新检查压差,如果需要再继续均衡。这种周期性机制比“一开机就均衡到底”更合理,既节省能量,也减少不必要的器件损耗。
备用电源尤其讲究待机功耗。PIC24FV32KA302 的低功耗模式在这里很关键,系统可以在休眠状态下保持 RTC 或者定时唤醒,每隔比如 10 分钟醒来一次,完成一轮电压采样和均衡判断,然后又睡回去。这个机制下,均衡器绝大部分时间是不工作的,待机功耗可以压到微安级别。
6.3 从两节扩展到更多节电池的思考
虽然这套方案是针对两节串联电池设计的,但实际项目里四节、六节甚至更多节串联的场景更常见。从两节扩展到多节,思路其实可以延续,但要注意几个变化。
首先是拓扑结构。多节串联时,相邻两节之间做双向升降压均衡是常见的做法,但相邻均衡的效率会因为“中间节点传递”而下降——能量从第 6 节搬到第 1 节,要经过多级传递,每一级都有损耗。所以多节系统通常会增加集中式均衡结构,或者采用变压器隔离的多绕组方案,整体设计复杂度会上一个台阶。
其次是采样通道和控制通道的数量大幅增加。两节电池需要 2 路电压采样,六节就需要 6 路;每个相邻均衡器需要一路 PWM 控制和一路使能控制,单片机引脚资源会很快耗尽。这时候是不是还在用单颗 MCU 做所有事情,就需要重新评估了。
第三是软件复杂度。多节电池的均衡策略不再是简单的两两比较,要选择最佳的均衡对象、设计最大均衡路径、处理均衡器之间的干扰。这些算法比两节的滞环控制复杂很多。如果是从零开始做多节均衡,建议优先考虑用电池管理 AFE 芯片做前端采样和保护,MCU 只做策略层,这样软件和硬件都能简化不少。
7. 关于这套方案的个人体会与补充
做这套两节串联均衡系统的过程中,我最深刻的体会是:均衡这件事,硬件占一半,软件占一半,但真正决定系统好不好的,是对“为什么这么做”的理解程度。单纯把芯片接对、写一段控制逻辑跑通,并不难;难的是搞清楚什么时候该均衡、什么时候不该均衡、均衡到什么程度算合格。这些判断标准如果不提前想清楚,硬件和软件做得再精细,最后系统的表现也会差一口气。
有一个反复被验证的观点是:均衡电流绝对不是越大越好。网上很多人追求大电流均衡,认为能快速拉平电压差就是高性能。但实际测试下来,均衡电流加大之后,电池的极化电压也变大,电压采样的判断失真更严重,均衡效果反而变差。而且大电流把热量带进电池本身,对电池寿命的影响可能要超过均衡带来的好处。以两节电池串联的应用来说,300mA 到 500mA 的均衡电流已经覆盖了绝大多数场景。
另外一个实用技巧是电压采样时做好“分时复用”和“参考地管理”。有人为了简化硬件,把两节电池的分压点都接到同一个 ADC 通道,用模拟开关切换。这确实能省一个 ADC 通道,但模拟开关的导通电阻和切换毛刺如果处理不好,采样的稳定性会受到很大影响。如果单片机的 ADC 通道足够,我更建议每个电压点都直接用独立通道,不切换参考地,这样软件更简单,采样也更可靠。如果引脚确实不够,再考虑模拟开关方案,但一定要做好延时和滤波。
如果你准备基于这套思路做自己的均衡器,我最后再给一个建议:先把基础版跑通,再考虑优化。所谓基础版,就是用滞环控制加固定电流,做到压差收敛、保护到位、稳定运行。基础版稳定之后,再考虑引入动态均衡策略、通信上报、低功耗优化这些进阶功能。不要一上来就把系统设计得很复杂,否则调试时出了问题都分不清是硬件问题、软件问题还是策略问题,那才是真正的时间黑洞。
这套系统的后续扩展方向也不少。比如可以通过 SOC 估算代替纯电压判断来做均衡决策,让均衡更贴近电池的真实状态;也可以在均衡完成后记录每节电池的电压走势,间接估算容量衰减情况,提前做电池寿命预测。但这些都是后话了,先把均衡本身做好,系统的底子才打得牢。