一块两串电池的备用电源板,客户反馈充满电显示正常,实际带载跑不了几分钟就低压报警。拆下来一量才发现问题:两节电芯一个3.62V、一个3.31V,标称容量明明够,可用容量却只剩一半。这种“单体电压差”问题在储能和备用电源系统里太常见了,根本原因就是串联电池组天然没法独立充电,用久了电压必然拉开。我这次用MP2642GR-Z和PIC24FV32KA302这套组合做了一版针对两个串联电池单元的均衡方案,把这块短板补上了。整个项目从硬件链路到均衡策略再到量产参数,我打算在这篇里全部拆开讲清楚,适合正在做两串锂电池BMS、便携储能或者备用电源控制板的工程师参考。
1. 两串电芯为什么必须均衡:失衡机理与方案主线
1.1 木桶效应和三种失衡来源
先明确一个物理事实:串联电池组里所有电芯流过的是同一个电流,充电时充进去的电荷量理论上一样,放电时放出来的也一样。既然如此,为什么还会失衡?
因为“电荷量相等”不等于“电压相等”。电芯之间的容量、内阻、温度、老化速率存在差异,同样的电荷量落在不同电芯上,对应的电压变化完全不同。打个比方:两个同样标称100Ah的电芯,一个实际容量98Ah,另一个实际容量102Ah,串联回路电流相同,但小容量那只的荷电状态变化速度一定更快,电压上升和下跌的斜率都不一样。循环几十次以后,两只电芯的电压差会大到肉眼可见。
具体到储能和备用电源的场景,还有三个加速失衡的因素:
- 浮充与长期搁置:备用电源大部分时间处于浮充或者静置状态,涓流充电下电芯自放电率不同,电压会缓慢分化。
- 温度场不均匀:电池组内部靠外壁和靠中心的位置散热不同,高温电芯自放电快,低温电芯内阻大,最终反映到单体电压上。
- 反复深度充放:放电深度越深,容量差异带来的电压差被放大得越明显,这是备用电源在断电应急放电时最致命的情况。
失衡的后果就是标题里说的“木桶效应”:充电时最高那节先到保护电压,充电强制停止,其余电芯还没充满;放电时最低那节先到欠压保护,负载断电,其余电芯还有电放不出来。整个电池组的可用容量永远被最差的那节电芯锁定。
1.2 被动均衡为何是两串系统的最优解
均衡电路按能量去向分主动和被动两类。主动均衡用电感、电容或者变压器把高电压电芯的能量搬运到低电压电芯,理论上效率高、不发热,但电路复杂,多串场景还要做矩阵开关或者反激变换,成本高、板面积大,在小系统里很难回本。被动均衡则简单粗暴:高电压电芯通过一个电阻和开关管直接放电,把多余的能量以热量形式耗散掉。
两串电池的均衡目标是把两节电压拉平,而不是像十几串的动力电池那样追求极致的能量转移效率。被动均衡的优点非常突出:
- 电路简单,两串只需要两路MOS加两粒电阻;
- 控制逻辑直观,电压高就放电,电压平了就关;
- 成本低,不会占用太多PCB面积;
- 可靠性高,没有电感储能器件,也就没有额外的失效模式。
唯一被诟病的“浪费能量”问题,在两串备用电源场景里其实并不严重。备用电源的均衡通常发生在浮充阶段,此时电池本来就有外部电源供电,耗散一点能量换取全系统容量恢复,这笔账是划算的。因此我最终确认了被动均衡+Firmware控制的路线。
1.3 MP2642GR-Z与PIC24FV32KA302的角色分工
这套方案里两片芯片的分工非常清晰:
- MP2642GR-Z走电源路径。串联电池组的总电压范围波动很大,从充满的8.4V一路掉到放空保护点,这个电压没法直接给MCU和模拟电路用。MP2642GR-Z负责把电池侧的总电压转换成稳定的系统电源轨,同时提供使能控制,配合MCU实现整板待机功耗管理。
- PIC24FV32KA302走信号路径。它负责采样两节电芯的电压、电池温度和母线电流,然后根据均衡阈值和滞回区间控制两路均衡MOS的开关。这颗MCU的片上资源在这类小系统里很合适:16位处理器跑均衡算法绰绰有余,内置的多通道ADC和PGA让采样链路不需要外挂一堆运放,几种低功耗模式也让待机功耗可控。
选这两片的另一个原因是供应链上的实用考虑:两串均衡方案不算高精尖,不需要上带硬件均衡引擎的专用BMS AFE,用普通的电源芯片加通用MCU自己写逻辑,反而更灵活。改均衡阈值、改滞回区间、加保护逻辑都不需要换硬件,直接更新固件就行,这在产品迭代阶段是巨大的时间成本优势。
2. 硬件链路细化:从电芯到ADC和从电池到系统电源
2.1 高端电芯电压采样与共模问题
两串电池的采样难点在第二节电芯,也就是“高端电芯”。MCU的ADC只能采集相对于GND的电压,而高端电芯的正极电压是两节电芯电压之和,最高接近8.4V,直接分压送到ADC必然超量程。所以必须先做共模处理。
我在这块板上用的是“双通道分压+软件求差”的方案:电池总正极、电池中点各引出一组分压电阻,分别把电压降到ADC可以接受的范围内,ADC采到两个相对GND的电压后,在软件里做减法得到第二节电芯电压。这个方案成本最低,但有个坑必须提前处理:分压电阻的精度直接影响求差精度。
假设第二节电芯真实电压是3.8V,总电压是7.6V。如果用1%精度的分压电阻,第一路(总正极采样)测得总电压可能有76mV的误差,第二路(中点采样)也引入76mV级别的误差,两者相减,得到的单体电压误差可能达到100mV以上。而均衡阈值和滞回区间通常只设20~50mV,采样误差比控制精度还大,均衡逻辑会乱跳。所以我最终把分压电阻全部换成了0.1%精度,并且在产线上做了两点校准。校准细节后面专门讲,这里先记住结论:两串均衡的采样网络,电阻精度不是细节问题,是决定方案能不能用的关键。
2.2 均衡执行回路:MOS开关与限流电阻的功率计算
均衡执行回路的结构很简单:每节电芯并联一条由“限流电阻+NMOS管”组成的放电支路,MCU的GPIO通过门极驱动电阻控制MOS的通断。每节电芯独立一条支路,互不干扰。
限流电阻的取值需要先定均衡电流,然后再算功率。我以磷酸铁锂两串应用为例,单体充电上限3.65V,均衡开启阈值3.50V,均衡关闭阈值3.30V,滞回区间0.2V。如果目标均衡电流是200mA,限流电阻R = (3.50 - 3.30) / 0.2 = 1Ω。再看极限情况:电池电压被充到3.65V依然处于均衡状态时,电阻上的压降是3.65 - 3.30 = 0.35V,电流350mA,功率0.35 × 0.35 × 1 = 0.1225W。考虑到备用电源长时间浮充,均衡可能几小时不停,电阻发热会持续累积,所以我没有贴着极限选,而是选了2010封装的1Ω/0.5W贴片电阻,留出4倍裕量。
MOS的选择也有讲究。均衡电流只有几百毫安,导通电阻几十毫欧的普通小信号NMOS完全够用,但我建议关注一下栅极电荷和门极驱动能力。MCU的GPIO驱动能力有限,如果MOS栅极电荷太大,开关边沿会很慢,均衡回路等效于在电阻之外多了一个可变阻抗,影响均衡电流的稳定性。实测下来用导通电阻50mΩ、栅极电荷10nC级别的小管子,配10kΩ门极电阻,开关时序干净利落。
还有一个细节:均衡MOS和限流电阻的摆放位置。均衡电阻工作时表面温度不低,如果紧挨着电芯采样分压电阻,热量会通过PCB铜箔传导过去,引起采样电压漂移。我画板时把两路均衡支路放在板边,采样网络放在板中间,中间用铺地铜箔隔开,热成像实测温差5℃以内,对采样的影响可以忽略。
2.3 系统电源轨道:MP2642GR-Z的选型与休眠控制
系统电源轨为什么不能直接用线性稳压器?两串电池正常工作时总电压6.4~8.4V,如果线性稳压输出3.3V,压差高达3~5V,控制板总电流按30mA算,发热是90~150mW。备用电源控制板往往被塞在密封的电池仓里,这点热量虽然不算大,但长期工作会推高周围温度,直接影响电芯采样精度。而MP2642GR-Z这类同步降压芯片工作效率高,同样的负载下损耗小得多,所以主电源轨必须走开关电源。
电路拓扑是电池总电压进MP2642GR-Z降压到5V,5V再经一颗小LDO降到3.3V给MCU和模拟电路。有人会问为什么不在MP2642GR-Z上直接输出3.3V省掉LDO,因为模拟采样链路的电源纹波要求比较高,开关电源的开关纹波直接进ADC会影响采样精度。用一颗低噪声LDO做二级稳压,哪怕它效率低一点,但纹波抑制度高,ADC读数能稳定一个数量级。
休眠控制是备用电源产品的刚需。系统大部分时间处于静置状态,如果均衡板一直在运行,静态功耗都会把电池慢慢耗干。MP2642GR-Z的使能端接在MCU的GPIO上,MCU检测到电池长时间没有充放动作后,先关掉均衡MOS,再拉低使能端关断主电源轨,自己进入深度休眠,只保留一个周期唤醒定时器。唤醒后重新使能电源轨,完成一轮采样和均衡判断,然后再次睡去。这套流程把整板待机功耗控制在20μA以内,对两串小容量电池来说可以接受。
2.4 温度采样与均衡热量的隔离
温度采样看似简单,但同样有坑。我在每节电芯表面贴了一片NTC,用分压网络接进MCU的ADC。NTC的摆放位置应该靠近电芯本体而不是均衡电阻,否则采到的是电路板温度而非电芯温度。均衡电阻的热量会沿着铜箔传导,如果NTC走线经过均衡电阻区域,温度读数会虚高,导致保护逻辑误判。
另外NTC分压电阻的精度同样影响温度读数。温度测量不需要电压那么高的精度,1%电阻够用,但NTC本身的一致性必须把关,同一批次的NTC B值差异会让温度偏差好几度。产线上我会对每片板做一次温度校准,用恒温箱采三个温度点,把校准系数写进EEPROM。
3. 均衡控制策略与PIC24FV32KA302程序实现
3.1 工作状态识别与三态控制
均衡控制不能无脑看电压,必须先弄清楚系统当前处于充电、放电还是静置状态。这是最容易被人忽略的一个逻辑。
- 充电状态:外部电源在位,电池正在被充电器灌入能量。此时对高电压电芯做均衡是安全的,因为它的能量来源是充电器,不是电池本身。
- 放电状态:外部电源掉电,电池正在给负载供电。此时如果开启均衡,相当于一边放电一边额外消耗高电压电芯的能量,会加速整组电池电压下跌,可能把原本还能撑半小时的电池提前拖入欠压保护。
- 静置状态:没有充电器,也没有负载电流。此时可以均衡,但要控制均衡电流不能太大,因为它消耗的是电池自己储存的能量,均衡时间过长反而把电量白白浪费在发热上。
状态识别的方法有两种:一种是有充电器在位信号干接点的,直接读GPIO;另一种没有通信干接点,只能靠检流电阻上的电流方向判断。我在这块板子上用了后一种,低边检流电阻加运放放大送进ADC,电流正负和大小一目了然。PIC24FV32KA302的片上PGA正好用来放大检流电阻的毫伏级压降,省了一颗外部运放。
3.2 采样滤波和滞回区间
电池电压不是理想的直流,充电器的开关纹波、负载突变、均衡MOS开关瞬间的冲击,都会在ADC输入端产生毛刺。直接拿单次采样值去做均衡判决,结果就是均衡MOS不停抖动。
我的做法是每个通道连续采8次,去掉最大值和最小值,剩下6次取平均,作为一次有效的电压样本。同时设置滞回区间:均衡开启阈值3.50V,关闭阈值3.30V,中间0.2V的滞回带保证均衡一旦开启不会因为电压的微小回弹就立刻关闭。滞回区间不能太小,太小会引发振荡;也不能太大,太大会让均衡目标电压低于预期,均衡结束时电芯电压偏低。0.15~0.2V是我在两串铁锂系统上实测比较舒服的区间。
3.3 核心均衡流程(带C代码)
均衡流程的主框架是一个周期任务,每100ms执行一次。核心逻辑如下:
#define BAL_ON_V 3500 /* 均衡开启阈值 3.500V, 单位mV */ #define BAL_OFF_V 3300 /* 均衡关闭阈值 3.300V */ #define BAL_DIFF_MV 30 /* 两节电芯压差超过30mV才允许均衡 */ #define BAL_TEMP_LIMIT 65 /* 电芯温度上限 65℃ */ #define BAL_MAX_TIME 600 /* 单次均衡最大持续600秒 */ typedef enum { BATT_CHARGING, BATT_DISCHARGING, BATT_IDLE } batt_state_t; void balance_task(uint16_t v1_mv, uint16_t v2_mv, uint16_t temp_c) { static uint32_t bal_timer_s = 0; /* 温度过高时禁止均衡 */ if (temp_c > BAL_TEMP_LIMIT) { balance_disable_all(); bal_timer_s = 0; return; } /* 只有充电或静置状态才允许均衡 */ if (batt_state == BATT_DISCHARGING) { balance_disable_all(); bal_timer_s = 0; return; } /* 关键:只有电压高过阈值、且比另一节高出一段差值的电芯 * 才值得泄放,这个差值条件防止两节电芯同时进入均衡 */ if ((v1_mv > BAL_ON_V) && (v1_mv > v2_mv + BAL_DIFF_MV)) { enable_balance(CELL_1); } else if (v1_mv < BAL_OFF_V) { disable_balance(CELL_1); } if ((v2_mv > BAL_ON_V) && (v2_mv > v1_mv + BAL_DIFF_MV)) { enable_balance(CELL_2); } else if (v2_mv < BAL_OFF_V) { disable_balance(CELL_2); } /* 均衡超时保护,防止逻辑异常时长时间放电 */ if (balance_is_active()) { if (++bal_timer_s > BAL_MAX_TIME) { balance_disable_all(); } } else { bal_timer_s = 0; } }注意几个细节。第一个是差值和阈值是“与”的关系,两节电芯都超过3.50V但压差只有10mV时,不会触发均衡,这是合理的,因为此时两者本身就很接近,没必要为了追求“完全相等”而浪费能量。第二个是均衡超时保护,正常充电状态下电芯电压回落到3.30V就会关闭,但如果充电器持续灌入能量,电压可能一直悬在3.50V以上,如果没有超时保护,均衡电阻会一直发热,这在密封的备用电源产品里是安全隐患。第三个是代码里的状态判断和温度判断优先级最高,任何时刻保护逻辑都优先于均衡逻辑。
3.4 保护逻辑:超时、过温、过压欠压
均衡算法的保护逻辑不只是温度阈值。我加了四个层面的保护:
- 均衡超时:上面代码里已经实现,最长10分钟,到点强制关闭均衡,下一轮任务再根据条件判断是否重新开启。
- 过压保护:任何一节电芯电压到达3.65V,MCU拉高报警信号,同时关闭均衡回路,此时充电管理应当由充电芯片自己处理限压。MCU不直接切断充电回路,但在备用电源系统里,这个报警信号可以接到系统管理单元去做联动。
- 欠压保护:放电状态下任一电芯电压低于2.80V,MCU记录欠压事件,进入低功耗状态。此时即使外部电源恢复充电,也需要一个安全恢复流程,避免在电芯深度欠压后直接大电流充电。
- 均衡电阻开路检测:开启均衡一段时间后,如果电芯电压完全没有下降趋势,怀疑均衡支路开路(电阻虚焊或MOS损坏),上报故障位。这个检测不增加硬件成本,只靠软件判断,量产时对焊接工艺问题非常有效。
4. 调试实录:我在这套方案里踩过的四个坑
4.1 高端采样电压跳变:功率地与模拟地的分家
第一版样板出来后,高端电芯的采样电压在充电时跳得离谱,用示波器能看到ADC引脚上有几百毫伏的毛刺,均衡逻辑跟着乱跳。最初怀疑是MP2642GR-Z的开关噪声串进来的,后来发现根子在地线上。
充电回路电流不小,在PCB地线寄生电阻上会产生压降。我把模拟地和功率地共用了同一段走线,采样网络的参考地正好落在这段压降上,ADC读到的“地”实际在一个随电流波动的高电平上,高端电芯采样自然跟着抖。解决办法是单点星型接地:功率地粗走,所有大电流路径单独走,模拟地独立一根线,只在电源芯片的输出电容处单点汇合。改完以后毛刺直接消失。这个教训我记到现在:模拟混合电路里,把功率地铺得再宽都不如把模拟地和功率地物理隔离有效。
4.2 均衡开启瞬间电压回勾引起的振荡
第二个坑更隐蔽。均衡MOS一开通,ADC读数会瞬间掉下来一大截,然后均衡逻辑判断“电压已经到了关闭阈值”,又把MOS关掉。关掉之后电压回弹,再次触发均衡,如此反复,板子上均衡电阻每隔几百毫秒就“啪嗒”一下,温度上升很快。
原因是多方面的:均衡回路的电流在电芯内阻和走线电阻上产生了压降,采样分压网络的取点如果靠近均衡电流路径,就会把这段压降采进来。另外均衡开启瞬间还要给均衡支路的电容充电,同样会在采样端产生冲击。我做了两件事解决:一是在软件里加“判决冷却时间”,即开启或关闭均衡后的200ms内不重新判断,让电压稳定下来再决策;二是调整采样取点位置,让采样线的参考点远离均衡电流路径。这两招一起上,振荡彻底消失。
4.3 两节同时均衡造成的反均衡电流
均衡逻辑第一版很简单:哪个电压高于阈值就平衡哪个。实测发现一个很尴尬的情况:两节电芯都在3.50V附近,第一节先到阈值,均衡开启;一段时间后第二节也到了阈值,均衡也开启。结果两节电芯同时放电,整体电压被迅速拉低,均衡被迫停止,电压反弹,又触发,形成温升和损耗,但两节之间的电压差几乎没变。
根因就是没有引入“差值条件”。均衡的本质是把高的拉向低的,而不是把两个都高的往死里整。代码里那句(v1_mv > v2_mv + BAL_DIFF_MV)就是为这个坑加的。另外我还加了一个限制:同一时刻最多只允许一节电芯进入均衡,如果两节压差在阈值内,宁可不均衡也不让他们互相“啃”。这个逻辑对两串系统特别重要,因为总共只有两节电芯,本来就很容易出现同时超阈值的情况。
4.4 待机电流失控与使能链路的彻底断电
样机做完以后测待机功耗,发现整板电流高达8mA。两串电池容量通常只有2~3Ah,按8mA待机电流算,一两周电池就空了,备用电源失去意义。
逐项排查后发现三个耗电源头:MP2642GR-Z的空载静态电流、分压采样网络的常通电流、LDO自身的静态电流。单纯的让MCU休眠并不能解决后两个问题,因为分压网络电阻只要接着,电流就在流。最终方案是给采样网络的供电端加了一颗PMOS做电源开关,在MCU休眠时整个采样前端彻底断电。MP2642GR-Z直接走使能端关断,LDO输入端也随之没电,MCU由一颗超低静态电流的LDO单独供电进入休眠。现在整板休眠电流实测不到10μA,长途运输或者长期搁置都不会把电池拖垮。
5. 可直接照抄的参数表与量产落地细节
5.1 参考参数表(磷酸铁锂两串应用)
我把这套系统调试稳定后的参数整理成一张表,直接照着用可以少走很多弯路。注意如果换成三元锂或者锰酸锂,阈值和滞回区间要按材料体系重新标定,表里这一组是针对磷酸铁锂2S的。
| 参数 | 数值 | 说明 |
|---|---|---|
| 单体充电上限 | 3.65V | 过压报警点,由充电芯片限压 |
| 单体放电下限 | 2.80V | 欠压保护点 |
| 均衡开启阈值 | 3.50V | 电压超过此值且压差足够才开启 |
| 均衡关闭阈值 | 3.30V | 电压回落到此值以下关闭 |
| 均衡差值门限 | 30mV | 两节电芯压差需超过此值 |
| 滞回区间 | 200mV | 开启与关闭阈值之差 |
| 均衡电流 | 约200mA | 限流电阻1Ω时对应值 |
| 限流电阻 | 1Ω / 0.5W | 2010封装,留4倍以上热裕量 |
| 单次均衡时长 | 10分钟 | 超时强制关闭 |
| 采样周期 | 100ms | 8次采样去极值取平均 |
| 均衡冷却时间 | 200ms | 开关动作后暂停判决 |
| 休眠整板电流 | <10μA | 关断主电源轨和采样前端 |
5.2 分压比与ADC校准流程
量产阶段有一个环节不能省,就是采样链路的校准。两串系统的均衡精度直接依赖电压测量的绝对精度,而ADC参考电压、分压电阻的实际阻值都会有偏差。
校准流程我建议分三步:
- 分压比粗校准:用精密电源给电芯输入端一个已知电压(比如3.500V),读取ADC原始值,计算实际分压比,写入EEPROM。两个通道分别做。
- ADC偏移校准:把采样输入端短接到GND,读ADC的零点偏移,记录下来。
- 温度校准:恒温箱里设25℃、45℃、65℃三个点,记录每个NTC通道对应的ADC读数,拟合出校准曲线。
校准系数在软件启动时加载,后续所有电压判断都用校准后的值。校准后的系统实测电压误差控制在±10mV以内,对30mV的均衡差值门限来说是足够的,不会因为测量误差误动作。
5.3 量产测试项目建议
均衡功能的产线测试比普通控制板要多几个项目,我按优先级排一下:
- 静态功耗测试:整板休眠电流必须小于10μA,不合格直接返修,这关系到产品的长期搁置可用性。整板休眠电流必须小于10μA,不合格直接返修,这关系到产品的长期搁置可用性。
- 均衡功能测试:用两路可调电源模拟两个电芯,A路设3.55V、B路设3.30V,上电后检查均衡MOS是否对A路开启,用电流表实测均衡电流是否在180~220mA范围内。
- 保护逻辑测试:把温度模拟到70℃,确认均衡被禁止;把状态设为放电模式,确认均衡不会开启。
- 均衡电阻温升测试:连续均衡30分钟,热成像确认电阻表面温度不超过120℃,且周边元件温度无明显升高。
- 老化测试:至少抽样3%的板子做72小时高温老化(65℃),老化后重新校准并复测均衡功能,确认采样漂移在允许范围内。
对于两串系统我只想说一点实话:均衡救不了烂电芯,只能挽救安装工艺造成的初始电压差。出厂前电芯务必做分容配组,容量差和内阻差控制在3%以内,均衡系统才有意义。我在实际项目里的体会是,调通均衡逻辑不难,难的是把采样精度、功耗和热设计这些“基础科目”做扎实,这些细节决定产品能不能过得了长期可靠性那一关。最后分享一个调试技巧:先把MCU的串口打印开起来,把电压和均衡状态实时打出来,先把逻辑在数据流里跑顺,再去动示波器和逻辑分析仪。逻辑都没理顺就上仪器,只会被一堆波形搞得晕头转向。