1. 储能电池均衡的底层逻辑与方案选型
1.1 为什么串联电池组必须做均衡
先聊一个最容易被忽略的事实:两节标称容量完全一致的电池,串联使用半年后,端电压差可能拉到 100mV 以上。这不是电池质量差,而是制造公差、温度梯度、自放电率差异共同作用的结果。串联回路里电流处处相等,容量小的那节会先被充满、也先被放空,长期处于过充过放状态,内阻加速上升,容量衰减更快,最终整组可用容量被最弱的那节电池锁死。
储能系统和备用电源对这件事尤其敏感。备用电源平时浮充、偶尔放电,电池长期处于高 SOC 区间,均衡做不好,浮充电流会持续在电压偏高的那节上产生析气或加速老化;储能系统每天一充一放,循环次数动辄几千次,不均衡带来的容量损失会被循环放大。所以均衡不是可选项,是串联电池组的基本功。
1.2 被动均衡与主动均衡的取舍
被动均衡靠电阻放电,把电压高的那节多余的能量以热的形式消耗掉。优点是电路简单、成本低、可靠性高;缺点是能量白白浪费,均衡电流通常只有几十到几百毫安,大容量电池组均衡一次要很久。主动均衡把能量从高电压节搬到低电压节,效率高、速度快,但拓扑复杂,变压器、电感、开关管一堆,成本和故障率都上去了。
这个项目选的是被动均衡路线,用 MP2642GR-Z 这颗模拟前端配合 PIC18F85K22 做控制。为什么这么选?两节串联、储能和备用电源场景,均衡电流需求通常在 100mA 到 500mA 量级,被动均衡完全够用;而且被动均衡没有能量搬运的环路稳定性问题,在长期无人值守的备用电源里,可靠性比效率更重要。这是典型的工程取舍——不是最先进的就是最好的,是最匹配场景的才是最好的。
1.3 MP2642GR-Z 与 PIC18F85K22 的分工
MP2642GR-Z 是一颗面向多节电池管理的模拟前端,负责电池电压采集、均衡开关驱动、以及必要的保护逻辑。它把高压侧的电池和低压侧的控制逻辑隔离开,MCU 不用直接碰电池高压,安全性好很多。PIC18F85K22 是 Microchip 的 8 位 MCU,带 12 位 ADC、多路 UART/SPI/I2C、硬件定时器资源丰富,跑均衡策略、做状态机、跟上位机通信都够用。
分工很清晰:MP2642GR-Z 干"脏活累活"——采电压、开均衡管、做硬件级保护;PIC18F85K22 干"脑力活"——判断哪节需要均衡、均衡多久、什么时候停、怎么上报状态。这种模拟前端加 MCU 的架构,是电池管理系统里最经典也最稳的组合。
提示:选型时不要只看均衡电流这一个参数。模拟前端的电压采集精度、均衡开关的导通电阻、以及它和 MCU 之间的通信接口是否够简单,都会直接影响你后面调试的工作量。
2. 硬件链路拆解与关键参数计算
2.1 两节串联的电压采集链路
两节串联,电池组总压是两节之和。MP2642GR-Z 对每节电池做单端采集,C0 接电池组负极,C1 接两节中间节点,C2 接电池组正极。这样 C1-C0 是下节电压,C2-C1 是上节电压。采集精度直接决定均衡判断的准确性,如果采集本身有 20mV 误差,那均衡阈值设 30mV 就没有意义了。
采集链路里有两个坑。第一是分压电阻的匹配,如果前端用了外部分压,两颗电阻的温漂要一致,否则温度一变,两节读数一起偏,差值反而被放大。第二是采样时刻,均衡开关导通时电池上有放电电流,此时采到的电压会比真实开路电压低,所以要么在均衡关断的间隙采样,要么对采样值做电流补偿。MP2642GR-Z 内部一般有采样保持和时序控制,用之前一定要把数据手册里的采样时序图看清楚。
2.2 均衡电阻与均衡电流的计算
被动均衡的核心就是一个电阻加一个开关管,并联在每节电池两端。均衡电流由电池电压和回路总电阻决定:
I_bal = V_cell / (R_bal + R_switch + R_trace)
假设单节电压 3.7V,希望均衡电流 200mA,开关管导通电阻 0.5Ω,走线电阻忽略,那么:
R_bal = 3.7V / 0.2A - 0.5Ω = 18.5Ω - 0.5Ω = 18Ω
取标准值 18Ω。这时候电阻上的功耗是:
P = I² × R = 0.2² × 18 = 0.72W
所以至少要选 1W 的电阻,留足余量选 2W 更稳。如果两节同时均衡,总功耗 1.44W,PCB 上这两颗电阻的布局要隔开,别挨着温度敏感器件。
均衡电流不是越大越好。电流大,均衡快,但发热大、对电池的瞬时负载重,而且备用电源场景里电池容量往往不大,200mA 已经能在几小时内拉平常见的不均衡。我一般建议按电池容量的 1% 到 2% 来估均衡电流,比如 10Ah 的电池,100mA 到 200mA 就够。
2.3 开关管与驱动细节
均衡开关管用 N-MOS 还是 P-MOS,取决于它接在电池的高侧还是低侧。低侧 N-MOS 驱动简单,栅极电压参考电池负极,但要注意上节的负极是浮地的,驱动信号必须经过电平转换或者用 MP2642GR-Z 内部的均衡驱动输出。MP2642GR-Z 这类前端通常直接提供均衡开关的栅极驱动,你只需要外接 MOS 和电阻,省掉自己搭电平转换的麻烦。
MOS 选型看三个参数:Vgs(th) 要低,保证电池电压下降时还能可靠导通;Rds(on) 要小,减少额外压降;封装散热要够。别用那种 Rds(on) 随温度飙升的管子,均衡做久了结温上来,电流会明显缩水。
2.4 供电与隔离
PIC18F85K22 的供电不能直接从电池组取,因为电池组电压会随充放电大幅波动。常规做法是从电池组经过一颗宽压输入的降压芯片,稳到 3.3V 或 5V 给 MCU。MP2642GR-Z 自己一般也有一路供电输入,注意它的供电范围和 MCU 是否共地。如果电池组负极和系统地在某些拓扑里不是同一个点,通信线上要做隔离,否则会烧接口。
3. 均衡策略与固件实现
3.1 均衡触发条件的设计
最简单的策略是电压差超过阈值就均衡。但阈值怎么定?定太低,电池正常波动就触发,均衡开关频繁动作,白白发热;定太高,不均衡已经积累到影响容量了才动手。经验值是 20mV 到 50mV 之间,储能场景取 30mV 左右比较平衡。
但只看电压差不够。电池在充电末期电压上升快,两节差 30mV 可能只是充电状态不同步,等静置一会儿就自己拉平了。所以更稳的策略是加时间条件:电压差持续超过阈值达到一定时间(比如 30 秒到几分钟)才启动均衡,避免误触发。放电末期电压下降快,同理。
还有一个细节:均衡只在电池相对静止或者小电流状态下做效果最好。大电流充放电时,内阻差异造成的电压差会掩盖真实的 SOC 差异,这时候均衡等于在跟负载电流较劲,效率很低。所以固件里最好判断一下当前电流,超过一定值就暂停均衡。
3.2 状态机与均衡时序
固件主体是一个状态机,我习惯分成这几个状态:空闲、采样、判断、均衡、冷却、故障。上电后先采样,读两节电压,算差值,判断是否满足均衡条件。满足就进入均衡,打开对应那节的均衡开关,同时启动一个均衡计时器。均衡过程中定期采样,如果电压差降到阈值以下,或者均衡时间超过上限,就关断开关,进入冷却,等一会儿再重新采样,防止开关频繁通断。
均衡时间上限很重要。如果某节电池内阻异常大,或者均衡回路有问题,电压差可能一直降不下来,没有上限的话均衡开关会一直开着,电阻持续发热,有安全隐患。我一般设单次均衡不超过 10 到 30 分钟,到点强制关断,冷却几分钟再判断。
// 均衡状态机核心逻辑示意(伪代码,基于 PIC18F85K22 常见写法) typedef enum { BAL_IDLE, BAL_SAMPLE, BAL_JUDGE, BAL_ACTIVE, BAL_COOLDOWN, BAL_FAULT } bal_state_t; void balance_task(void) { static bal_state_t state = BAL_IDLE; static uint16_t bal_timer = 0; uint16_t v_top, v_bot, v_diff; switch (state) { case BAL_IDLE: state = BAL_SAMPLE; break; case BAL_SAMPLE: v_top = afE_read_cell(1); // 读上节 v_bot = afE_read_cell(0); // 读下节 v_diff = (v_top > v_bot) ? (v_top - v_bot) : (v_bot - v_top); state = BAL_JUDGE; break; case BAL_JUDGE: if (v_diff > BAL_THRESHOLD_MV && current_is_low()) { if (v_top > v_bot) { afE_enable_balance(1); // 均衡上节 } else { afE_enable_balance(0); // 均衡下节 } bal_timer = 0; state = BAL_ACTIVE; } else { state = BAL_IDLE; } break; case BAL_ACTIVE: bal_timer++; if (v_diff <= BAL_HYST_MV || bal_timer > BAL_MAX_TIME) { afE_disable_balance(0); afE_disable_balance(1); bal_timer = 0; state = BAL_COOLDOWN; } break; case BAL_COOLDOWN: bal_timer++; if (bal_timer > BAL_COOLDOWN_TIME) { state = BAL_SAMPLE; } break; case BAL_FAULT: afE_disable_balance(0); afE_disable_balance(1); break; } }这段代码里有个迟滞(hysteresis)的概念,BAL_HYST_MV 比 BAL_THRESHOLD_MV 小一些。启动均衡用大阈值,停止均衡用小阈值,中间这段差值就是迟滞带,防止电压在阈值附近抖动导致开关反复通断。这是所有带开关的控制系统都要注意的点。
3.3 与模拟前端的通信
MP2642GR-Z 和 PIC18F85K22 之间通常走 I2C 或 SPI。I2C 省引脚,但速率低,如果采样频率要求高就不够;SPI 快,但多两根线。两节电池的场景,采样频率要求不高,I2C 完全够用。
通信这块最容易出问题的是时序和地址。I2C 从机地址如果配错,读出来全是 0xFF 或者 0x00,很多人第一反应是硬件坏了,其实是地址没对上。还有上拉电阻,I2C 的 SDA/SCL 必须接上拉,阻值根据总线电容和速率选,常见 4.7kΩ,总线长或者器件多就降到 2.2kΩ。上拉没接或者阻值太大,波形上升沿变缓,通信时好时坏,特别难查。
读电压的时候要注意数据格式。模拟前端返回的通常是原始 ADC 码值,需要按数据手册的公式换算成电压。换算系数搞错,读出来的电压差之毫厘谬以千里,均衡判断全乱。我一般会在固件里加一个自检:读一个已知电压(比如用基准源),看换算结果对不对,不对就报故障。
3.4 保护逻辑不能省
均衡是主动在电池上加载的行为,保护逻辑必须做足。至少要有:单节过压保护,超过上限立即停止均衡并报警;单节欠压保护,低于下限也停止;温度保护,如果板上有温度传感器,电阻区域过热要停;通信超时保护,如果 MCU 和模拟前端失联,模拟前端应该能自己关断均衡。
这些保护里,硬件级的过压保护最可靠,因为 MCU 死机时软件保护就失效了。MP2642GR-Z 这类前端一般有硬件比较器做快速保护,用之前确认它的保护阈值和响应时间,别指望软件兜底。
4. 调试实录与常见问题排查
4.1 均衡不启动或启动异常
最常见的现象是电压差明明很大,均衡就是不启动。排查顺序我一般这样走:先确认模拟前端读出的电压值对不对,用万用表量实际电压对比,差太多就是采集或换算的问题;再确认均衡条件判断,把阈值临时调低看是否触发,排除阈值设置问题;然后查均衡开关驱动,用示波器看 MOS 栅极有没有驱动波形,没有就是前端配置或通信问题;最后查电流判断逻辑,如果 current_is_low() 一直返回假,均衡永远进不去。
还有一种情况是均衡启动了但马上停。这通常是迟滞设置不合理,或者采样噪声大,电压差在阈值附近跳。解决办法是加大迟滞带,或者在固件里对电压做滑动平均滤波,滤掉单次采样噪声。
4.2 均衡电流偏小
算出来应该是 200mA,实测只有 80mA,问题一般出在三个地方。第一是 MOS 没完全导通,栅极驱动电压不够,尤其是电池电压下降后 Vgs 变小,Rds(on) 上升。第二是均衡电阻实际阻值比标称大,尤其是功率电阻,温升后阻值会漂。第三是走线或接插件电阻,均衡电流路径上的每一段铜箔、每一个焊点都有电阻,累积起来不可忽略。
排查方法很简单:均衡开启时,用万用表量均衡电阻两端的电压,除以电阻标称值就是实际电流。再量 MOS 漏源电压,如果这个电压很大,说明 MOS 没导通好或者 Rds(on) 太大。
4.3 电压采集跳变
采集值偶尔跳一下,均衡判断就跟着抖。来源可能是 ADC 参考电压不稳、采样时序和均衡开关冲突、或者地线噪声。先看是不是均衡开启瞬间跳,如果是,就是采样和均衡没错开,调整采样时序,在均衡关断窗口采样。如果不是,检查参考电压和地线布局,模拟地和数字地要分开走,最后单点汇合。
注意:调试阶段不要一上来就开自动均衡。先手动控制均衡开关,确认硬件通路正常,再放开自动逻辑。我见过太多人直接跑自动策略,结果硬件有问题,均衡一直开着,电阻烧糊了才发现。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方向 |
|---|---|---|---|
| 均衡不启动 | 阈值设置过高 | 临时调低阈值测试 | 按实际不均衡程度重设阈值 |
| 均衡不启动 | 电流判断一直为假 | 打印电流判断结果 | 修正电流采样或判断逻辑 |
| 均衡启动即停 | 迟滞带太小 | 观察电压差波动 | 加大迟滞或加滤波 |
| 均衡电流偏小 | MOS 未完全导通 | 量 Vgs 和 Vds | 换低 Vgs(th) 的 MOS 或提高驱动 |
| 均衡电流偏小 | 电阻温漂 | 量均衡时电阻两端电压 | 选低温漂功率电阻 |
| 采集跳变 | 采样与均衡冲突 | 看跳变是否在均衡瞬间 | 错开采样时序 |
| 通信失败 | I2C 地址错 | 扫描总线地址 | 核对数据手册地址 |
| 通信失败 | 上拉缺失或过大 | 看波形上升沿 | 补上拉或减小阻值 |
| 电阻过热 | 均衡时间无上限 | 看均衡持续时间 | 加均衡时间上限和冷却 |
| 保护误触发 | 保护阈值设置不当 | 对比实际电压和保护值 | 重新核算保护阈值 |
4.5 几个踩过的坑
第一个坑是均衡电阻的功率余量。按计算 0.72W 选了 1W 电阻,实际在密闭机箱里,环境温度 50 度,电阻表面温度能到 120 度以上,长期跑阻值漂移,均衡电流越来越小。后来换成 2W 的,温度降下来,稳定多了。功率器件选型一定要考虑实际工作环境温度,不能只看计算值。
第二个坑是两节同时均衡的相互影响。两节同时均衡时,中间节点的电流是两节均衡电流之差,如果两节均衡电流不完全相等,中间节点的电压会被拉偏,导致采集不准。解决办法是尽量避免两节同时长时间均衡,或者采集时错开。
第三个坑是固件里的整数溢出。PIC18F85K22 是 8 位机,默认 int 是 16 位,算电压差、算时间计数的时候,如果变量类型没选对,很容易溢出。均衡计时器用 uint16_t,按秒计数最多 65535 秒,够用,但如果用 uint8_t,几分钟就溢出了,均衡时间上限直接失效。这种 bug 很隐蔽,因为溢出后行为不确定。
第四个坑是上电初始状态。MCU 上电到固件跑起来有几毫秒到几十毫秒的空窗期,这期间均衡开关的状态必须由硬件保证是关断的。如果 MOS 栅极没有下拉电阻,上电瞬间可能误导通,电池通过均衡电阻放电。加一个栅极下拉电阻,成本几分钱,能避免大问题。
5. 系统集成与长期可靠性
5.1 与储能和备用电源系统的对接
均衡模块不是孤立的,它要跟整个系统对话。储能系统里,均衡状态、电池电压、温度这些信息要上报给上位机或者能量管理系统,方便运维判断电池健康度。备用电源里,均衡模块通常要跟充电机配合,充电末期是均衡的好时机,因为此时电池接近满充,电压差最能反映 SOC 差异。
对接的时候,通信协议要定清楚。上报哪些数据、什么频率、异常怎么报警,这些在项目初期就要跟系统方对齐。我见过均衡做得好好的,但因为上报数据格式跟上位机对不上,整个项目卡在联调阶段。
5.2 长期运行的可靠性设计
储能和备用电源都是长期运行场景,均衡模块要经得起时间考验。几个关键点:均衡电阻的长期功率余量要足,别卡着额定值用;MOS 的 SOA(安全工作区)要留余量,尤其是均衡开启瞬间的浪涌;固件要有看门狗,MCU 死机时能复位,复位后均衡开关回到安全状态;关键参数要有非易失存储,掉电后均衡阈值、累计均衡时间这些不丢。
还有一点是均衡的"记忆"。如果某节电池长期需要均衡,说明它可能已经老化或者有问题,固件里可以累计每节的均衡次数或时间,超过一定值就上报"该节电池可能异常",提示维护人员检查。这个功能在备用电源里特别有用,因为平时没人盯着,等发现容量不够时往往已经晚了。
5.3 测试与验证方法
均衡功能做完,怎么验证它真的有效?最直接的方法是人为制造不均衡:给其中一节并联一个小电阻放电,让它电压低于另一节,然后看均衡能不能把它拉回来。记录均衡前后的电压差,算均衡效率。
更严谨的验证是循环测试:让电池组反复充放电,记录每节电压曲线,看长期运行下电压差是否被控制在阈值内。这个测试要跑几百个循环才有说服力,但能暴露很多短期测试发现不了的问题,比如温度对均衡效果的影响、长期运行后电阻阻值漂移等。
测试时还要覆盖异常场景:拔掉一节电池模拟断线、短路均衡电阻模拟故障、拉高环境温度模拟过热,看保护逻辑是否按预期动作。这些异常测试比正常测试更重要,因为现场出问题时,保护逻辑是最后一道防线。
5.4 成本与性能的再平衡
最后说回成本。被动均衡加模拟前端的方案,BOM 成本主要在三块:模拟前端芯片、均衡电阻和 MOS、MCU。如果项目对成本敏感,可以考虑把均衡驱动集成度更高的前端,减少外围器件;或者用 MCU 直接驱动 MOS,省掉专用前端,但这样电压采集和保护就要自己做,开发工作量和风险都上去了。
我的经验是,两节串联这种小规模场景,用专用模拟前端虽然单颗芯片贵一点,但省下的开发时间、调试精力和可靠性收益,远超那点物料差价。尤其是备用电源这种要求长期稳定的场景,别在核心器件上省钱。
这个方案后续还可以扩展:如果电池节数增加,换支持更多节的前端,固件状态机基本不用大改;如果要加主动均衡,可以在现有采集和控制基础上,把放电电阻换成能量搬运拓扑,MCU 的控制逻辑框架是复用的。把均衡策略和硬件驱动解耦好,后面升级会轻松很多。