1. 储能电池均衡的底层逻辑与方案选型
1.1 为什么串联电池组必须做均衡
先聊一个我在实际项目中反复遇到的场景:两节标称容量相同的电芯串联使用,用了半年之后,整组可用容量掉到了原来的七成左右。拆下来单独测,一节还剩九成容量,另一节只剩六成多。问题出在哪?串联回路里电流处处相等,充电时容量小的那节先到截止电压,放电时它又先到下限。BMS为了保护它提前切断,另一节明明还有余量却用不上。日积月累,弱电芯被反复过充过放,加速老化,整组寿命被最短的那块木板死死拖住。
这就是均衡电路存在的全部意义。储能系统和备用电源系统里,电池组往往由多节电芯串联堆出所需电压,两节串联是最小也最典型的单元。别小看这两节,很多小型储能包、通信基站备电、UPS后备模组都是两串结构。均衡做得好不好,直接决定整组循环寿命是三百次还是八百次。
均衡分两大类:被动均衡和主动均衡。被动均衡就是给电压高的那节并一个电阻放电,把多余能量烧掉,简单便宜但发热、效率低,而且只能在充电阶段慢慢耗。主动均衡则是把能量从高电压电芯搬到低电压电芯,效率高、发热小,充放电全程都能工作。两节串联的场景下,主动均衡的拓扑可以做得非常简洁,成本也没想象中那么吓人。
1.2 为什么选 MP2642GR-Z 这颗均衡芯片
MP2642GR-Z 是一颗专门为多节串联电池组设计的双向主动均衡控制器。我第一次接触它是在一个两串锂电的备电项目上,当时对比过几种方案:分立MOS加电感自己搭、专用均衡IC、还有用MCU加ADC加MOS全软件控制的。最后选它,理由很实在。
第一,它把双向升降压的功率级控制逻辑集成进去了,外围只需要两颗电感和几颗MOS,就能实现两节电芯之间的能量互搬。自己用分立件搭双向Buck-Boost,光驱动时序和死区控制就够调一阵子,还容易炸管。第二,它支持可编程均衡电流,通过外部电阻设定,从几十毫安到几安培都能覆盖,小到备用电源的涓流均衡,大到储能包的快速均衡,一颗芯片通吃。第三,它自带电芯电压监测和状态指示,配合MCU读取非常方便,不用额外加一堆运放做差分采样。
更关键的是它的工作电压范围宽,两节串联的锂电(6V到9V左右)和两节串联的磷酸铁锂(6V到7.6V左右)都在它的舒适区。芯片本身静态功耗低,备用电源系统最怕均衡电路自己把电耗光,这一点它做得不错。
1.3 PIC18F4682 在系统里扮演什么角色
MP2642GR-Z 是功率执行者,但它不知道什么时候该均衡、均衡到什么程度、什么时候停。这些决策得有人做,PIC18F4682 就是那个做决策的。
PIC18F4682 是一颗8位MCU,别看它位数不高,资源对于电池管理这种任务绰绰有余:自带10位ADC,多通道,可以直接采两节电芯的分压电压;有ECAN模块,方便接入储能系统的通信总线;PWM模块可以用来做辅助控制;EEPROM能存均衡策略参数和历史数据;看门狗和低功耗模式保证系统可靠又省电。
我选它的核心原因是够用且稳。电池管理不需要跑操作系统,不需要复杂算法,需要的是确定性、低功耗和长期供货稳定。PIC18系列在这几点上口碑一直不错。它负责周期性地采集两节电芯电压,判断压差是否超过阈值,然后通过IO口去配置MP2642GR-Z的工作模式,启动均衡,监控均衡过程,压差收敛到目标值后停止。整个逻辑清晰,代码量不大,调试起来心里有底。
1.4 整体方案架构一句话说清
两节电芯串联,中间节点引出。MP2642GR-Z 的功率级跨接在两节电芯之间,通过电感储能和释放,把高电压电芯的能量搬到低电压电芯。PIC18F4682 通过ADC监测两节电压,通过GPIO控制MP2642GR-Z的使能、模式选择和电流设定,同时通过通信接口把状态上报给上位机或储能系统的总控。整个系统形成一个闭环:监测、判断、执行、再监测。
这个架构的好处是职责分离。功率变换交给专用芯片,保证效率和可靠性;逻辑控制交给MCU,保证灵活性和可扩展性。后面要改均衡阈值、改均衡电流、加温度保护,都只需要动MCU的固件,不用碰功率板。
2. 核心器件特性与硬件设计要点
2.1 MP2642GR-Z 的关键引脚与功能拆解
拿到一颗芯片,我习惯先把引脚功能吃透,再动手画原理图。MP2642GR-Z 的引脚大致分几类,理解了每一类的意图,外围电路就不会画错。
电源与地:芯片的供电来自两节电芯串联后的总电压,内部有稳压给控制逻辑用。这里要注意,总电压不能超过芯片的绝对最大额定值,两节锂电满电8.4V,两节磷酸铁锂满电7.3V,都在安全范围内。但如果你的系统是热插拔或者有浪涌,输入端得加TVS和滤波电容,我吃过这个亏,一次上电浪涌直接把芯片打挂了。
电芯电压采样引脚:分别接两节电芯的正极和中间节点,用来感知每节电芯的实时电压。这两个引脚的分压电阻要选高精度、低温漂的,因为均衡判断全靠它。我一般用0.1%精度的电阻,温漂25ppm以内。分压比要算准,确保在电芯电压范围内ADC读数不饱和。
功率级驱动引脚:驱动外部MOS管的栅极,控制电感的充放电。这部分是模拟和功率的交界,布局时驱动走线要短而粗,栅极电阻根据MOS的Qg来选,太大开关慢损耗高,太小容易振荡。
电流设定引脚:外接一个电阻到地,设定均衡电流的大小。电阻值和电流的对应关系在数据手册里有曲线,我实测下来线性度不错。设定电阻要用精度1%以上的,否则均衡电流偏差大,影响均衡速度的一致性。
状态指示引脚:输出均衡进行中、故障等状态,可以直接接LED或者送MCU读取。我通常把它接到MCU的一个输入引脚,固件里做状态机判断,比单纯看LED靠谱。
使能引脚:MCU拉高启动芯片,拉低关断。这个引脚给了MCU完全的控制权,系统休眠时可以彻底关掉均衡电路,降低静态功耗。
2.2 外围功率级设计:电感与MOS的选型计算
外围功率级是这套方案里最需要动脑子的地方。核心就两个元件:电感和MOS管。
先说电感。MP2642GR-Z 工作在开关频率几百kHz到1MHz级别,电感值决定了纹波电流大小。纹波电流一般取均衡电流的20%到40%。假设我设定均衡电流为1A,取纹波系数0.3,那么纹波电流就是0.3A。根据公式:
L = (V_cell × (1 - D)) / (f_sw × ΔI)
其中 V_cell 是单节电芯电压,取3.7V;D是占空比,双向工作时大约0.5;f_sw 取500kHz;ΔI 取0.3A。代入算一下:
L = (3.7 × 0.5) / (500000 × 0.3) ≈ 12.3μH
实际选型取标准值10μH或15μH都可以,我一般选15μH留点余量。电感的饱和电流必须大于均衡电流加上一半纹波电流,也就是1A加0.15A,至少1.15A,实际选2A以上的屏蔽电感,防止饱和后电流失控。直流电阻要小,否则均衡效率被电感吃掉了,我选DCR在50mΩ以内的。
再说MOS管。两节电芯之间的双向变换,通常需要四个MOS组成两个半桥。选MOS看三个参数:导通电阻Rds(on)、栅极电荷Qg、耐压Vds。耐压选20V或30V就够,两节电芯电压不会超过10V。Rds(on)越小导通损耗越低,但Qg会大,驱动损耗增加。折中下来,我选Rds(on)在10mΩ到20mΩ之间、Qg在10nC以内的N沟道MOS。实测这个区间效率能到90%以上。
2.3 采样电路与滤波设计
电压采样看似简单,实则最容易出问题。两节电芯的中间节点是浮地的,采样时共模电压不为零,直接送ADC会引入误差。我的做法是用差分分压,每节电芯的正负端各串一个高精度电阻,分压后送ADC的两个通道做差分采样。PIC18F4682的ADC支持差分输入模式,正好用上。
滤波方面,分压点对地并一颗0.1μF的陶瓷电容,截止频率算一下:
f_c = 1 / (2π × R_eq × C)
R_eq是分压电阻的并联等效值,假设是10kΩ,C取0.1μF,f_c约160Hz。这个截止频率能滤掉开关噪声,又不会让电压变化响应太慢。均衡过程中电压是缓慢变化的,160Hz带宽完全够用。
注意:分压电阻不能选太小,否则均衡时电芯一直在被采样电路放电,白白耗电。我一般选分压总阻值在100kΩ以上,配合0.1μF电容,时间常数10ms,MCU每100ms采一次,稳定得很。
2.4 供电与保护设计
储能和备用电源系统对可靠性要求高,供电和保护不能省。MP2642GR-Z 的供电从电池组总正取,中间加一颗自恢复保险丝和TVS管。自恢复保险丝防止后级短路把电池拖垮,TVS吸收浪涌。总正和总负之间并一颗大容量电解电容,比如100μF,给功率级提供瞬态电流,减少对电池的冲击。
PIC18F4682 的供电我单独用一颗低功耗LDO从总压降到3.3V或5V,不要和功率级共用一路,否则开关噪声会干扰MCU。LDO的静态电流要小,备用电源系统待机时MCU和LDO的总静态功耗最好控制在几十微安以内。
保护方面,两节电芯各自并一颗均衡旁路保护二极管?不,这里不需要。需要的是在MCU固件里做过压和欠压保护:任何一节电芯超过4.25V(锂电)或3.65V(磷酸铁锂)就立即停止充电并启动均衡;低于2.8V或2.0V就停止放电。这些阈值存在EEPROM里,方便不同电芯体系切换。
3. 固件实现:从电压采集到均衡闭环
3.1 系统初始化与参数配置
PIC18F4682 上电后第一件事是初始化。我习惯把初始化分成几个模块:时钟、IO、ADC、定时器、通信、EEPROM读取。
时钟配置成内部振荡器跑16MHz,够用且省电。IO口根据原理图设定方向:控制MP2642GR-Z的引脚设为输出,状态读取引脚设为输入,通信引脚按外设功能配置。ADC配置成差分模式,选择对应的通道对,参考电压用内部基准,采样时间设长一点保证精度。定时器设一个10ms的中断,作为整个系统的时间基准。通信我一般用UART或者ECAN,看系统需求,备用电源系统里UART更常见,简单可靠。
EEPROM里存几个关键参数:均衡启动压差阈值、均衡停止压差阈值、单节过压阈值、单节欠压阈值、均衡电流设定值、均衡超时时间。上电时读出来放到RAM里,运行中如果收到上位机的新参数,先写EEPROM再更新RAM,保证掉电不丢。
// 参数结构体示例 typedef struct { uint16_t balance_start_mv; // 启动均衡的压差,单位mV uint16_t balance_stop_mv; // 停止均衡的压差,单位mV uint16_t cell_ov_mv; // 单节过压阈值 uint16_t cell_uv_mv; // 单节欠压阈值 uint16_t balance_current_ma; // 均衡电流设定 uint16_t balance_timeout_s; // 均衡超时 } sys_param_t;3.2 电压采集与滤波算法
ADC采集两节电芯电压,每100ms采一次,每次采8个点做平均。为什么是8个点?太少滤波效果不够,太多响应慢。8个点在10ms定时器中断里分8次采完,每次间隔1.25ms,避开开关噪声的相位。采完后去掉最大最小值再平均,进一步抑制突发干扰。
uint16_t read_cell_voltage(uint8_t cell) { uint32_t sum = 0; uint16_t max = 0, min = 0xFFFF; for (uint8_t i = 0; i < 8; i++) { uint16_t v = adc_read(cell); sum += v; if (v > max) max = v; if (v < min) min = v; delay_us(1250); } sum = sum - max - min; return (uint16_t)(sum / 6); }采到的原始值要转换成毫伏。转换系数由分压电阻比和ADC基准决定。假设分压比是1/6,ADC基准是4.096V,10位ADC满量程1023对应4096mV,那么:
V_cell_mv = (adc_value × 4096 / 1023) × 6
这个系数我一般做成宏或者常量,方便校准。实际做的时候拿高精度万用表测一下真实电压,和ADC读数对比,微调系数,把误差压到10mV以内。
3.3 均衡决策逻辑与状态机
均衡决策的核心就一句话:压差超过启动阈值就开均衡,压差降到停止阈值以下就关均衡。但实际写起来要考虑几种情况。
第一种,充电中均衡。充电时电流大,电压被抬高,采到的电压包含内阻压降,不能直接用来判断。我的做法是充电时暂停均衡判断,等充电电流降到C/10以下再判断,或者用充电间歇的电压。更稳妥的办法是充电时只做保护判断,均衡放到静置或放电时做。
第二种,静置均衡。这是最理想的均衡时机,电压稳定,判断准确。系统检测到电流为零且持续一段时间,就进入静置均衡模式。
第三种,放电中均衡。放电时电压被拉低,同样有内阻影响,但影响方向相反。如果放电电流稳定,可以用补偿的方式估算开路电压,但实现复杂。我一般不在放电中做均衡,除非压差特别大。
状态机设计成四个状态:IDLE(空闲)、MONITOR(监测)、BALANCING(均衡中)、FAULT(故障)。IDLE下如果满足均衡条件就进MONITOR,MONITOR确认压差持续超过阈值一段时间(比如30秒)后进BALANCING,BALANCING中压差降到停止阈值以下就回IDLE,任何保护触发就进FAULT。
typedef enum { STATE_IDLE, STATE_MONITOR, STATE_BALANCING, STATE_FAULT } balance_state_t; void balance_task(void) { static balance_state_t state = STATE_IDLE; static uint16_t monitor_cnt = 0; uint16_t v1 = read_cell_voltage(0); uint16_t v2 = read_cell_voltage(1); uint16_t diff = (v1 > v2) ? (v1 - v2) : (v2 - v1); switch (state) { case STATE_IDLE: if (diff > param.balance_start_mv) { monitor_cnt = 0; state = STATE_MONITOR; } break; case STATE_MONITOR: if (diff > param.balance_start_mv) { monitor_cnt++; if (monitor_cnt >= 30) { // 持续30次,约3秒 mp2642_enable(); state = STATE_BALANCING; } } else { state = STATE_IDLE; } break; case STATE_BALANCING: if (diff < param.balance_stop_mv) { mp2642_disable(); state = STATE_IDLE; } break; case STATE_FAULT: mp2642_disable(); break; } }3.4 与 MP2642GR-Z 的接口时序
MP2642GR-Z 的控制接口不复杂,但时序要遵守。使能引脚拉高后,芯片内部有个软启动过程,大概几毫秒,这期间不要急着读状态。我一般在使能后延时10ms再开始监控状态引脚。
均衡电流的设定是通过外部电阻硬件决定的,MCU改不了。但如果系统需要动态调整均衡电流,可以用数字电位器替代固定电阻,MCU通过SPI或I2C控制数字电位器。这个做法我在一个需要快慢两档均衡的项目里用过,效果不错。快档用于压差大时快速拉平,慢档用于压差小时的精细均衡。
状态引脚读取要做去抖。芯片状态输出可能有毛刺,我连续读三次,两次一致才认。故障状态一旦确认,立即关断使能并记录故障码到EEPROM,方便事后分析。
实操心得:MP2642GR-Z 在均衡电流较大时芯片会发热,布局时芯片底部要铺铜散热,最好打过孔到背面大面积铜皮。我测过1A均衡电流下芯片表面温升大概20度,加散热铜皮后降到10度以内。
4. 实测调试与常见问题排查
4.1 上电调试的步骤与观察点
板子焊好之后别急着上电池,按我的步骤来,能少烧几颗芯片。
第一步,不焊电池,只焊MCU和周边,用稳压电源给MCU供电,测3.3V或5V是否正常,MCU能不能下载程序,IO口电平对不对。这一步排除焊接短路和电源问题。
第二步,焊上MP2642GR-Z但不接电池,用稳压电源模拟两节电芯,比如两路3.7V串联。测芯片供电引脚电压,测使能引脚能否被MCU拉高拉低,测状态引脚输出。这一步确认数字接口正常。
第三步,接上功率电感和MOS,仍然用稳压电源。设定一个小的均衡电流,比如100mA,观察电源电流变化。如果均衡启动,高电压那路电源的电流应该增大,低电压那路应该减小(甚至变成负值,如果电源支持吸收)。这一步验证功率级工作。
第四步,接真实电池。先用两节电压差较大的电池,比如一节3.9V一节3.5V,看均衡是否启动,压差是否逐渐缩小。用万用表每隔几分钟测一次,记录均衡速度。
4.2 均衡不启动或启动后不收敛的排查
这是最常见的两类问题。我整理了一个速查表,按可能性从高到低排。
| 现象 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 均衡完全不启动 | 压差未达阈值 | 测实际压差和阈值 | 调整阈值或确认采样准确 |
| 均衡完全不启动 | 使能引脚没拉高 | 测使能引脚电平 | 检查MCU IO配置和走线 |
| 均衡完全不启动 | 芯片损坏 | 测芯片供电和状态引脚 | 更换芯片 |
| 启动后压差不收敛 | 均衡电流太小 | 测均衡时电池电流 | 减小电流设定电阻 |
| 启动后压差不收敛 | 采样误差大 | 万用表对比ADC读数 | 校准分压系数 |
| 启动后压差不收敛 | 电感饱和 | 测电感电流波形 | 换大饱和电流电感 |
| 均衡中频繁启停 | 阈值设置太接近 | 观察压差波动 | 拉大启动和停止阈值差 |
采样误差是隐蔽性最强的问题。我遇到过一次,ADC读数总是比万用表高50mV,查了半天发现是分压电阻的温漂,换了低温漂电阻就好了。还有一次是ADC基准不稳,LDO输出有纹波,基准跟着抖,后来在基准引脚加了颗10μF电容解决。
4.3 均衡效率与发热优化
均衡效率上不去,多半是导通损耗和开关损耗没平衡好。导通损耗跟MOS的Rds(on)和电感的DCR有关,开关损耗跟开关频率和MOS的Qg有关。
我实测过几组参数:开关频率从300kHz提到800kHz,开关损耗明显增加,效率从92%掉到87%,但电感可以选小一点。最后折中在500kHz,效率90%以上,电感体积也能接受。
MOS的选型上,我试过Rds(on) 5mΩ但Qg 30nC的管子,驱动损耗大,整体效率反而不如Rds(on) 15mΩ、Qg 8nC的管子。所以Qg比Rds(on)更值得关注,尤其是在高频下。
电感发热也要注意。DCR大的电感,1A电流下发热明显。我选DCR 30mΩ以内的,1A时功耗30mW,基本不热。如果电感发烫,先测DCR,再测是不是饱和了。
避坑技巧:均衡电感的饱和电流要按峰值电流选,不是按平均电流。峰值电流等于均衡电流加一半纹波电流。我见过有人按1A选1A的电感,结果纹波叠加后峰值到1.2A,电感饱和,电流失控,MOS炸了。
4.4 长期运行可靠性与数据记录
备用电源系统可能几个月都不充放电一次,均衡电路长期待机。待机功耗必须低。MP2642GR-Z 关断后静态电流很小,但MCU和LDO的功耗要算进去。我选LDO静态电流10μA以内的,MCU跑低功耗模式,定时器唤醒采一次电压,采完继续睡。整机待机功耗控制在50μA以内,对电池自放电的影响可以忽略。
数据记录方面,我在EEPROM里存均衡次数、累计均衡时间、历史最大压差、故障记录。这些数据对分析电池健康状态很有用。比如均衡次数突然增多,说明电芯一致性在变差,可能某节电芯开始老化。累计均衡时间增长过快,也是同样的信号。
固件里加一个均衡超时保护:单次均衡超过设定时间(比如2小时)压差还没收敛,就停止并报故障。这能防止电芯短路或采样故障导致的无限均衡。
5. 方案扩展与不同电芯体系的适配
5.1 从两节扩展到多节的思路
两节均衡跑通之后,扩展到三节、四节是自然的想法。MP2642GR-Z 本身是针对两节设计的,多节的话有两种做法。
一种是每两节用一颗芯片,比如四节电池用三颗芯片,分别均衡1-2、2-3、3-4。芯片之间通过MCU协调,避免同时均衡导致中间电芯被两边同时抽能或灌能。这种做法的好处是每颗芯片工作电压低,外围简单。坏处是芯片数量多,成本高。
另一种是选支持多节的高压均衡芯片,一颗芯片管多节。这种芯片通常支持菊花链通信,MCU通过一根线配置所有电芯。好处是集成度高,坏处是芯片贵,而且一旦损坏影响整组。
我个人的经验是,四节以内用多颗两节芯片的方案更灵活,坏一颗换一颗,不影响其他。四节以上考虑专用多节芯片。
5.2 锂电与磷酸铁锂的参数差异
锂电和磷酸铁锂的电压平台不同,均衡参数要跟着改。
| 参数 | 三元锂电 | 磷酸铁锂 |
|---|---|---|
| 标称电压 | 3.7V | 3.2V |
| 满充电压 | 4.2V | 3.65V |
| 放空电压 | 3.0V | 2.5V |
| 均衡启动压差 | 30mV | 50mV |
| 均衡停止压差 | 10mV | 20mV |
| 过压保护 | 4.25V | 3.75V |
| 欠压保护 | 2.8V | 2.0V |
磷酸铁锂的电压平台平坦,同样压差对应的容量差比锂电大,所以均衡阈值可以放宽一些,避免频繁启停。锂电的电压曲线陡,压差对容量的指示更灵敏,阈值可以设小一点。
这些参数全部存在EEPROM里,通过通信接口切换。我在固件里做了两套预设,上位机发个命令就能切换电芯类型,不用重新烧程序。
5.3 与储能系统总控的通信协议设计
均衡模块不是孤立的,它要把状态上报给储能系统的总控。通信协议我一般设计得简单可靠,用Modbus RTU或者自定义的二进制帧。
自定义帧格式:帧头(2字节)+ 命令(1字节)+ 数据长度(1字节)+ 数据(N字节)+ CRC16(2字节)。命令包括:读电压、读状态、设参数、读历史数据、复位故障。
上报的数据包括:两节电芯电压、压差、均衡状态、均衡次数、累计均衡时间、故障码。总控根据这些数据决定是否调整充放电策略。比如压差持续偏大,总控可以降低充电电流,给均衡更多时间。
通信超时保护也要做:如果总控超过一定时间没发心跳,均衡模块进入安全模式,只做保护不做均衡,防止失控。
5.4 成本与性能的平衡取舍
最后聊聊成本。这套方案的成本大头在MP2642GR-Z、电感和MOS。芯片价格固定,电感和MOS有优化空间。
电感可以选国产的屏蔽电感,性能不差,价格便宜不少。MOS选国产的30V N沟道,Rds(on) 15mΩ左右,Qg 10nC以内,单价能压到几毛钱。采样电阻用0.1%精度的厚膜电阻,比金属箔电阻便宜,温漂稍大但配合软件校准够用。
PCB用四层板,两层信号两层电源地,功率走线加粗,采样走线包地。四层板比两层板贵一点,但抗干扰好太多,调试省心。如果成本压得紧,两层板也能做,但采样走线要格外小心,远离功率级。
我的取舍原则是:影响安全和精度的不省,影响效率的适度省,影响体积的看情况省。采样电阻、基准电容、TVS这些不省;电感DCR可以放宽一点;MOS的Rds(on)可以大一点,效率从92%降到90%能接受。
这套两节均衡方案我前后做了三版,从最初的分立件搭到现在的MP2642GR-Z加PIC18F4682,稳定性和开发效率提升明显。最深的体会是,均衡电路不难,难的是把采样做准、把保护做全、把功耗做低。这三点做到了,电池组的寿命和可靠性就有保障。