☰
基于MP2642GR-Z与PIC18F97J94的电池主动均衡方案设计
2026/10/17 13:02:00 网站建设 项目流程

电池这玩意儿,玄学成分比很多人想象得多。同一个批次、同一台分容设备出来的两节电芯,容量能差出百分之二三,内阻差百分之十也不稀奇;一旦串联在一起,决定整个电池包能放出多少电的,永远是那颗最弱的电芯。在储能和备用电源系统里,我最近用一颗 MP2642GR-Z 升降压控制器,配上一颗 PIC18F97J94 单片机,搭了一套专门针对两个串联电池单元做电压均衡的从控板。这块板子做的事情很简单:把高电压电芯里的能量抽出来,灌进低电压电芯里,让两节电芯的电压差从一百多毫伏慢慢收敛到几毫伏。这篇文章就把这套方案从头到尾拆一遍——硬件拓扑为什么这么选、单片机里的均衡状态机怎么跑、实测数据长什么样、调试时踩了哪些坑。

1. 两串电芯的“长短腿”问题:为什么简单BMS经常被忽略均衡

1.1 串联电池单元均衡的本质

两个电池串联,流过每一节的电流完全一样,可每节电池的容量、内阻、自放电速率不可能完全一致。这就好比三个人手拉手跑步,速度必须一样,可耐力各不相同,最后队伍的速度一定被最慢的人拖住。电池组同理:放电时容量最小的那节最先到放空下限,可它的电量已经没了,另外一节还有余量,系统为了保护这节“短腿电芯”只能提前停止放电;充电时又是它最先到充满上限,系统为了防止过充也只能提前停止充电。

于是整组电池的可用容量,并不等于“容量小的那一节”,而是被它在每一次循环里反复压榨。更麻烦的是,容量小的电芯在同样的充放电电流下,SOC变化更快,端电压偏移也更大。这个偏移会越用越明显,如果一直不干预,短腿电芯会以更快的速度老化,最终整组提前退役。均衡要做的事,本质上就是把每一节电芯的SOC拉回到差不多的水平上,纠正这种“长短腿”。

1.2 储能和备用电源场景的特殊性

普通消费电子里的两串电池,比如笔记本电池、电动工具电池,也会做均衡,但大多数用的是最简单的耗散式方案。储能和备用电源场景不一样,主要有三个特点。

第一,长期浮充。备用电源在绝大多数时间挂在充电机上,浮充电压是一个固定值。容量小的电芯在浮充状态下会被顶到更高的电压,这不但加速它的电解液分解,还会让它的自放电更快,和正常电芯的差距越拉越大。可以说浮充环境天然会“放大”不一致。

第二,经常静置。储能系统很多时间处于待命状态,比如夜间、低负荷时段。静置时没有充放电电流,电芯电压会慢慢回落到开路电压,这时候是观察真实压差、做均衡的好窗口。如果系统只在充电时均衡,静置时的那一大段失衡时间就白白浪费了。

第三,对效率和热管理敏感。机房里的备用电源,长期带着均衡板跑,如果均衡本身在白白耗电,它就是在烧钱。主动均衡和被动均衡在这个维度上的差异非常明显,后面细说。

1.3 被动均衡和主动均衡的工程取舍

被动均衡的原理很简单:给高电压电芯并联一个电阻,把多余的能量以发热的形式耗掉,直到它和低电压电芯对齐。优点是电路极简、成本低,缺点是只能“放”不能“补”,均衡电流一般不超过100到200毫安,否则发热根本扛不住。在100安时级别的储能电芯面前,200毫安的均衡电流要把100毫伏压差拉平,可能要跑十几个小时,实际往往来不及。

主动均衡则通过电感、电容或者变压器把能量从高压电芯搬运到低压电芯,系统里能量总量不变,只是重新分配。我用MP2642GR-Z搭的就是这种方案。下面这张表可以直观看到两者的差异:

比较项被动均衡主动均衡
能量去向变成热量耗散转移到低电压电芯
均衡电流50~200mA,受散热限制可以做到1A甚至更高
只能放电还是可双向只能放电(放掉高的)双向,可抽高补低
系统效率本质是浪费85%以上能量被再利用
电路复杂度一颗电阻加一个开关功率电感、MOS、控制器
适合场景小容量消费电子储能、大型备电、动力电池

在储能和备电这种需要长期挂网、对效率和可靠性要求都高的场景,被动均衡那点成本优势完全被热管理和均衡能力的问题抵消。所以我的选择很明确:主动均衡,把能量转移当核心功能来做。

2. 硬件链路:MP2642GR-Z 怎么把能量从高电芯搬进低电芯

2.1 能量转移拓扑:Cell-to-Cell 的升降压核心

两个电芯串联,电压高的那节和电压低的那节之间,需要一个“能量搬运工”。我用型号为 MP2642GR-Z 的这款控制器来承担这个角色。它在电路里组成的核心是一个同步升降压单元,外部只需要一颗功率电感、两个半桥MOS和对应的采样、反馈网络。

工作过程可以这么理解:假设 B1 电压偏高,B2 电压偏低。控制器先让上桥臂导通,能量从 B1 流进电感,电感储能;随后切换导通状态,电感的电流方向保持、能量灌进 B2。通过调整开关占空比,就实现了电压高的一侧放电、电压低的一侧充电,而且是连续可调的。反过来,如果 B2 偏高而 B1 偏低,只需要把控制逻辑换成反向搬运即可。

这个方案为什么不用反激变压器,也不用电荷泵?核心原因是:电芯工作电压范围宽(磷酸铁锂2.5V到3.65V,三元2.8V到4.2V),电荷泵在宽范围下效率很难做高;反激变压器则体积大、漏感处理麻烦,在两个电芯之间做小功率均衡有点杀鸡用牛刀。升降压拓扑结构简单、元件少、效率高,1A均衡电流下能做到85%上下,骨架电感或者一体成型电感都很容易买到。

2.2 均衡电流与电感选型的计算过程

均衡电流设多大要算清楚。我一开始想过2A,但考虑到均衡回路长期运行、电感发热和PCB空间,最终定格在1A。2S电池组的均衡需求没有大系统那么迫切,1A已经比绝大多数被动均衡方案高出五到十倍。

电感的选择和开关频率绑定。MP2642GR-Z 的开关频率我通过外部电阻设定在250kHz,这是一个在噪声、体积、效率之间的折中。电感量的计算可以用Buck-Boost的纹波电流公式:

ΔI = V_in × D / (L × f)

以典型工作点为例:V_in = 3.5V,D ≈ 0.5,f = 250kHz,取 L = 22μH,则 ΔI ≈ 3.5 × 0.5 / (22×10⁻⁶ × 250×10³) ≈ 0.32A。电感峰值电流等于平均电流加纹波一半:1A + 0.16A ≈ 1.16A。所以电感饱和电流我留了四倍余量,选了5A饱和电流的22μH一体成型电感,DCR控制在20毫欧以内。这样的做法看似保守,但对长期挂网的储能设备来说,功率器件的热余量就是寿命。

限流怎么设定?在均衡功率回路里串一颗毫欧级采样电阻,用采样电压送到 MP2642GR-Z 的电流检测引脚,控制器内部比较器超过设定阈值就限制占空比增长。我把限流点设在1.2A,留出纹波余量,避免电感电流峰值触发过流保护导致误动作。

2.3 环路反馈和开关时序的细节

升降压电路最忌讳的是上下桥臂同时导通,一旦发生,输入电源直接被短路,轻则炸管,重则烧板。MP2642GR-Z 本身对这个有考虑,但外围电路仍然要配合做好三件事。

第一是死区。在占空比切换的边界,不能让互补的PWM信号同时为高,必须插入一段空白时间。软件配置死区参数的时候,我留了充裕的余量,宁可在死区时间内让续流二极管导通白白损耗一点点效率,也不要赌驱动延迟的极端波动。

第二是软启动。每次启动均衡回路,占空比从小往大爬升,避免瞬间的大电流冲击给MOS管和电容充电带来应力。MCU控制均衡使能引脚时,我加了一段斜坡:从零到目标电流按每毫秒增加约5%的节奏爬升。

第三是环路补偿。反馈分压电阻和补偿电容的取值直接影响环路稳定性,取值不当会出现电流振荡。我在反馈网络里依据数据手册给的参考值做初步设计,再在实测中用示波器看电感电流波形是否干净,最后根据波形微调补偿电容。

2.4 PCB布局:功率地、信号地和采样走线

这块板子第一次打样回来就给我上了一课。均衡功率回路走线太长,采样电阻的另一端直接接到MCU差分采样端,结果均衡一启动,PIC18F97J94 读到的电芯电压在示波器上能看到明显的台阶跳变,跳变量有八九个毫伏。毫伏级别的跳变对均衡判定来说非常致命,会让状态机误以为压差还在,一直均衡不停。

问题的根源是采样回路和功率回路共用地线。功率电感的电流是高频三角波,在地线上形成压降,这个压降直接污染了电压采样。改版时我做了三件事:把功率回路缩小成一个紧凑的环路,输入电容、MOS、电感、输出电容尽量贴在一起;采样走线采用开尔文连接,从电芯两端单独拉细线到MCU的ADC输入,不在功率地路径上取参考点;ADC的参考电压用精密基准供电,AVDD和DVDD之间串磁珠,电源平面单独铺一块小区域。

原则很简单:功率地是“脏地”,信号地是“净地”,两边在电源入口处单点接通。凡是采样精度要求高的系统,这条红线要刻在脑子里。

3. PIC18F97J94 的均衡大脑:电压采样、状态机与均衡策略

3.1 主控选型思路:为什么用单片机而不是专用AFE

市面上有不少专门的电池前端采样芯片,自带高精度ADC和均衡驱动,为什么我还要用PIC18F97J94这颗通用MCU来干这件事?原因有三。

第一,均衡策略的灵活性。专用AFE的均衡逻辑通常是“超阈值就开,到回差就关”,可调参数有限。储能系统需要根据充电、浮充、静置、放电不同阶段采取不同策略,甚至要支持上位机动态调整阈值,这些逻辑放在MCU里最顺手。

第二,外围接口丰富。PIC18F97J94自带段码LCD驱动能力,储能从控板上经常要显示电芯电压、均衡状态、报警代码,省掉了一颗显示驱动芯片。它同时还有多路模拟输入、定时器、UART、I2C和SPI,足够同时管理两节电芯的采样、均衡控制、温度采集和通信上报。

第三,系统级定位。在一个完整的储能BMS架构里,从控板通常不光是做均衡,还要负责电压温度采集、继电器状态、通信网关的对接。用一颗灵活的MCU,后期扩展功能的空间比专用AFE大得多。

3.2 ADC采样链路:差分测量、滤波与标定

两个串联电芯的电压测量,第二颗电芯(下侧)可以直接用分压电阻降压后送ADC,因为它的负端就是系统地,参考点清晰。第一颗电芯(上侧)的负端是中间点,电压一直在浮动,必须用差分方式测量。我的做法是用一组精密电阻把上侧电芯两端分压到一个共模电压可接受的范围,再接入MCU内部差分采样通道。

分压电阻选0.1%精度的低温漂型号,这个钱不能省。普通的1%电阻在30V温度范围内能漂出几毫伏,对均衡阈值来说就是不可接受的误差。软件层面再做两点标定:在板卡自检阶段用精密电压源灌入已知电压,校准分压比;运行时每100毫秒采集一次原始值做64次滑动过采样,低通截止频率压到个位数赫兹。这样做的效果是,均衡开关动作产生的微小扰动被平均掉,读到的一分钟级电压变化曲线非常干净,足以支撑5毫伏级别的均衡判定。

3.3 均衡状态机:充电、静置、放电不能一套逻辑走天下

储能系统的工作阶段不同,均衡策略也应该不同。我把状态机分成四个主状态:

主状态触发条件均衡策略说明
充电均衡充电机处于恒压或浮充阶段全速均衡,目标压差5mV充电电流本身会掩盖部分压差,必须配合充电机在恒压段拉长均衡窗口
静置均衡无充放电电流超过10分钟定时开启,均衡电流降为0.8A静置时电芯开路电压最能反映SOC差,是黄金均衡窗口
放电循检放电回路有电流默认关闭均衡放电时做主动均衡会额外消耗系统能量,只在压差异常偏大时开启保护性均衡
故障锁定过压、欠压、过温、采样异常强制关闭均衡并上报安全优先,宁可不均衡也不能带病运行

充电时我最看重的是“恒压末期”这一小段时间。充电机进入恒压阶段后电流逐渐下降,此时打开均衡,把高电芯能量搬给低电芯,能够显著拉齐两节电池的充满状态。静置时电芯电压已经稳定,此时做均衡可以准确判断真实差距,但系统处于待命状态,均衡电流不能太猛,我控制在0.8A,兼顾速度和发热。

3.4 迟滞控制与均衡结束判定

均衡最怕的是在阈值附近反复横跳。昨天下午我盯着日志看,发现压差在9到11毫伏之间来回抖动时,状态机会出现“开启30秒、关闭30秒、再开启”的振荡模式。这不但浪费能量,还会让输出功率母线上的电压波动变得非常难看。

解决办法是迟滞。开启阈值设在20毫伏,关闭阈值设在5毫伏。压差超过20毫伏才开始均衡,低于5毫伏就彻底结束,中间的15毫伏窗口是缓冲带。同时,状态切换后要经过最少60秒才能再次反向切换,从机制上杜绝振荡。实际运行时,压差只要被拉到5毫伏以内,均衡回路就安静地停在那里,系统再也不会出现那种“开了又关、关了又开”的尴尬状态。

4. 固件层面的均衡决策与保护逻辑

4.1 均衡决策的核心代码结构

固件这块我按分层来写:最底层是采样驱动,中间是状态机,最上层是策略控制。核心决策代码并不复杂,关键是每层的职责要分清楚。

// 伪代码:均衡决策主流程 void balance_task(void) { uint16_t v1_raw, v2_raw; float v1, v2, v_diff; v1_raw = adc_read_average(ADC_CH_B1, 64); v2_raw = adc_read_average(ADC_CH_B2, 64); v1 = calibrate_b1(v1_raw); // 查表校准分压比 v2 = calibrate_b2(v2_raw); v_diff = (v1 > v2) ? (v1 - v2) : (v2 - v1); switch (balance_state) { case BALANCE_IDLE: if (v_diff >= BALANCE_ON_THRESHOLD_MV) // 20mV { balance_target = (v1 > v2) ? BALANCE_B1_TO_B2 : BALANCE_B2_TO_B1; balance_state = BALANCE_RUNNING; balance_on_hold = 0; } break; case BALANCE_RUNNING: if (v_diff <= BALANCE_OFF_THRESHOLD_MV) // 5mV { balance_state = BALANCE_IDLE; balance_disable_pwm(); } else if (balance_check_fault()) { balance_state = BALANCE_FAULT; balance_disable_pwm(); } else { balance_apply_direction(balance_target); } break; } }

这个结构的好处是,均衡方向、阈值、动作逻辑全部集中在一个任务里,调试的时候只要看状态变量,就能判断板子到底卡在哪一步。我习惯把每次状态切换的时间戳和电压值记录到Flash日志区,这在排查异常历史时非常有用。

4.2 均衡时间和电荷量的工程估算

均衡到底要跑多久?这个问题在项目评审时必须给客户一个量化的预期。我一般这么估算:压差100毫伏大约对应多少容量差异,取决于电芯的SOC-OCV曲线斜率。磷酸铁锂在中段平台期很平,100毫伏压差对应的SOC差异可以到百分之二点五到百分之三;三元电芯平台相对斜,对应SOC差小一些。

按100安时电芯、压差120毫伏粗略估算,需要转移的电量大约2到3安时。均衡电流1A,考虑升降压效率85%,实际转移速率约0.85安时每小时,那么理论时间就是2.5到3.5小时。实测结果落在2.5小时附近,和估算基本吻合。这个估算公式我已经用在不同容量和不同压差的场景里,误差没超过百分之二十。在做上位机显示时,我会把这个预估时间动态更新给运维人员看,否则均衡过程在后台干跑几个小时,别人不知道进度会很焦虑。

4.3 保护逻辑:不能让均衡本身变成安全隐患

均衡是在搬运能量,但同时也是在给系统引入额外的功率回路,保护逻辑必须跟上。我把故障分三类处理。

第一类是电芯本身的异常。任一电芯过压(比如超过4.25V)或欠压(低于2.5V),立即停止均衡并上报,电压标签决定这是不是测量问题。第二类是热故障。均衡功率电感和MOS管附近放了一颗NTC,超过65度就降额,超过75度直接关闭均衡。第三类是通信故障。和主控的定期心跳如果中断,MCU要把均衡回路维持在安全状态而不是继续盲目运行,等待看门狗复位。

另外还有一个容易被忽略的细节:均衡方向上防止“帮倒忙”。如果系统判断B1电压高,结果B1其实只是瞬态虚高,开启均衡把它搬空了几百毫瓦时,等电压回落之后反而造成新的不平衡。所以我在开启均衡前要求连续三次采样(间隔5秒)都满足压差方向一致、大小超过阈值,才允许动作。这个“三连判断”帮我挡掉了很多瞬态干扰导致的假均衡。

4.4 与上位机和充电机的通信协同

储能系统的从控板不是孤岛,均衡状态需要上报,接收阈值指令也需要通道。PIC18F97J94 的UART我接到一块隔离RS485芯片上,报文格式采用简单的MODBUS子集:上位机可以读取两节电芯电压、均衡状态、累计均衡时间、故障代码,也可以下发开启/关闭均衡、修改阈值参数。

真正让系统好用的是与充电机的联动。在浮充阶段,如果均衡还在运转,说明两节电芯尚未拉齐,这时我会通过干接点给充电机一个“请继续保持恒压”的信号。充电机本来快要切浮充了,收到这个信号后会延长恒压时间,给均衡留出窗口。没有这个协同,均衡才跑了一半,充电机就切走了,压差拉不齐。

通信协议里我加上了一帧“预计剩余均衡时间”,由MCU按当前压差和容量估算后填进去。运维人员在监控画面上能直接看到“预计还需1小时20分”,体验和盲跑完全两个量级。

5. 实测数据与调试中容易踩的坑

5.1 均衡效果实测:从120毫伏压差到5毫伏

用两块标称100安时的磷酸铁锂电芯做测试,先放/充到一定SOC,人为制造出压差,然后静置半小时等电压稳定。初始状态:B1电压3.512V,B2电压3.392V,压差120毫伏。开启均衡后每30分钟记录一次数据:

时间点B1 (V)B2 (V)压差 (mV)均衡电流 (A)电感温度 (°C)
初始3.5123.3921201.0029
30分钟3.4683.435331.0036
60分钟3.4413.406351.0038
90分钟3.4183.393250.9839
120分钟3.4053.388170.9240
150分钟3.3853.38050.0033

150分钟压差收敛到5毫伏,均衡回路自动关闭。整个过程里电感最高温度42度,MOS温度47度,板子温升完全在可控范围。实测还发现一个有意思的现象:均衡开始的前30分钟压差下降最快,后面逐渐变慢。这是因为磷酸铁锂的OCV曲线在高端部分比较陡,电量稍微转移一点电压下降就很大,到平台区后又变缓。如果只看电压差来做判断,很容易在前期觉得效果好、后期觉得效果变差的错觉,实际上转移的电量是均匀的。

5.2 调试中遇到的两个典型问题

第一个坑是死区不足导致的交叉导通。第二版固件调PWM占空比时,我把死区参数设得太小,结果均衡启动瞬间电感发出尖锐的啸叫声,波纹明显变大。拆下来看MOS管表面温度在十几秒内飙到70度以上。处理方式是把死区时间从纳秒级往上调,直到覆盖驱动延迟的极端情况,啸叫消失,温度回归正常。这个教训告诉我,开关电源的可靠性问题,很多不是来自拓扑设计,而是来自时序边界没有留够余量。

第二个坑是ADC噪声和均衡开关动作的时序耦合。前面提到过采样地污染问题,改板解决后我发现即使地线没问题,均衡开关切换瞬间MCU的ADC读数还是会跳变几个毫伏。后来排查清楚:这是PWM开关时刻恰好落在ADC采样保持窗口里,电荷注入拉偏了采样电容。解决方案很朴素——PIC18F97J94 的采样触发信号在时间上错开均衡PWM边沿,确保采样点在开关动作完全结束后的稳定区间。实际效果立竿见影,读数最大跳动从8毫伏降到0.5毫伏以内。

第三个坑是阈值附近的振荡,已经在迟滞那一节专门讲过。这三个问题加起来,占据了整个调试周期的后半段。我的体会是:电池均衡系统真正考验人的地方,往往不在均衡算法本身,而在它和系统其他部分交互时的那些“小毛病”。

5.3 从两串扩展到多串的模块化思路

这套基于MP2642GR-Z的均衡单元虽然是为2S设计的,但它的模块化思路可以直接延伸到更大的系统。最简单的扩展方式是把“单节对单节的升降压单元”当成一个均衡模块,N串电池就级联N-1个这样的模块,每个模块处理相邻两串电池的差异。主控PIC18F97J94保留,只需要扩展采样通道和均衡使能控制线,就能管理更大规模的电池簇。

如果追求更少的器件数量,也可以把均衡单元设计成可切换通道的结构:MP2642GR-Z的输入端通过MOS开关矩阵接到电芯的各个抽头,同一时间只处理压差最大的那一对电芯。这样用一套功率回路配合多路开关,成本降低,但软件复杂度上升,切换时序和死区管理要做得很严谨。我的建议是,小规模系统优先用第一种,简单可靠;大规模系统再评估第二种,成本优势才会凸显。

实测跑下来,这套方案最让我满意的是均衡过程“沉得住气”:不追求快速拉到零压差,而是以稳定的电流、干净的状态切换、清晰的保护逻辑,把两节电芯的压差稳稳控制在5毫伏以内。对于储能和备用电源这种要跑很多年的系统,这种“稳”比“快”值钱得多。

最后分享一个容易忽视的小经验:均衡板的采样滤波时间常数不要做得太小。我试过为了“响应快”把RC低通截止频率压到1kHz以上,结果开关噪声全进来了,均衡判定被干扰得一塌糊涂。后来把截止频率放到几十赫兹级别,配合过采样,虽然每一次状态判断变得“迟钝”了一些,但整体运行的稳定性和最终收敛效果反而好了很多。电池的物理过程本来就慢,均衡策略跟着它的节奏走,才不容易出错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询