基于PIC24FJ与MP2642GR-Z的两串锂电池主动均衡方案

发布时间:2026/10/16 5:14:56
基于PIC24FJ与MP2642GR-Z的两串锂电池主动均衡方案
这块两串电池均衡板是我手里一套备用电源主控里最折腾的部分MCU选的是PIC24FJ128GA310功率级核心是MP2642GR-Z目标是让两节串联的锂电池在储能、备用电源系统里长时间保持电压一致。之所以把这部分单独拿出来写是因为很多人觉得两串电池只要被动均衡就够了实际做产品完全不是一回事——待机电流、均衡效率、开关时序、采样误差每一项都能把你按在地上摩擦。这篇文章就围绕这套方案把选型逻辑、硬件拓扑、PIC侧的代码状态机和实测中踩过的坑完整展开适合正在做两串到四串BMS、或者想搞明白DCDC型均衡器为什么比电阻放电型更适合储能场景的工程师参考。1. 两串电池组为什么必须有一套专门均衡策略1.1 不一致性从哪里来锂电池不是标准件哪怕同批次、同容量、同内阻档位出厂后每一节电芯的容量衰减速率、自放电率、内阻温漂也不会完全一致。真实原因是电芯内部SEI膜生长速度、电解液浸润程度、极片压实密度在微米尺度上存在随机差异这些差异在出厂测试里很难被完全筛掉。串联使用后同一个充放电电流流过每一节电芯容量小的电芯先充满、先放空容量大的电芯始终吃不饱于是压差随循环次数逐渐被放大。在备用电源和储能系统里这种不一致还会被使用模式加剧。备用电源大部分时间处于浮充或待机状态偶尔深度放电再长时间涓流充电。浮充期间电芯自放电差异会被充电管理电路持续补偿而深度放电后重新充电的过程会让容量偏小的电芯电压率先冲到截止值充电回路被切断其他电芯只能带着七八成电量待机。下个周期再放电短板电芯又最先进入欠压保护整个电池组的可用容量就这样被最差的一节电芯锁死。1.2 不均衡的实际后果可用容量被短板电芯锁死举个例子一组2S电池组电芯A实际容量2.0Ah电芯B实际容量1.8Ah两节串联。充电时B先到4.2V触发过充保护整组停止充电A只能充到约4.0V。放电时B先到3.0V触发过放保护整组停止放电A还剩约3.6V。整组容量由1.8Ah的B决定A那0.2Ah差价永远用不上。更麻烦的是B每次都被充到4.2V又被放到3.0V循环深度比A大得多衰减速度也更快压差会越拉越大。用数字说明更直观。假设两节电芯开路电压差为100mV放电平台在3.4V附近那么放电过程中均衡器不工作时低压电芯会提前约对应5%SOC的时间到达放电截止。对储能系统来说5%的容量损失往往就意味着产品标称容量不合格。在备用电源场景里这种损耗会导致备电时间不足直接触及验收红线。温度也是被很多人忽略的一个变量。均衡器工作与否会影响电池组的温度分布电阻放电型均衡器在均衡电流较大时会在PCB和电芯表面产生局部热斑加剧电芯老化。主动均衡器发热小但拓扑复杂成本高。两串系统价值量低很难塞进一片昂贵的专用均衡芯片所以用通用DCDC芯片加一颗带ADC的MCU来做是成本、性能、可靠性的平衡点。1.3 被动均衡和主动均衡的选择市面上大部分两串保护板用的都是被动均衡即每节电芯并联一颗几十到几百欧姆的放电电阻和一颗MOS开关。电压高的电芯通过电阻持续放电直到压差落入阈值。优点是便宜、简单、可靠缺点是均衡电流受限通常只有50mA到150mA。压差大或电芯容量大时均衡时间可能长达数小时。能量全部转化为热量均衡期间电芯温度升高靠近热敏电阻的采样值会漂移。电芯电压越高均衡越难启动因为高电芯放电后电压下降很快进入滞环停止均衡但容量差还在下次充电又会拉开压差。主动均衡则把能量从高电压电芯转移到低电压电芯而不是放掉。能量转移效率可以做到60%到85%均衡电流可以设计成300mA到1A时间短发热小。缺点是电路复杂、成本高、需要软件控制。市面上的专用主动均衡IC价格不低而且在两串这个档位上可选择余地很小。用MP2642GR-Z这种通用升压芯片搭建能量转移通路再搭配PIC24FJ128GA310做采样和控制正好绕开了专用IC的选型限制也把BOM成本压了下来。2. MP2642GR-Z 和 PIC24FJ128GA310 的分工与拓扑推演2.1 先说清楚为什么选这两颗芯片MP2642GR-Z是一颗业内常见的同步升压变换器内部集成了功率开关管输入电压范围宽开关频率固定外围只需要电感、电容和反馈电阻就能搭出稳定的升压电源。我最初看中它是因为它的使能脚控制逻辑简单静态电流低适合备用电源这种对待机功耗敏感的场景。把它的反馈网络从默认的LED恒流接法改成电阻分压恒压接法它就能输出一路稳定的直流母线电压。PIC24FJ128GA310则是一颗资源非常充裕的16位MCU128KB闪存12位ADC多个PWM模块还内置LCD驱动。这个项目里我不用外挂LCD驱动芯片直接驱动段码屏显示每节电芯电压和均衡状态节省了PCB面积和底层通信开销。ADC的采样速率虽然不高但对直流电压采样和均衡控制来说完全够用而且它的内部参考电压温漂指标在这个价位算不错的适合做电池电压检测。选型时还有一个考虑两串系统的控制板不能太占空间MCU要能直接驱动LED指示灯和段码屏所以默认不带LCD驱动的通用MCU反而要加成本。PIC24FJ128GA310一个芯片全包加上MP2642GR-Z外围器件少整个控制板能控制在名片一半大小以内。2.2 为什么单级boost方案在我这里走不通刚开始设计时我走了一段弯路想直接把高电压电芯接到MP2642GR-Z的输入通过升压输出给低电压电芯充电。逻辑上看似乎可行因为低电压电芯需要补充能量高电压电芯是能量来源。但仔细算一下就知道问题在哪。假设电芯A电压4.05V电芯B电压3.80V目标是给B充到3.90V。MP2642GR-Z是boost拓扑输出电压必须高于输入电压。如果输入接A4.05V输出目标是3.90V输出低于输入boost拓扑根本无法稳压输出会直接跟随输入电流失去控制轻则均衡无效重则给B过充。反过来如果从低压B取电升压给A充电升压拓扑倒是能工作但能量从低压电芯流向高压电芯等于放电时把B的能量搬给A加剧了不均衡方向完全反了。这个问题本质上是boost拓扑的单向升压特性与均衡方向需求之间的矛盾。均衡要求能量从高电压侧转移到低电压侧等效于一个双向的buck-boost行为。用普通单向boost实现双向均衡必须在中间加能量缓冲环节先把高压侧的能量抽出来储存再受控地释放到低压侧。这就是我最终采用“升压母线储能电容受控放电”两级结构的原因。2.3 最终拓扑升压母线加受控放电最终的均衡链路分成两步第一步从电压较高的电芯取电MP2642GR-Z把电压升到一个固定的母线电压比如5V给母线电解电容充电。第二步PIC检测到母线电容电压到位后关闭升压打开放电通路母线电容通过降压限流网络把储存的能量灌入电压较低的电芯。这个两级结构的好处是每一级都可以独立优化。第一级只要做好恒压升压不需要关心目标电芯的电压变化第二级用PWM控制放电时间和平均电流能精确控制转移电量避免过充。母线电压选得比两节电芯的最高电压都高所以无论哪一节电芯当前电压是多少放电通路始终满足“母线电压高于目标电芯电压”的降压条件方向永远可控。能量转移效率等于升压效率乘以放电降压效率。第一版放电通路用限流电阻加MOS开关效率只有60%左右后来改成小电感加PWM降压效率提到了80%上下。对均衡应用来说这个效率已经够用因为均衡不是持续满载运行一个均衡周期往往只有几十秒到几分钟大部分时间系统处于待机状态。3. 硬件实现从电芯采样到母线放电的实测电路3.1 电压采样和温度保护两节电芯串联的电压采样要特别注意共模电压问题。电芯B1的负端是系统地正端直接是中间节点电芯B2的正端是电池组正极电压可能是B1和B2的叠加。如果直接用MCU的ADC引脚去采样B2正端电压引脚承受的电压超过ADC参考范围直接烧引脚。所以我用了两个精密电阻分压把每节电芯的电压按比例降到ADC量程内的1.2V附近同时并联RC低通滤波器滤除开关噪声。分压电阻选了1%精度、温度系数50ppm的薄膜电阻并且每条采样通路增加了一颗3.3V的TVS管。TVS的作用不是防静电而是防止MP2642GR-Z开关节点在极端情况下通过寄生路径把高压脉冲耦合到ADC输入。采样通路的地线做成了独立的地平面小岛和功率地单点连接避免功率电流在采样地上形成压降。温度保护方面我在两节电芯的中间位置放了NTC热敏电阻通过一个10kΩ电阻分压接到PIC的ADC。NTC的放置位置很关键不能贴近均衡功率器件否则测到的是板温而不是电芯温度。实测下来把NTC贴在电芯外壳表面、并且用导热胶固定之后温度读数才真正反映了电芯状态。3.2 MP2642GR-Z 周围电路MP2642GR-Z的核心外围是输入电容、功率电感、输出电容和反馈电阻。我按照常规升压电路来设计输入用了22μF陶瓷电容就近放在芯片电源输入脚旁边功率电感选择6.8μH、饱和电流大于2A的一体成型电感输出端用了22μF陶瓷电容再加470μF电解电容作为母线储能。反馈网络是这颗芯片从LED驱动改造成恒压源的关键。芯片内部反馈基准约为0.6V输出电压由分压电阻决定公式是Vout等于基准电压乘以1加上下分压比。我选取上电阻499kΩ、下电阻68kΩ算出输出电压约5.0V。这里要注意的是反馈网络必须从输出电容正端单独走线到反馈脚不能就近从输出铜箔上断开采样否则负载电流在铜箔上的压降会让实际输出电压偏低误差可能超过100mV。使能脚直接由PIC的GPIO控制高电平开启升压低电平关闭。关闭状态下MP2642GR-Z的静态电流很小整个均衡板待机电流可以压到几十微安级别对备用电源来说很友好。实际测试中EN脚不能浮空也不能用大电阻下拉因为升压芯片在轻载时可能会因为使能脚的寄生电容耦合而导致误触发我用一颗100kΩ电阻把EN脚默认拉低再由PIC输出驱动。3.3 放电通道和开关互锁放电通道是这套电路里安全风险最高的部分。母线电容上的5V电压通过一个开关管和一个限流网络连接目标电芯。如果开关管时序没处理好轻则把两节电芯并联短路重则烧板。我设计了两个独立放电回路分别对应给B1充电和给B2充电两个回路用同一个母线电容。每个放电回路由一颗P沟道MOSFET做高边开关串接一颗小电流采样电阻和一颗功率电感通过PIC的PWM调占空比控制平均电流。MCU控制时序上最关键的是切换放电方向时必须先关闭当前回路的所有MOS管等一个死区时间之后再打开另一个回路的MOS管。我在代码里用一个互锁函数统一管理任何状态下先调用“关闭全部开关”再根据目标方向使能对应引脚。死区时间留了10ms比MOS管的开关延迟大一个数量级确保不会出现两个放电MOS同时开启的瞬间。另外我还加了一个硬件上的保护逻辑母线电容正极通过一枚电阻连接到中间节点上用一个比较器检测母线电压是否异常偏高。如果发现母线电压超过5.5V强制拉低EN脚并关断所有放电MOS防止升压失控。这个逻辑在MCU死机或者程序跑飞时依然有效是整个板子最后的安全兜底。3.4 电源和PCB布线上容易翻车的地方这套设备的PCB布局有几个重点第一次画板子的朋友最容易在这几处翻车。首先功率地必须和信号地分开。升压芯片的开关电流回路也就是输入电容、功率电感、输出二极管以及芯片内部的功率地其峰值电流很大如果和ADC采样的地混在一起采样电压会跳动几十毫伏均衡阈值判断就会失真。我的做法是单点接地所有功率地汇聚到输入电容的负端然后单独引一条线到MCU的AGND。其次母线电容的摆放位置要靠近放电MOS管。母线电容距离MOS管太远时寄生电感会在开关瞬间产生电压尖峰轻则MOS管体二极管提前导通重则击穿功率管。我实测下来母线电容和MOS管之间的距离超过10mm后尖峰明显变大最终把两者放在同一面间隔不超过5mm。还有一个容易被忽略的是电感选型。升压级电感不能只看标称电流要看饱和电流。MP2642GR-Z在均衡启动时峰值电流会高于平均电流如果电感饱和电流余量不足电感值会瞬间跌落造成输出纹波变大甚至啸叫。我选的电感饱和电流是平均工作电流的2.5倍以上实测没有再出现啸叫问题。下面是关键器件BOM表供参考器件型号/规格用途备注主控MCUPIC24FJ128GA310采样、控制、显示12位ADC内置LCD驱动升压芯片MP2642GR-Z升压母线反馈网络改为恒压配置功率电感6.8μH/2A升压储能饱和电流需留余量母线电容470μF/10V 电解储能缓冲靠近放电MOS放置放电MOS低压P沟道MOS放电开关两路独立互锁控制采样分压电阻1%/50ppm 精密电阻电芯电压分压配RC滤波和TVS热敏电阻10kΩ NTC温度采样贴电芯表面安装4. PIC24FJ128GA310 侧的程序结构状态机比PID更靠谱4.1 采样与滤波PIC24FJ128GA310的12位ADC对直流采样来说是够用的但直接读原始值不行。开关电源的纹波、MOS管开关瞬间的耦合噪声都会叠加在采样值上。我在100ms的采样周期里连续读取16次去掉最大和最小值后取平均得到一个相对稳定的电压读数。这个滤波算法开销很小实测能把峰峰值干扰从30mV压到3mV以内。电压采样还需要校准。两节电芯的分压电阻有1%误差采样结果可能偏差几十毫伏直接作为均衡判据会误动作。我做了简单的两点校准用可调电源分别输入4.0V和3.0V记录ADC原始值算出每节电芯的增益和偏置校准系数存在FLASH里上电时读取。校准之后采样精度能到正负15mV以内均衡判断就可靠多了。温度采样同样经过滤波但温度变化慢不需要100ms采一次。我把温度采样放到一个慢速定时器里每秒钟读取一次只在温度超过60度时触发保护平时不参与均衡控制避免温度瞬态波动导致均衡频繁启停。4.2 均衡判向与滞环均衡方向判断的核心是滞环控制。简单做法是当压差超过启动阈值时就开启均衡当压差跌到另一个较低阈值时停止。如果不加滞环压差在阈值附近抖动均衡器会反复启停母线电容反复充放电MOS管不停切换系统发热和噪声都会增加。我设置的启动阈值是35mV停止阈值是10mV。也就是说当两节电芯电压差大于35mV时就开始均衡当压差被均衡到10mV以下时停止。这25mV的滞环窗口足够大不会被采样噪声干扰也不会让均衡过头。均衡方向也有讲究。进入均衡时先看当前哪节电压高哪节电压低然后让高电压电芯给母线电容充电再把母线电容的能量放到低电压电芯。方向判断每隔一个完整的充放电周期更新一次不会在单个周期中间切换方向这是为了避免在母线电容还有残余能量时改变目标造成不可控的电流冲击。4.3 状态机和PWM放电控制程序主体是一个经典的五状态状态机IDLE、PRE_CHARGE、CHARGING_BUS、DISCHARGING_B1、DISCHARGING_B2。IDLE状态里所有开关关闭只做采样和监控PRE_CHARGE状态做方向决策CHARGING_BUS状态启动MP2642GR-Z给母线充电DISCHARGING_B1和DISCHARGING_B2分别表示把母线能量放入对应电芯。放电阶段的PWM控制是这套代码里最巧的部分。我没有用复杂的恒流算法而是用一个固定频率的PWM加上电流检测反馈每个PWM周期内通过低侧采样电阻读取放电电流如果平均电流高于设定值就减小占空比如果低于设定值就增大占空比。这个简单的PI调节在均衡这种缓慢动态场景下非常稳定实测电流波动能控制在正负15mA以内。核心代码结构大致如下typedef enum { BMS_IDLE, BMS_PRE_CHARGE, BMS_CHARGING_BUS, BMS_DISCHARGING_B1, BMS_DISCHARGING_B2 } bms_state_t; void bms_process(void) { switch (state) { case BMS_IDLE: sample_all(); delta get_cell_delta_mv(); if (delta BALANCE_START_MV) { balance_dir decide_direction(); // 返回TO_B1 或 TO_B2 state BMS_PRE_CHARGE; } break; case BMS_PRE_CHARGE: disable_all_mos(); delay_ms(10); state BMS_CHARGING_BUS; break; case BMS_CHARGING_BUS: enable_mp2642_boost(); if (get_bus_voltage_mv() BUS_TARGET_MV) { disable_mp2642_boost(); state (balance_dir TO_B1) ? BMS_DISCHARGING_B1 : BMS_DISCHARGING_B2; } break; case BMS_DISCHARGING_B1: enable_discharge_mos(B1); run_pwm_flow_control(); if (get_cell_delta_mv() BALANCE_STOP_MV) { disable_all_mos(); state BMS_IDLE; } break; case BMS_DISCHARGING_B2: enable_discharge_mos(B2); run_pwm_flow_control(); if (get_cell_delta_mv() BALANCE_STOP_MV) { disable_all_mos(); state BMS_IDLE; } break; } }这里面有个细节CHARGING_BUS转入DISCHARGING_B1或B2之前必须先等母线电容的电压稳定。如果刚达到目标值就立刻放电母线电容电压会瞬间跌落电路产生电流冲击。我实际加了30ms等待时间用ADC连续读三次母线电压确认都在目标区间后才切换。4.4 故障保护故障保护优先级高于状态机。每50ms跑一次故障检测函数只要任何一条故障条件满足就无条件强制回到IDLE状态关闭所有功率开关。主要故障条件有四类单节电芯过压超过4.25V欠压低于2.8V均衡电流持续超过额定值且无法通过PWM调节回落以及NTC温度超过60度。每种故障都记录到独立的故障标志位通过段码屏显示对应错误码。使用备用电源系统的人看到错误码能快速定位问题这个在量产阶段非常重要。另外代码里有一个看门狗靠它来兜底极端情况。如果主循环卡死超过500ms看门狗自动复位MCU复位后所有功率引脚默认配置为高阻输入不会自动恢复开启状态必须等待下一次上位机指令或按键唤醒。这样即使软件跑飞均衡功率级也不会自己乱动。5. 实测记录效率、纹波和几处要回避的现场问题5.1 均衡效率和转移速度用可编程负载做了完整测试。电池组模拟压差状态B1电压3.95VB2电压3.60V压差350mV。系统启动均衡后一个完整周期大约是1.2秒其中母线充电600ms放电500ms状态切换和采样100ms。每个周期从B1抽出的能量约为5V乘以0.35A乘以0.6秒约1.05焦耳扣除升压效率和放电降压损耗实际转移到B2的能量约0.85焦耳。按照350mV压差计算再结合等效电容实测把压差从350mV拉到50mV以内大约需要4分钟这个速度远快于被动均衡的十几分钟到一个小时。效率方面升压级实测效率约87%放电PWM级约91%综合效率约79%。虽然远不如专用均衡IC的90%以上但在两串这个成本档位已经可以接受。均衡功率本身不大所以热量也不高连续跑10分钟MOS管外壳温度只比环境温度高8度左右。5.2 波形和纹波母线电压在均衡周期内的波形值得看一眼。MP2642GR-Z升压输出的纹波在满载时约为30mV但与独立负载不同母线电容在放电阶段会被快速拉低所以实际波形不是稳定的平线而是充电时上升、放电时下降的锯齿波。只要PIC在CHARGING_BUS状态判定的目标电压设得比放电所需的门限高约300mV就不会出现放电到一半母线电压低于目标电芯电压、导致电流反向的情况。放电电流波形在MOS开关切换瞬间有一个过冲。第一版硬件没有在MOS管源极加RC吸收过冲峰值达到了设定值的1.8倍持续约几微秒。给MOS管两端并上RC吸收网络之后过冲降到1.1倍以内。在备用电源场景里这个微秒级过冲不会影响电芯寿命但长期可靠性测试中容易让采样电路里的TVS管提前疲劳所以还是处理掉为好。5.3 我踩过的三个坑第一个坑是母线电容选大了。最初用了三个2200μF电解并联结果放电阶段初期电流过大低电压电芯的电压瞬间被抬升几十毫伏导致均衡判据误判系统提前进入IDLE压差始终降不下来。后来把母线电容改成470μF问题解决。这提醒我储能电容不是越大越好要结合放电PWM的占空比调节能力来选电容太大会让最低放电电流难以控制。第二个坑是采样地线。第一版PCB的采样地紧挨着MP2642输入电容的负端焊盘均衡工作时采样值跳变最大45mV。最初还以为是ADC参考电压问题后来用示波器测量采样地到AGND之间的噪声才定位根源是功率回流在铜箔上产生的压降。把采样地改成单点汇接到电芯负端之后跳变降到3mV以内。这个教训在所有BMS类项目里都适用。第三个坑是均衡方向切换时的MOS互锁做得太粗糙。第一版代码只有软件延时没有在切换前关闭全部MOS。某次调试时一个未预期的外部中断打乱了时序B1放电和B2放电两个回路在极短时间内同时打开母线电容直接给两节电芯同时放电电流瞬间达到2A烧掉了一颗放电MOS管。从那之后互锁函数在任何入口处都先关闭全部MOS然后用硬件死区保证切换安全再没有发生过这类问题。5.4 后续可以扩展的方向这套拓扑还有一个很自然的扩展方向把两节电芯的均衡扩展到四节或更多。结构上不需要增加新的MP2642只需要把母线电容切换网络做成多路复用由PIC分别控制每个电芯对应的充电开关和放电开关。每节电芯都通过一个交叉开关矩阵接入公共母线任意高压电芯都能向母线充电任意低压电芯都能从母线取电。交叉开关管数量会随电芯数量增加但控制逻辑本质上还是这套状态机。另一个扩展是通信。PIC24FJ128GA310片上资源足够可以加一路I2C或UART接口把每节电芯的电压、温度、均衡状态上报给系统主控方便储能系统做更上层的数据记录和告警。我在目前的备用电源样机上已经预留了这个接口后续可以接蓝牙模块做手机端监控。从实际体验来看用MP2642GR-Z这种通用升压芯片做两串电池均衡最大的价值不是性能指标有多惊艳而是把BOM成本压到了专用均衡IC的一半以下同时保留了完全可控的软件灵活性。基于这个平台后续换电芯化学体系、改均衡阈值、调放电电流都只需要改代码参数不需要改硬件迭代速度比买现成均衡模块快得多。如果你也在做类似的小型储能或备用电源产品这套“升压母线加受控放电”的思路可以直接拿过去试。