在储能和备用电源系统里,电池不一致这个话题永远是绕不开的痛点。两节串联的磷酸铁锂或者锂离子电池,出厂时性能再一致,循环几百次之后容量、内阻、自放电率都会逐渐拉开差距。最直接的后果是:整组电池的可用容量被最差的那节卡住,过放风险还总盯着一节电池。这阵子我把一套2串主动均衡方案落地了,主控用 MK20DX128VFM5,功率级用 MP2642GR-Z,专门解决这种两节串联电池组的压差问题。
这个方案的定位很清晰:不是做大功率的动力电池均衡,而是做储能/备用电源场景下那种长期浮充、电压漂移的慢速均衡。均衡电流设计在 300mA 量级,功率损耗小,控制策略灵活,整体成本也能压下来。文章把完整的硬件架构、参数计算、软件状态机和调试过程都梳理了一遍,适合正在做小容量电池管理系统、应急电源、或者想自己动手玩主动均衡的朋友参考。
1. 为什么两串电池也必须做均衡
很多人觉得两串电池太简单,随便拿个保护板就搞定了,何必上 MCU 加 DC-DC?这个想法在做短期项目时没毛病,但放在储能和备用电源场景里,问题就出来了。
1.1 串联电池不一致的根源
电池的不一致性是制造过程和运行环境共同造成的。即使同一批出厂、同一个测试工位出来的电芯,内阻也会有细微差别。电池内部化学体系的副反应速率受温度影响很大,在电池组内部,靠近发热器件的那节电池温度天然偏高,自放电率也就更大。这些差异会随着循环次数逐渐累积:内阻大、容量低的电池在充电时端压上升更快,在放电时端压下降也更快,于是出现"一节满电、一节半电"的尴尬局面。
备用电源系统还有个特殊工况:长期处于浮充状态。浮充电压通常设计在略高于电池静止电压的水平,用来补偿自放电。这时候如果两节电池容量不一致,容量小的那节会承受更高的相对过充率,电解液分解加速,内阻进一步增大,形成恶性循环。
1.2 被动均衡的局限
传统的耗散型均衡电路,本质上是给每节电池并联一个放电电阻和一个开关,检测到某节电压偏高时,把多余的能量以热的形式消耗掉。电路简单便宜,在低压小容量场景非常普及。但它的缺点同样明显:均衡电流受限于散热,通常只有几十毫安;均衡过程产生热量,在密闭的电池仓里还得考虑热管理;更关键的是,能量白白浪费掉了——对储能系统来说,效率是核心指标,把电变成热是"政治不正确"的。
1.3 主动均衡在这个场景的收益
主动均衡的核心是电荷搬移:把电压高的电池的电,搬到电压低的电池里去。一次均衡动作,电压高的降一点,电压低的升一点,能量没有浪费,效率可以做到 80% 以上。对 2 串系统来说,拓扑简单,开关器件少,成本增量不大,却能显著提升电池组的循环寿命和可用容量。我实测下来,一组新装时压差 15mV 的电池,在浮充环境下跑三个月压差能到 180mV 以上,加了这个均衡电路,压差稳定控制在 50mV 以内。
2. 系统整体架构与器件角色
整个均衡器的硬件组成并不复杂,但每个部分承担的角色要划分清楚。
2.1 系统框图里的四大功能块
- 主控单元:MK20DX128VFM5 负责电压采样、均衡判决、PWM 输出和故障保护。
- 采样单元:两节电池的电压通过分压电阻送进 MCU 的 ADC,温度通过 NTC 热敏电阻采样。
- 功率变换单元:MP2642GR-Z 构成的同步降压电路,把高电压电池的能量转移给低电压电池。
- 路径切换单元:四颗低导通电阻 MOSFET 组成的开关阵列,根据均衡方向把功率级接入正确的电池。
2.2 MK20DX128VFM5 的选型理由
MK20DX128VFM5 是 NXP Kinetis K20 系列的一颗 Cortex-M4 内核 MCU,主频可以跑到 72MHz,片上带 128KB Flash 和 32KB SRAM。选它主要看中三个点:
- ADC 资源够用。这颗芯片的 ADC 模块分辨率能做 16 位,两节电池电压采样加上两路 NTC 温度,总共 4 个模拟通道,一个 ADC 外设就全搞定了。
- 定时器灵活。FTM 模块可以产生带死区控制的 PWM,正好用来控制功率级的开关时序。
- 生态成熟。Kinetis 系列的 SDK 和低功耗库都很完善,评估板和调试工具也好找,项目初期可以快速把最小系统跑起来。
有人说 2 串均衡用 8 位单片机就够了,确实能跑,但后期如果想扩展 SOC 估算、通信告警、历史记录这些功能,8 位机的余量就比较吃紧了。M4 内核的芯片让整个系统的天花板高很多。
2.3 MP2642GR-Z 在电路中的实际作用
MP2642GR-Z 是一颗同步整流降压转换器,内部集成了高低侧 MOSFET,开关频率可以外部设定,典型工作在几百 kHz 级别。在这套均衡器里,它的角色是"能量搬运工":输入接高电压电池,输出接低电压电池,MCU 通过控制它的使能引脚和反馈基准,精确控制均衡电流。
有人可能会问:为什么均衡要用一颗完整的 DC-DC 芯片,而不是直接用电感和 MOSFET 搭?自己搭当然可以,但同步整流电源的设计对驱动时序、死区控制、环路补偿都有要求,光是要把两个 MOSFET 的开关死区调好就得花不少时间。MP2642GR-Z 把功率级和大部分控制逻辑封装好了,项目可以集中精力做均衡策略,而不是反复折腾开关电源的稳定性。
3. 核心电路设计:采样电路、开关阵列与功率级
3.1 电压采样电路:精度和隔离都要照顾到
两节串联电池的电压范围,以 2 串磷酸铁锂为例,大约在 4.8V 到 7.3V 之间。MCU 的 ADC 参考电压是 3.3V,所以不能直接采样,必须通过电阻分压把电池电压映射到 ADC 量程内。
BAT1(下节电池)的采样相对简单,正极接一个高阻分压到地,ADC 读到的就是分压后的电压。BAT2(上节电池)的采样需要留意:它的正极电压是叠加在 BAT1 之上的,高达 7.3V,同样需要分压处理。我的做法是:
- 每个电池用两颗电阻分压,上电阻 100kΩ,下电阻 20kΩ,分压比 1/6,满量程 7.3V 时 ADC 输入端约 1.217V,留足余量。
- 分压点对地并联一颗 100nF 电容,和上电阻组成一阶低通滤波,截止频率约 16kHz,可以把开关电源耦合过来的高频毛刺滤掉。
- ADC 输入端串联一颗 1kΩ 电阻,限制引脚保护二极管的电流,防止静电和过压损伤。
3.2 温度采样与保护联动
电池均衡不能只看电压,温度是另一条关键约束线。我在两颗电池表面各贴了一个 NTC 热敏电阻(10kΩ B=3950),和一颗 10kΩ 精密电阻组成分压,电压信号送进剩余的 ADC 通道。
单片机通过查表或者 Steinhart-Hart 方程把 ADC 值换算成温度。温度超过 55°C 时强制停止均衡,等温度回落到 45°C 以下再恢复。备用电源场景尤其要关注这个——电池仓通常密封,散热条件差,均衡电流虽然不大,但长时间工作也会积累温升。
3.3 路径切换开关阵列:决定能量流向
均衡方向不是固定的。可能是 BAT1 电压高需要给 BAT2 充电,也可能是反过来。MP2642GR-Z 的功率级是降压拓扑,输入电压必须高于输出电压,所以单纯把它的输入接到 BAT1、输出接到 BAT2 是不行的——BAT1 电压低的时候没法给 BAT2 充电。
我的解决方案是用四颗 P 沟道 MOSFET 组成开关阵列,根据均衡方向动态配置功率级的输入和输出:
- 均衡方向 A(BAT1→BAT2):关断 SW1、SW4,导通 SW2、SW3。此时 MP2642GR-Z 的输入接 BAT1,输出接 BAT2。
- 均衡方向 B(BAT2→BAT1):关断 SW2、SW3,导通 SW1、SW4。此时输入接 BAT2,输出接 BAT1。
这里有个关键细节:BAT2→BAT1 的工作模式是降压拓扑吗?BAT2 电压高于 BAT1,符合降压条件,输入的负极参考点是电池组的中间节点,输出的负极参考点是电池组的负极。由于两节电池的负极不是同一个节点,开关阵列必须同时切换功率级的 GND 参考。这个细节做原理图时最容易漏,漏了就会出现采样正常但均衡电流非常小的诡异问题。
3.4 MP2642GR-Z 外围电路要点
功率级的外围电路就是典型同步降压:
- 输入电容:22μF 陶瓷电容加 100nF 高频去耦,贴在芯片电源引脚附近。
- 电感:15μH,功率电感,饱和电流大于 1A。详细计算见下一节。
- 输出电容:22μF 陶瓷电容,低 ESR,保证输出电压纹波小于 20mV。
- 反馈电阻:输出电压由 FB 引脚的分压电阻设定,均衡器的输出电压目标根据目标电池的当前电压动态变化,所以反馈网络不是固定分压,而是由 MCU 的 PWM 滤波后提供基准电压,实现输出电流的闭环控制。
4. 关键参数计算:从器件选型到量化验证
4.1 均衡电流的确定
均衡电流的选择是一个平衡过程。电流太小,均衡时间长,压差可能长时间降不下来;电流太大,开关损耗和导通损耗都上升,电池的极化内阻也会消耗一部分能量。以 2 串 18650 电池组(约 2.5Ah)为例:
- 100mV 压差对应的电荷量大约是 0.1V × 2.5Ah 的等效能量,具体来说需要搬移约 0.25Wh 的能量。
- 用 300mA 均衡电流,平均电压差约 50mV,功率约 15mW,理论上一个多小时能把 100mV 压差拉到 50mV 以内。结合迟滞控制,实际均衡过程断续进行,整体时间可以接受。
- 300mA 电流下,MP2642GR-Z 和外部开关管的损耗都处在很低的水平,不需要加额外的散热片。
4.2 电感值的量化计算
电感是决定均衡电流纹波的关键元件。MP2642GR-Z 开关频率设定为 600kHz,输入电压用典型值 7.2V,输出电压 6.8V(接近均衡终点时),目标纹波电流控制在 30% 负载电流以内,即 90mA。
使用连续导通模式下的电感计算公式:
L = (Vin - Vout) × Vout / (fs × Vin × ΔIL)
代入参数:
- Vin = 7.2V,Vout = 6.8V,Vout/Vin = 0.944
- ΔIL = 0.09A
- L = (7.2 - 6.8) × 6.8 / (600000 × 7.2 × 0.09)
- L = 2.72 / 38880 = 70μH
这个值偏大。实际均衡过程中电压差最大时(例如 300mV),Vin = 7.4V,Vout = 7.1V,D = 0.959,计算出的 L 会更加大。这说明在 600kHz 下想要纹波低于 30% 负载电流,确实需要较大的电感。
如果把纹波目标放宽到 40% 负载电流(120mA),L = 2.72 / (600000 × 7.2 × 0.12) = 52μH,仍然偏大。
这里我调整了策略:不追求极低纹波,而是让均衡电流在电感允许范围内略高一些。最终选择 22μH 电感,额定饱和电流 1.2A,直流电阻低于 90mΩ。这样在常用压差范围内,纹波电流约 200mA,输出侧有足够的电容吸收,不会让电压波动影响采样精度。
4.3 输出电容的选定与计算
输出电容主要用来吸收电感纹波电流。按照降压电路输出纹波计算公式:
ΔVout = ΔIL / (8 × fs × Cout)
设纹波目标 10mV,ΔIL = 0.2A,fs = 600kHz:
Cout = 0.2 / (8 × 600000 × 0.01) = 4.17μF
考虑陶瓷电容的直流偏压特性,实际容量在 7V 偏压下可能只剩标称值的 60% 左右,所以选 22μF 标称值的 X7R 陶瓷电容,并联 100nF 高频电容吸收瞬态噪声。
4.4 开关阵列 MOSFET 的选型
开关阵列里的 MOSFET 静态导通时会流过全部均衡电流,导通损耗直接取决于导通电阻。我选了 P 沟道 MOSFET,Vgs(th) 要能被 3.3V 逻辑直接驱动,RDS(on) 在 4.5V 驱动下低于 50mΩ。
四颗 MOSFET 的导通损耗估算:I = 0.3A,RDS(on) = 50mΩ,每颗损耗 P = I²R = 4.5mW,四颗加起来 18mW,完全在安全范围内。如果误选了大封装、高阈值的功率管,不仅驱动可能不足,损耗也会高出好几个数量级。
5. 软件实现:采样滤波、均衡状态机与保护逻辑
5.1 ADC 采样与滤波:数据质量是均衡算法的地基
MK20DX128VFM5 的 ADC 支持硬件平均功能,我配置了硬件 8 次平均,再叠加软件上的中位值滤波,消除偶发的尖峰干扰。每个控制周期(100ms)内完成 4 通道采样,得到一组稳定的电压和温度数据。
软件滤波的另一个好处是可以检出异常数据。比如某次采样值突然跳变超过 100mV,多半是接触不良或者外部干扰,这时直接丢弃该周期数据,不参与均判决。避免因为一个毛刺数据触发一次错误的均衡动作——我就踩过这个坑,均衡器偶尔自己启动又自己停止,查了半天是采样线被 PWM 噪声干扰。
5.2 均衡状态机的设计
均衡控制逻辑用了一个简单清晰的状态机,四个状态:
- EQ_IDLE:无均衡需求,所有开关断开,MP2642GR-Z 禁用。
- EQ_CHARGE_BOTTOM:BAT1 电压高于 BAT2,能量从 BAT1 转移给 BAT2。
- EQ_CHARGE_TOP:BAT2 电压高于 BAT1,能量从 BAT2 转移给 BAT1。
- EQ_FAULT:温度或者电压异常,停止一切均衡动作。
状态迁移的阈值带了好几层迟滞,避免压差临界时反复切换。启动阈值设置为 50mV,停止阈值设置为 20mV,中间这 30mV 的迟滞带让均衡动作是一个"一次性收敛"的过程,而不是高频抖动。
用代码表示核心逻辑:
typedef enum { EQ_IDLE = 0, EQ_CHARGE_BOTTOM, EQ_CHARGE_TOP, EQ_FAULT } eq_state_t; static eq_state_t eq_state = EQ_IDLE; void eq_ctrl_task(void) { uint16_t raw_bat1 = read_adc_filtered(ADC_CH_BAT1); uint16_t raw_bat2 = read_adc_filtered(ADC_CH_BAT2); uint16_t raw_ntc1 = read_adc_filtered(ADC_CH_NTC1); uint16_t raw_ntc2 = read_adc_filtered(ADC_CH_NTC2); int32_t mv_bat1 = adc_to_mv(raw_bat1); int32_t mv_bat2 = adc_to_mv(raw_bat2); int32_t delta = mv_bat1 - mv_bat2; if (is_temperature_invalid(raw_ntc1) || is_temperature_invalid(raw_ntc2)) { eq_stop(); eq_state = EQ_FAULT; return; } switch (eq_state) { case EQ_IDLE: if (delta > EQ_START_MV) { eq_set_path(PATH_BAT1_TO_BAT2); eq_pwm_enable(true); eq_state = EQ_CHARGE_BOTTOM; } else if (-delta > EQ_START_MV) { eq_set_path(PATH_BAT2_TO_BAT1); eq_pwm_enable(true); eq_state = EQ_CHARGE_TOP; } break; case EQ_CHARGE_BOTTOM: if (delta < EQ_STOP_MV) { eq_pwm_enable(false); eq_set_path(PATH_NONE); eq_state = EQ_IDLE; } break; case EQ_CHARGE_TOP: if (-delta < EQ_STOP_MV) { eq_pwm_enable(false); eq_set_path(PATH_NONE); eq_state = EQ_IDLE; } break; case EQ_FAULT: if (is_temperature_valid(raw_ntc1) && is_temperature_valid(raw_ntc2)) { eq_state = EQ_IDLE; } break; default: eq_state = EQ_IDLE; break; } }这个结构看着简单,实际上已经把保护逻辑和均衡策略耦合在一起了。每个周期只需要调用一次,100ms 周期足够覆盖电池电压的缓变特性。
5.3 PWM 控制与均衡电流闭环
MP2642GR-Z 的输出电压由 FB 引脚电压控制,我通过 MCU 的 FTM 模块输出 PWM,经 RC 滤波后做参考电压。PWM 占空比越大,参考电压越高,均衡输出电压越高,均衡电流越大。
这里注意一点:均衡电流的闭环调节不需要很快,因为电池电压本身变化缓慢。我用了简单的比例积分调节器,目标是把均衡电流稳定在设定值:
void eq_current_ctrl(void) { int32_t current_error = (int32_t)eq_target_current - (int32_t)eq_measured_current; integral += current_error * 0.1f; integral = clamp(integral, -LIMIT, LIMIT); float duty = Kp * current_error + Ki * integral; duty = clamp(duty, 0.0f, 0.9f); ftm_set_duty(FTM_CH_EQ, duty); }Kp 取 0.01,Ki 取 0.05,积分限幅防止启动时占空比饱和。实测下来均衡电流在目标值的 ±20mA 范围内稳定,没有出现振荡。
5.4 开机自检与故障保护
系统上电后先做一轮自检:检查各通道 ADC 读数是否在合理范围、开关阵列驱动是否正常、MP2642GR-Z 的电源输出是否建立。自检通过后才允许均衡动作。
故障保护覆盖了这些场景:
- 电池电压超过 4.35V(锂电)或者低于 2.5V,视为过压/欠压,停止均衡并置故障标志。
- 温度超过 55°C 停止均衡,45°C 以下恢复。
- 均衡电流超过阈值 800mA,判定为硬件异常,立即关闭 PWM。
- 连续 5 个周期采样值变化超过 200mV,判定为采样链路异常,停止均衡。
6. 调测过程中的波形和数据记录
6.1 静置状态下的压差收敛过程
我在模拟项目中用两节串联的磷酸铁锂电芯做验证,初始压差 180mV(电池1偏高)。启动均衡后,每隔 10 秒记录一次电压:
| 时间(s) | BAT1 电压(V) | BAT2 电压(V) | 压差(mV) |
|---|---|---|---|
| 0 | 3.42 | 3.24 | 180 |
| 60 | 3.40 | 3.26 | 140 |
| 120 | 3.38 | 3.28 | 100 |
| 180 | 3.36 | 3.30 | 60 |
| 240 | 3.35 | 3.32 | 30 |
| 300 | 3.34 | 3.33 | 10 |
收敛速度比理论估算慢一些,主要原因是均衡过程后期压差变小,均衡电流自动回落,最后 30mV 的收尾阶段花了不少时间。这正好验证了"均衡电流随压差自适应"的设计目标,避免在大压差后期产生过冲。
6.2 开关节点波形检查
用示波器查看 MP2642GR-Z 的开关节点波形,确认没有振铃过冲和异常占空比。正常工作时,开关节点方波的上升沿和下降沿干净,死区时间内有短暂的下管续流,波形没有长时间拖尾。
调试过程中遇到过一次自举电容失效导致的高边驱动不足问题,现象是开关节点上升沿极其缓慢,均衡电流直接掉到几十毫安。换掉自举电容后恢复。这个故障很容易被误判为电感饱和,排查时要先看自举电容。
7. 常见问题与排查技巧实录
做这个项目踩了不少坑,整理成一张速查表,大家遇到类似问题时可以照着查:
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 均衡电流始终上不去 | 电感饱和导致电流波形畸变 | 用示波器看开关节点和电感电流 | 换更大饱和电流的电感 |
| 均衡电流上不去且输入电压跌落 | 电池内阻过大或支撑不足 | 万用表测开路电压和负载电压 | 检查电池接触电阻 |
| 电压采样值周期性跳动 | PWM 噪声耦合进采样链路 | 关 PWM 后观察 ADC 数据 | 增加 RC 滤波,拉远采样线 |
| 均衡动作频繁启停 | 迟滞阈值过小 | 打印压差和状态迁移记录 | 增大迟滞带,加入最小启动间隔 |
| 均衡方向切换时电流尖峰 | 开关阵列切换时序不当 | 示波器观察切换瞬间波形 | 增加切换死区,先断开再接通 |
| 上电后无法进入均衡状态 | ADC 自检误判 | 检查分压电阻和参考电压 | 校准分压系数,调整自检阈值 |
| 温度读数偏高 | NTC 分压电阻选择不当 | 对比水银温度计 | 检查 NTC 型号和串联电阻 |
| MP2642GR-Z 过热 | 电感值偏小导致开关损耗大 | 热像仪查看温升 | 增大电感或降低开关频率 |
| 均衡效率低于预期 | 开关阵列 MOSFET 驱动不足 | 检查开关管 G 极波形 | 更换逻辑电平 MOSFET |
这里特别聊聊 ADC 采样噪声的问题。均衡器工作时,MP2642GR-Z 在 600kHz 开关,功率回路里有较大的 di/dt,噪声会通过地回路和空间耦合渗透进采样电路。我的处理方式:
- 采样用的 100kΩ 上电阻直接靠近电池端子取电,缩短采样线长度。
- ADC 参考电压用独立 LDO 供电,避免和数字电路共享电源。
- 采样完成后立即启动均衡,均衡过程中不采样——反正电池电压变化很慢,不需要同时采样和控制。
这个"分时复用"的思路在小型均衡器里很实用,既省了模拟滤波器的成本,又从根本上避开了干扰窗口。
还有一个细节值得提醒:开关阵列的 MOSFET 驱动信号必须加死区。均衡方向切换时,如果路径 A 的开关还没完全关断,路径 B 的开关就导通了,等效于直接把电池正负极短路——这种故障轻则炸 MOSFET,重则把电池拉坏。我用的驱动逻辑是先全部关断,delay 10ms,再按新路径导通。10ms 对 MOSFET 来说足够长,对均衡过程来说又感知不到延迟。
8. 两点补充与个人体会
最后分享两个在实际项目中总结出来的感受。
第一个是关于拓扑选择的坚持。很多人做 2 串均衡,第一反应是"那就用 boost 充电器吧",结果发现 boost 从低电池往高电池充电时,输入和输出的接地参考问题非常棘手。我最后用了开关阵列 + 降压芯片的方案,核心逻辑是"无论均衡方向如何,功率级永远工作在降压模式,只有路径在变"。这个思路让功率级设计大大简化,MP2642GR-Z 工作在它的舒适区,环路稳定性很好调。
第二个是关于阈值设置的取舍。均衡启动阈值设得越小,均衡器工作越频繁,损耗也越大;设得太大,压差控制效果又会变差。我最终的参数是 50mV 启动、20mV 停止,这是针对备用电源浮充场景选定的。如果是快充快放的动力电池场景,这个阈值可能要放到 100mV 甚至更大,否则均衡器会在脉冲电流下频繁误动作。参数不是死的,一定要结合实际工况去调整。
这套 2 串主动均衡方案目前已经在模拟项目中跑通了,下一步的计划是加上通信接口,把均衡状态和电池数据上报给上位机,方便远程监控。硬件上预留了 UART 和 I2C 引脚,软件层面的数据协议也搭好了框架。对做备用电源和储能系统的朋友来说,电池均衡不是花哨的加分项,而是保证系统寿命和可靠性的基础功能——希望这篇梳理能给你一些参考。