1. 储能电池均衡的底层逻辑与方案选型
1.1 为什么串联电池组必须做均衡
先聊一个很多人踩过的坑。两组标称容量相同的电池单元串联使用,放电到截止电压时,容量低的那一颗会先到保护点,整组就被迫停止放电。充电时反过来,容量低的那颗先充满,整组又被迫停充。结果就是:整组可用容量永远被最弱的那颗电池卡住,而且随着循环次数增加,差异会越来越大,形成恶性循环。
这个现象在储能和备用电源系统里尤其致命。储能系统讲究的是循环寿命和容量利用率,备用电源讲究的是关键时刻能不能顶上去。一旦出现木桶效应,整组电池的可用容量可能只有标称值的七八成,寿命也会大幅缩短。
均衡的本质就是让串联的电池单元在充放电过程中保持荷电状态一致。被动均衡靠电阻放电把高的那颗拉下来,简单便宜但发热大、效率低;主动均衡则是把能量从高的那颗搬到低的那颗,效率高但电路复杂、成本高。对于两串电池这种小规模场景,选对均衡芯片比堆分立元件靠谱得多。
1.2 为什么选 MP2642GR-Z 这颗均衡芯片
MP2642GR-Z 是一颗专门为两串电池均衡设计的芯片,内部集成了均衡 MOSFET 和驱动逻辑,外围只需要少量阻容元件就能工作。它的核心优势在于:
- 集成度高:不需要外挂功率管,省掉驱动电路和死区控制逻辑
- 静态功耗低:备用电源系统长期挂着电池,均衡电路的静态电流直接决定待机损耗
- 控制接口简单:通过使能引脚就能控制均衡启停,配合 MCU 的 GPIO 即可实现策略控制
相比用分立 MOS 管搭 H 桥或者用通用运放做比较器方案,MP2642GR-Z 把均衡电流路径、过流保护、逻辑控制都封装好了,对于两串电池这种典型应用,开发周期能压缩一半以上。
1.3 STM32L151ZD 在系统中的角色定位
STM32L151ZD 是 ST 家的超低功耗 Cortex-M3 MCU,L1 系列主打的就是低功耗和丰富的外设。在这个方案里,它承担几个关键任务:
- 电压采集:通过 ADC 分别采集两颗电池的端电压
- 均衡决策:根据电压差判断是否需要启动均衡,以及均衡哪一颗
- 状态管理:记录均衡次数、累计均衡时间,做健康度评估
- 通信上报:通过 UART 或 I2C 把电池状态上报给上位机或主控
选 L151 而不是更便宜的 F0 系列,主要看中的是它在低功耗模式下的表现。备用电源系统大部分时间处于待机状态,MCU 如果能进 STOP 模式把功耗压到微安级,对整机待机功耗的贡献就很小。L151 在 STOP 模式下典型电流只有 1 微安左右,RTC 还能继续跑,非常适合这种场景。
1.4 整体方案架构
整个均衡系统可以拆成三层:
第一层是功率路径,MP2642GR-Z 直接跨接在两颗电池上,内部开关把能量从高电压单元转移到低电压单元。外部只需要在电池和芯片之间加限流电阻和滤波电容。
第二层是控制层,STM32L151ZD 通过 ADC 监测两颗电池的电压,用 GPIO 控制 MP2642GR-Z 的使能引脚。均衡启动和停止的阈值由固件里的逻辑决定。
第三层是保护层,包括过压保护、过温保护和欠压锁定。这些可以由 MP2642GR-Z 内部实现一部分,MCU 再补充软件层面的保护逻辑。
三层各司其职,功率层负责干活,控制层负责决策,保护层负责兜底。这种分层设计的好处是每一层都可以独立调试,出问题容易定位。
2. 硬件设计细节与关键参数计算
2.1 MP2642GR-Z 外围电路设计要点
MP2642GR-Z 的典型应用电路不复杂,但有几个地方容易翻车。
限流电阻的选择。均衡电流决定了电阻的取值。假设我们设定均衡电流为 100mA,电池电压差最大按 0.5V 算,那么限流电阻 R = 0.5V / 0.1A = 5Ω。实际选型时要留余量,选 4.7Ω 标准值。功率方面,P = I²R = 0.1² × 4.7 = 0.047W,选 0805 封装的 0.125W 电阻就够了。
但这里有个坑:均衡电流不是恒定的,它随电池电压差变化。电压差大时电流大,电压差小时电流小。所以算功耗要按最大电压差来算,不能按平均值。
滤波电容的配置。每颗电池的采样点都要加 RC 滤波,典型值 100Ω + 100nF,截止频率约 16kHz。这个频率要远低于均衡开关频率,但又不能太低导致响应迟钝。如果均衡芯片的开关频率是几百 kHz,16kHz 的截止频率能把纹波压得很干净。
PCB 布局注意事项。均衡电流路径要走宽铜皮,100mA 虽然不大,但走线电阻会引入压降,影响电压采样精度。采样线要从电池端子单独拉,不要和功率线共用走线。这是很多新手容易忽略的地方,结果就是采样值总是偏。
2.2 电压采样精度的保障措施
STM32L151ZD 的 ADC 是 12 位精度,参考电压如果用内部 1.224V,理论分辨率是 1.224V / 4096 ≈ 0.3mV。但实际精度受几个因素影响:
参考电压的稳定性。内部参考电压虽然方便,但温漂和初始精度都不如外部基准。如果对均衡精度要求高,建议外挂一颗 REF3012 之类的基准芯片,初始精度 0.2%,温漂 50ppm/°C。
分压电阻的匹配。两颗电池的采样分压网络要用同型号同批次的电阻,最好用 0.1% 精度的。普通 1% 电阻的失配会直接引入采样误差,两颗电池各偏 1%,电压差就偏了 2%,均衡判断就失准了。
ADC 采样时间的设置。L151 的 ADC 采样时间可调,采样时间太短,采样保持电容充不满,读数偏低。建议采样时间设到 239.5 个 ADC 时钟周期,给足充电时间。这个参数在 HAL 库里对应ADC_SAMPLETIME_239CYCLES_5。
软件滤波。单次采样难免有噪声,建议做 16 次滑动平均,或者用中值滤波去掉脉冲干扰。我一般用滑动平均加限幅滤波的组合,既能平滑数据,又能快速响应真实变化。
2.3 均衡阈值的设定逻辑
均衡阈值设多少合适?这个没有标准答案,要看电池特性和应用需求。
电压差阈值。常见做法是电压差超过 30mV 启动均衡,低于 10mV 停止。这个迟滞设计是为了防止在阈值附近反复启停,造成震荡。30mV 对应磷酸铁锂电池大概 5% 的荷电状态差异,对应三元锂电池大概 3%。
绝对电压保护。除了电压差,还要设绝对电压上下限。比如单颗电池超过 3.65V(磷酸铁锂)就强制停止充电并启动均衡,低于 2.5V 就停止放电。这层保护是防止过充过放,比均衡本身更重要。
温度补偿。电池电压会随温度变化,低温时内阻增大,端电压会偏低。如果系统工作温度范围宽,最好根据温度传感器读数对阈值做补偿。简单做法是温度每降 10°C,阈值放宽 5mV。
2.4 低功耗设计的实现路径
备用电源系统对功耗敏感,均衡电路和 MCU 的功耗都要抠。
MP2642GR-Z 的静态电流。这颗芯片在使能关闭时的静态电流是微安级,具体值查数据手册。如果实测偏高,检查使能引脚是不是真的拉低了,有时候 GPIO 漏电会导致芯片没完全关断。
STM32L151ZD 的低功耗模式。系统待机时,MCU 进 STOP 模式,RTC 定时唤醒做一次电压采集和均衡判断。采集和判断过程大概几百微秒,占空比极低,平均功耗可以忽略。
均衡电路的供电控制。如果 MP2642GR-Z 的供电直接从电池取,即使芯片关断,分压电阻和滤波电路还在耗电。可以在采样电阻上串一个 MOS 管,由 MCU 控制通断,只在需要采样时接通。这样待机时采样网络的功耗就是零。
3. 固件实现与均衡策略落地
3.1 系统初始化和外设配置
固件基于 STM32CubeMX 生成框架,重点配置几个外设。
ADC 配置。用两个通道分别采集两颗电池电压,扫描模式打开,连续转换关闭,由软件触发。DMA 可以不启用,因为只有两个通道,中断读取就够了。关键是校准,上电后先跑一次HAL_ADCEx_Calibration_Start(),不校准的话精度没法保证。
GPIO 配置。MP2642GR-Z 的使能引脚接在 MCU 的普通 GPIO 上,配置为推挽输出,初始电平拉低。如果芯片有状态反馈引脚,可以接一个输入 GPIO,用来检测芯片是否正常工作。
定时器配置。用一个基本定时器做均衡超时保护,比如均衡连续运行超过 30 分钟就强制停止,防止异常情况下一直均衡。这个超时值根据电池容量和均衡电流算,确保正常均衡能在超时前完成。
低功耗配置。使能 PWR 时钟,配置 STOP 模式唤醒源为 RTC 闹钟。RTC 周期设成 1 秒,每秒唤醒一次做电压采集。如果对响应速度要求不高,可以设成 10 秒甚至更长。
3.2 电压采集与滤波算法实现
电压采集的代码不复杂,但细节决定精度。
#define SAMPLE_COUNT 16 uint16_t adc_buf[2]; uint32_t voltage_sum[2] = {0}; uint16_t voltage_avg[2]; void ADC_Scan(void) { for (int i = 0; i < SAMPLE_COUNT; i++) { HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 10); adc_buf[0] = HAL_ADC_GetValue(&hadc); HAL_ADC_PollForConversion(&hadc, 10); adc_buf[1] = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); voltage_sum[0] += adc_buf[0]; voltage_sum[1] += adc_buf[1]; } voltage_avg[0] = voltage_sum[0] / SAMPLE_COUNT; voltage_avg[1] = voltage_sum[1] / SAMPLE_COUNT; voltage_sum[0] = 0; voltage_sum[1] = 0; }这段代码做了 16 次采样取平均,能有效抑制随机噪声。但要注意,每次采样前要等 ADC 稳定,HAL_ADC_PollForConversion的超时时间给 10ms 足够。
转换成实际电压值:
float get_battery_voltage(uint8_t index) { float vref = 1.224f; float divider_ratio = 2.0f; float adc_value = (float)voltage_avg[index]; return (adc_value / 4095.0f) * vref * divider_ratio; }分压比 2.0 对应两个等值电阻分压,实际值要根据电路算。如果用了外部基准,vref 换成基准电压值。
3.3 均衡控制状态机设计
均衡控制用状态机实现最清晰,三个状态:空闲、均衡中、故障。
typedef enum { BALANCE_IDLE, BALANCE_ACTIVE, BALANCE_FAULT } balance_state_t; balance_state_t balance_state = BALANCE_IDLE; uint32_t balance_start_time = 0; void balance_task(void) { float v1 = get_battery_voltage(0); float v2 = get_battery_voltage(1); float vdiff = v1 - v2; if (vdiff < 0) vdiff = -vdiff; switch (balance_state) { case BALANCE_IDLE: if (vdiff > 0.030f) { HAL_GPIO_WritePin(BAL_EN_GPIO_Port, BAL_EN_Pin, GPIO_PIN_SET); balance_start_time = HAL_GetTick(); balance_state = BALANCE_ACTIVE; } break; case BALANCE_ACTIVE: if (vdiff < 0.010f) { HAL_GPIO_WritePin(BAL_EN_GPIO_Port, BAL_EN_Pin, GPIO_PIN_RESET); balance_state = BALANCE_IDLE; } else if (HAL_GetTick() - balance_start_time > 1800000) { HAL_GPIO_WritePin(BAL_EN_GPIO_Port, BAL_EN_Pin, GPIO_PIN_RESET); balance_state = BALANCE_FAULT; } break; case BALANCE_FAULT: if (vdiff < 0.010f) { balance_state = BALANCE_IDLE; } break; } }状态机的关键是迟滞设计,启动阈值 30mV,停止阈值 10mV,中间 20mV 的迟滞带防止震荡。超时保护设 30 分钟,正常均衡不会跑这么久,一旦触发说明有问题。
3.4 低功耗模式下的任务调度
主循环里,MCU 大部分时间在 STOP 模式,RTC 每秒唤醒一次。
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC_Init(); MX_RTC_Init(); while (1) { ADC_Scan(); balance_task(); if (balance_state == BALANCE_IDLE) { HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); } else { HAL_Delay(100); } } }注意从 STOP 模式唤醒后要重新配置系统时钟,因为 STOP 模式下 HSI 是关的,唤醒后默认用 HSI 跑,需要重新切回 HSE 和 PLL。
如果均衡正在进行,就不能进 STOP 模式,因为 GPIO 状态在 STOP 下虽然保持,但没法做逻辑判断。这时候用HAL_Delay做简单延时,每 100ms 检查一次电压。
4. 调试过程中的典型问题与排查方法
4.1 均衡不启动或频繁启停
现象:电压差明明超过阈值,但均衡不启动;或者启动了但很快停止,反复震荡。
排查思路:
先量 MP2642GR-Z 的使能引脚电平,确认 MCU 有没有正确输出高电平。如果电平对但芯片不工作,查芯片供电和使能引脚的阈值电压,有些芯片的高电平阈值接近 VCC,3.3V 的 GPIO 可能驱动不了。
如果是频繁启停,多半是采样噪声导致电压差在阈值附近跳动。解决办法是加大迟滞带,或者增加采样次数。我遇到过 ADC 参考电压不稳导致读数跳变的情况,换了外部基准就稳了。
还有一种可能是均衡电流太小,电压差下降太慢,在超时前没降到停止阈值,触发超时保护后进入故障状态。这时候要检查限流电阻是不是选大了,或者电池实际容量是不是远超预期。
4.2 电压采样值偏差大
现象:万用表量电池电压是 3.30V,ADC 读出来是 3.25V 或 3.35V。
排查思路:
先查分压电阻的精度和匹配度。用 1% 电阻的话,两颗电池的采样误差可能差 2%,电压差就偏了。换成 0.1% 电阻,误差能压到 0.2% 以内。
再查参考电压。内部参考电压的初始精度一般是 ±1%,温漂也不小。如果对精度要求高,必须用外部基准。
还要查 ADC 的采样时间。采样时间太短,采样保持电容充不满,读数会偏低。把采样时间设到最大,看看读数有没有变化。
最后查 PCB 布局。采样线如果和功率线平行走线,会耦合噪声。采样线要尽量短,远离功率路径,必要时加屏蔽。
4.3 均衡时芯片发热严重
现象:均衡启动后,MP2642GR-Z 温度明显升高,甚至烫手。
排查思路:
先算功耗。均衡电流 100mA,芯片内部开关的导通电阻假设 0.5Ω,功耗就是 0.1² × 0.5 = 5mW,不应该烫。如果烫,说明电流远超设计值。
检查限流电阻是不是虚焊或阻值偏小。电阻虚焊会导致阻值变大,电流变小,不会烫;阻值偏小才会电流大。用万用表量一下电阻实际值。
还有一种可能是芯片内部开关管工作在线性区,而不是开关状态。这通常是使能电压不够导致的,芯片没完全导通,压降大,功耗就大。确认使能引脚电压达到数据手册要求的最小值。
4.4 低功耗模式下功耗超标
现象:系统待机电流比预期高很多,电池很快就没电了。
排查思路:
先断开 MCU 供电,单独量均衡电路的待机电流。如果偏高,检查 MP2642GR-Z 是不是真的关断了,使能引脚是不是被漏电流拉高了。
再单独量 MCU 的待机电流。L151 在 STOP 模式下应该是微安级,如果毫安级,检查有没有 GPIO 配置成输出高驱动外部电路,或者有外设时钟没关。
常见坑是调试串口的 TX 引脚,如果配置成推挽输出且默认高电平,外部如果接了上拉或者对端设备有漏电,会形成电流路径。把 TX 配置成开漏或者浮空输入,能省不少电。
还有 RTC 的闹钟中断,如果中断里做了太多事情,唤醒时间过长,平均功耗也会上去。中断里只做必要的标志置位,具体处理放主循环。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 均衡不启动 | 使能引脚电平不对 | 万用表量 GPIO 输出 | 检查 GPIO 配置和芯片阈值 |
| 均衡频繁启停 | 采样噪声大 | 示波器看 ADC 输入 | 加大迟滞带或增加滤波 |
| 采样值偏差大 | 分压电阻失配 | 量电阻实际值 | 换 0.1% 精度电阻 |
| 采样值偏差大 | 参考电压不稳 | 量 VREF 引脚 | 外挂基准芯片 |
| 芯片发热 | 均衡电流过大 | 量限流电阻 | 换合适阻值电阻 |
| 芯片发热 | 使能电压不足 | 量使能引脚电压 | 确认达到数据手册要求 |
| 待机功耗高 | 均衡电路未关断 | 单独量均衡电路电流 | 检查使能引脚漏电 |
| 待机功耗高 | MCU 外设未关 | 单独量 MCU 电流 | 关闭无用外设时钟 |
| 均衡超时 | 均衡电流太小 | 算均衡时间 | 减小限流电阻 |
| 均衡超时 | 电池容量过大 | 查电池规格 | 调整超时阈值 |
5. 实测数据与经验总结
5.1 均衡效果实测
用两颗 18650 电池做测试,初始电压分别是 3.85V 和 3.65V,电压差 200mV。启动均衡后,每隔 10 分钟记录一次电压。
| 时间(min) | 电池1电压(V) | 电池2电压(V) | 电压差(mV) |
|---|---|---|---|
| 0 | 3.85 | 3.65 | 200 |
| 10 | 3.82 | 3.68 | 140 |
| 20 | 3.79 | 3.71 | 80 |
| 30 | 3.77 | 3.73 | 40 |
| 40 | 3.76 | 3.74 | 20 |
| 50 | 3.755 | 3.745 | 10 |
均衡电流实测约 95mA,和设计值 100mA 接近。50 分钟把 200mV 压差拉到 10mV,对于 2000mAh 的电池来说,这个速度可以接受。如果急着用,可以把限流电阻减半,均衡电流翻倍,时间减半,但发热会相应增加。
5.2 待机功耗实测
系统进 STOP 模式后,用高精度电流表量整机待机电流。
- 均衡电路完全关断:0.8μA
- MCU STOP 模式(RTC 运行):1.2μA
- 整机待机:2.0μA
这个水平对于备用电源系统来说很理想,一颗 2000mAh 的电池,理论待机时间超过 100 年,实际受电池自放电限制,但至少不会因为均衡电路把电池耗光。
5.3 踩过的坑与经验
坑一:忽略 ADC 校准。第一批板子没做 ADC 校准,采样值普遍偏低 3%,导致均衡阈值实际偏高,均衡启动晚。后来加了校准,问题解决。
坑二:分压电阻用错封装。0603 电阻的功率裕量小,均衡时采样网络有微弱电流,电阻发热导致阻值漂移,采样值跟着漂。换成 0805 后稳定了。
坑三:STOP 模式唤醒后没重配时钟。唤醒后 MCU 用 HSI 跑,主频只有 2MHz 左右,ADC 采样时间变长,采集一次要好几毫秒。重配时钟后恢复正常。
坑四:均衡超时设太短。一开始设 10 分钟,结果大容量电池还没均衡完就超时了。后来改成 30 分钟,并且超时后不锁死,等电压差降到停止阈值以下自动恢复。
坑五:忽略电池内阻影响。均衡时电流流过电池内阻,端电压会变化。如果均衡电流大,端电压的测量值会偏离开路电压。解决办法是在均衡停止后等几秒再采样,或者用四线法测量。
5.4 后续优化方向
这套方案目前跑得挺稳,但还有几个地方可以改进。
均衡电流自适应。根据电压差动态调整均衡电流,压差大时用大电流快速拉近,压差小时用小电流精细调整。这需要 MP2642GR-Z 支持电流调节,或者用 PWM 控制使能引脚。
温度补偿更精细。目前只做了简单的阈值补偿,后续可以建电池的温度-电压曲线模型,做更精确的补偿。
健康度评估。记录每次均衡的起始电压差、均衡时间、结束电压差,长期积累后可以评估电池的一致性变化趋势,提前预警电池老化。
通信接口扩展。目前只有 UART,后续可以加 CAN 或者无线模块,方便组网和远程监控。
这套两串电池均衡方案的核心就是选对芯片、做好采样、写好状态机。MP2642GR-Z 把功率路径集成好了,STM32L151ZD 把控制和低功耗做好了,剩下的就是细节打磨。硬件上注意采样精度和功耗路径,软件上注意迟滞设计和超时保护,基本不会出大问题。