两串电芯被动均衡实战:MP2642GR-Z与PIC18F86J50储能BMS设计
1. 从两个串联电芯的电压差说起为什么被动均衡在储能场景里依然能打储能和备用电源系统里两串电芯的架构是最常见也最容易被低估的一种。很多人一听到均衡两个字第一反应就是上主动均衡、上电感、上变压器觉得被动均衡又土又费电。但真到了实际项目里尤其是中小功率的备用电源、便携储能、通信基站后备电池这类场景被动均衡反而是最稳、最省心、最容易过认证的方案。我这次做的项目就是用 MP2642GR-Z 配合 PIC18F86J50对两个串联电池单元做均衡管理整套方案跑下来成本、可靠性、开发周期都控制得不错。先把场景说清楚。两串电芯串联标称电压通常在 7.4V 左右磷酸铁锂两串约 6.4V三元两串约 7.4V充电时最高可能到 8.4V 甚至 7.3V铁锂。问题在于两颗电芯出厂容量、内阻、自放电率就不可能完全一致用久了差异还会放大。充电时容量小的那颗先到上限如果继续充它就会过充放电时它又先到下限整组被迫提前截止。结果就是整组可用容量被最弱的那颗电芯拖死循环寿命也跟着缩短。均衡要解决的就是这个木桶短板问题。那为什么选被动均衡因为两串场景下能量转移的收益其实很有限。主动均衡电路复杂、成本高、EMI 难搞还要额外的电感和控制逻辑。而被动均衡只需要在电压高的那颗电芯上并一个耗散电阻把多出来的那点能量以热的形式放掉电路简单到几乎不会出错。对于容量不大、均衡电流需求在几十到几百毫安级别的备用电源系统被动均衡的性价比是压倒性的。MP2642GR-Z 这颗芯片在这里扮演的是电池管理前端的角色。它负责采集每颗电芯的电压、控制均衡开关、提供过压欠压保护还能通过 I2C 或者类似的数字接口把数据吐给主控。PIC18F86J50 则是主控 MCU负责读取前端数据、做均衡策略判断、管理充放电状态、跟上层系统通信。一个管模拟前端一个管逻辑决策分工非常清晰。提示两串被动均衡最容易踩的坑不是电路本身而是均衡阈值和回差设置。设得太窄电芯电压稍微抖一下就反复开关均衡电阻发热还浪费电设得太宽均衡又起不到作用。后面我会详细讲这个参数怎么定。这套方案适合谁适合做中小功率储能、备用电源、便携设备电池包的工程师尤其是那些不想在均衡电路上花太多精力、但又必须保证电池组一致性和安全性的项目。如果你正在用分立方案搭两串保护板或者用通用 MCU 加运放自己采电压那这套 MP2642GR-Z PIC18F86J50 的组合值得认真看一下。2. MP2642GR-Z 到底能干什么前端芯片的能力边界与选型逻辑2.1 这颗前端芯片的核心功能拆解MP2642GR-Z 是一颗面向多串电池管理的前端芯片虽然具体寄存器细节要看数据手册但从它的定位来看核心能力集中在几个方面电芯电压采集、均衡开关驱动、保护阈值判断、以及数字通信接口。对于两串应用它天然支持不需要额外堆叠。电压采集这块它内部有多路 ADC 或者类似的采样通道能分别测量每颗电芯的正负极电压。这里有个细节要注意两串电芯是叠在一起的第二颗电芯的负极就是第一颗的正极所以采集第二颗电压时不能用普通的地参考方式必须用差分或者高压侧采样。MP2642GR-Z 内部已经处理好了这个电平移位问题你只需要把每颗电芯的采样线接对就行。均衡驱动方面它一般会提供专门的栅极驱动或者开漏输出用来控制外部均衡 MOSFET。为什么要外置 MOSFET 而不是内置因为均衡电流可能到几百毫安内置开关的导通电阻和散热扛不住外置一颗小功率 N-MOS 或者 P-MOS 更灵活散热也好处理。均衡电阻的选型后面单独讲。保护功能上它通常支持过压、欠压、过流等阈值判断有些型号还能配置延迟时间。这些保护是硬件级别的响应速度比 MCU 软件轮询快得多对于电池安全至关重要。PIC18F86J50 再快也有中断延迟和任务调度真正要命的过压瞬间还是得靠前端芯片自己扛。2.2 为什么不用通用 MCU 直接采电压做均衡有人会问两串而已我用 PIC18F86J50 的 ADC 直接采两颗电芯电压再控制两个 MOSFET 不就行了理论上可以但实际做起来问题不少。第一共地问题。MCU 的 ADC 是以系统地为参考的采第一颗电芯没问题采第二颗时它的负极不是地你得用差分放大器或者电阻分压网络把电压搬移下来。分压网络会引入误差还会持续耗电差分放大器增加成本和板面积。第二精度和温漂。MCU 内部 ADC 的绝对精度和温漂通常不如专用前端芯片电池电压采集要求的是长期稳定不是实验室里读个数就完事。第三保护响应。软件轮询有周期遇到突发过压等 MCU 反应过来可能已经晚了。专用前端芯片是硬件比较器微秒级响应。所以选 MP2642GR-Z 这类前端芯片本质上是把采集精度、保护速度、电平移位这三件麻烦事交给专业芯片MCU 只做策略和通信。这是分工不是浪费。2.3 两串应用下的引脚与外围配置思路两串应用的接线逻辑其实不复杂但有几个点必须注意。电芯正负极要按顺序接到前端芯片的对应通道上中间那颗电芯的节点是共享的。均衡 MOSFET 的漏极接电芯正极源极通过均衡电阻接电芯负极栅极由前端芯片驱动。这样当开关导通时电阻并联在电芯两端电流流过电阻发热电芯电压被拉低。均衡电阻的选型要算功率。假设均衡电流目标 100mA电芯电压 4.2V那电阻就是 4.2V / 0.1A 42Ω功率是 4.2V × 0.1A 0.42W。实际选型要留余量至少用 1W 的电阻而且不能只看稳态还要考虑占空比。如果均衡是间歇工作的平均功率会低一些但峰值功率必须扛得住。封装上0805 电阻通常只有 0.125W扛不住得用 1206 甚至 2512或者用两颗并联分流。注意均衡电阻不要贴着电芯或者温度敏感器件放。它发热是实打实的布局时留出散热空间必要时铺铜散热。我见过有人把均衡电阻放在电芯旁边结果均衡一开电芯温度传感器读数直接飘了保护逻辑跟着乱。3. PIC18F86J50 在均衡策略里的角色不只是读数据3.1 主控要做的三件事采集、决策、执行PIC18F86J50 在这套系统里不是简单的读寄存器然后打印它要完成一个闭环。第一周期性通过 I2C 读取 MP2642GR-Z 的电芯电压、电流、状态寄存器。第二根据电压差和系统状态判断是否需要均衡、均衡哪一颗、均衡多久。第三控制均衡的启停同时管理充电状态、故障处理、与上层通信。采集周期很关键。太快了没必要电芯电压变化是慢过程100ms 到 500ms 读一次完全够用。太快反而增加总线负载和功耗。我一般设 200ms 一次兼顾响应和功耗。读取时要连续读多颗电芯的电压确保是同一时刻的数据否则电压差计算会失真。有些前端芯片支持同时采样锁存MP2642GR-Z 如果有这个功能一定要用上。决策逻辑是核心。最简单的策略是充电时如果最高电芯电压超过均衡阈值且最高和最低的压差超过死区就开启最高那颗的均衡。放电时一般不均衡因为放电时能量本来就紧张再耗散掉更亏。待机时如果压差大可以间歇均衡但要注意别把电放光。执行层面PIC18F86J50 通过 I2C 写前端芯片的均衡控制寄存器或者直接控制 GPIO 驱动外部均衡开关。具体看 MP2642GR-Z 的接口设计。如果是写寄存器要注意写入后的生效时间有些芯片有延迟别写完立刻读状态发现没变就以为失败了。3.2 均衡阈值和回差最容易拍脑袋拍错的地方均衡阈值怎么定很多人直接抄别人的 4.2V 或者 3.6V这是不对的。阈值要跟电芯化学体系匹配。三元锂电芯满电 4.2V均衡阈值一般设在 4.15V 到 4.18V留一点余量防止过充。磷酸铁锂满电 3.65V均衡阈值设在 3.55V 到 3.6V。阈值太低电芯还没充满就开始均衡充电时间被拉长阈值太高弱电芯已经过充了还没开始均衡。回差滞回更重要。假设阈值设 4.15V如果没有回差电芯电压在 4.15V 附近抖动时均衡会反复开关MOSFET 和电阻频繁承受冲击寿命受影响还会产生噪声。回差一般设 20mV 到 50mV也就是开启阈值 4.15V关闭阈值 4.10V 或 4.12V。这样一旦开启要等电压降到关闭阈值以下才停避免抖动。压差死区也要设。两颗电芯压差小于比如 30mV 时没必要均衡因为这点差异对容量影响微乎其微均衡反而浪费能量。压差死区设 20mV 到 50mV 比较合理具体看电芯一致性和系统对均衡精度的要求。参数三元两串典型值铁锂两串典型值说明均衡开启阈值4.15V3.55V单颗电芯电压均衡关闭阈值4.10V3.50V回差约 50mV压差死区30mV30mV低于此值不均衡均衡电流50-150mA50-150mA由电阻决定采集周期200ms200msI2C 读取间隔3.3 状态机设计别让均衡和充电打架均衡和充电的关系要理清楚。充电过程中均衡是合理的因为弱电芯先到阈值均衡它旁边的强电芯其实是均衡电压高的那颗能让整组继续充。但要注意均衡开启时那颗电芯的电压会被拉低一点如果充电器是按整组电压判断截止的可能会误判。所以均衡策略要和充电器逻辑配合。我的做法是充电时如果某颗电芯超过均衡阈值且压差超死区开启该颗均衡同时把充电电流适当降低避免均衡电阻和充电电流叠加导致局部过热。放电时关闭所有均衡。待机时如果压差超过更大死区比如 100mV开启间歇均衡每次均衡 10 秒停 30 秒观察电压恢复情况。故障处理也要有。如果前端芯片报告过压、欠压、过温MCU 要立即关闭均衡切到安全状态并记录故障码。均衡电阻开路或 MOSFET 短路可能导致某颗电芯一直被放电这是危险故障要通过电压异常下降来检测。4. 硬件落地从原理图到 PCB 的实操细节4.1 采样线怎么走开尔文连接不是可选项电芯电压采样最怕的是线阻和接触电阻。均衡电流流过路径时如果采样点和均衡电流路径共用一段走线采样到的电压就会包含线阻压降导致电压读数偏高或偏低。正确做法是开尔文连接采样线从电芯极耳单独引出不经过均衡电流路径。具体到 PCB 上每颗电芯的正负极采样点要尽量靠近电芯连接器采样走线细一点没关系因为采样电流极小。均衡电流路径要粗和采样路径分开最后在电芯连接器处汇合。如果板子空间允许采样线走内层均衡线走外层减少耦合。提示连接器和线缆的接触电阻会随时间和振动变化。如果发现某颗电芯电压读数偶尔跳变先查连接器别急着怀疑芯片。我遇到过好几次都是端子压接不良导致的。4.2 均衡 MOSFET 和电阻的布局散热均衡 MOSFET 选 N-MOS 还是 P-MOS 取决于前端芯片的驱动能力。如果 MP2642GR-Z 提供的是高侧驱动用 P-MOS 更方便如果是低侧驱动用 N-MOS。导通电阻 Rds(on) 要小减少自身发热。比如 100mA 电流Rds(on) 100mΩ功耗才 1mW可以忽略但如果 Rds(on) 1Ω功耗 10mW虽然不大但加上电阻的 0.4W整体热设计就要考虑。电阻布局要分散不要两颗电阻紧挨着。如果两颗同时均衡虽然两串场景下一般只均衡一颗热量叠加。电阻下方铺铜通过过孔把热量导到背面或内层。如果板子有金属外壳可以用导热垫把电阻热量传到外壳。4.3 电源和地去耦别让数字噪声污染模拟采集MP2642GR-Z 的供电要干净。它内部有 ADC 和比较器电源纹波会直接影响采集精度。VCC 引脚旁边放 1uF 和 100nF 电容尽量靠近引脚。如果芯片有单独的模拟电源引脚用磁珠或电感隔离数字电源。地平面处理上模拟地和数字地单点连接连接点选在芯片下方。PIC18F86J50 的数字开关噪声大它的地去和前端芯片的模拟地分开走最后在电源入口处汇合。I2C 走线要短上拉电阻靠近主控避免长走线引入干扰。5. 软件实现I2C 通信、均衡控制与异常处理5.1 I2C 读写前端芯片的时序要点PIC18F86J50 的 I2C 外设配置要注意时钟频率。MP2642GR-Z 支持的 I2C 速率看数据手册一般 100kHz 或 400kHz。两串系统数据量不大100kHz 足够抗干扰也更好。上拉电阻选 4.7kΩ 到 10kΩ太大上升沿慢太小功耗高。读电压的流程通常是发送从机地址和寄存器地址重复起始条件读回数据。注意有些前端芯片的电压寄存器是 16 位高字节低字节要拼对。拼错的话电压值会离谱比如 4.2V 读成 0.2V 或者 20V。建议先读一颗已知电压的电芯校准。写均衡控制寄存器时要注意写保护或者解锁序列。有些芯片要求先写特定密钥才能改均衡配置防止误操作。写完等几个毫秒再读状态确认。// 伪代码示例读取两串电芯电压 uint16_t read_cell_voltage(uint8_t cell_index) { uint8_t reg_addr (cell_index 0) ? CELL1_VOLT_REG : CELL2_VOLT_REG; uint8_t buf[2]; i2c_start(); i2c_write(MP2642_ADDR 1); // 写地址 i2c_write(reg_addr); i2c_restart(); i2c_write((MP2642_ADDR 1) | 1); // 读地址 buf[0] i2c_read_ack(); buf[1] i2c_read_nack(); i2c_stop(); return (buf[0] 8) | buf[1]; }5.2 均衡控制的软件状态机状态机我一般分四个状态IDLE、MONITOR、BALANCE、FAULT。上电后进 IDLE初始化前端芯片配置保护阈值和均衡参数。然后进 MONITOR周期读电压。如果满足均衡条件进 BALANCE开启对应均衡同时继续监测。如果电压降到关闭阈值或压差进入死区回 MONITOR。任何故障进 FAULT关闭均衡记录故障等待恢复条件。BALANCE 状态里要加超时保护。比如均衡连续开了 30 分钟还没达到关闭条件强制关闭并报异常。这能防止因为采样错误或者电芯异常导致均衡一直开着把电芯放亏。// 均衡状态机简化逻辑 void balance_task(void) { static uint8_t state STATE_IDLE; static uint32_t balance_start_time 0; uint16_t v1 read_cell_voltage(0); uint16_t v2 read_cell_voltage(1); uint16_t vmax (v1 v2) ? v1 : v2; uint16_t vmin (v1 v2) ? v1 : v2; uint16_t diff vmax - vmin; switch (state) { case STATE_MONITOR: if (vmax BALANCE_ON_THRESHOLD diff DIFF_DEADZONE) { enable_balance(v1 v2 ? 0 : 1); balance_start_time get_tick(); state STATE_BALANCE; } break; case STATE_BALANCE: if (vmax BALANCE_OFF_THRESHOLD || diff DIFF_DEADZONE) { disable_balance(); state STATE_MONITOR; } else if (get_tick() - balance_start_time BALANCE_TIMEOUT) { disable_balance(); log_fault(FAULT_BALANCE_TIMEOUT); state STATE_FAULT; } break; case STATE_FAULT: // 等待恢复条件 break; } }5.3 异常处理过压、欠压、过温、通信失败过压和欠压由 MP2642GR-Z 硬件保护MCU 读到状态位后要立即响应。过压时关闭充电欠压时关闭放电同时关闭均衡。过温看是电芯温度还是芯片温度电芯过温要停充放电芯片过温可以降额或者暂停均衡。通信失败要区分是偶发还是持续。偶发失败重试三次还失败就报故障。持续失败可能是 I2C 总线被拉死需要复位前端芯片或者重新初始化 I2C。我一般会在通信失败时切到安全状态关闭所有开关然后尝试恢复。注意故障恢复不要自动无条件恢复。比如过压故障要等电压降到恢复阈值以下并且持续一段时间才允许重新充电。否则电压一降就恢复一充又过压来回振荡。6. 实测中遇到的坑与排查过程6.1 电压读数跳变从连接器查到采样电阻项目调试初期发现第二颗电芯电压偶尔跳变 50mV 以上。一开始怀疑是 I2C 干扰加了滤波电容没改善。后来用示波器直接量采样点发现是连接器接触电阻不稳定。换了连接器问题消失。这个坑让我后来在所有采样路径上都加了 RC 滤波10Ω 加 100nF截止频率约 160kHz不影响直流精度但能滤掉高频噪声。6.2 均衡开启后电压不降反升采样点位置错了另一个坑更隐蔽。均衡开启后被均衡的电芯电压应该下降但实测反而升高。查了半天发现采样线接在了均衡电阻和 MOSFET 之间均衡电流流过采样线产生了额外压降导致读数偏高。改成开尔文连接后正常。这个错误在原理图阶段很难发现只有实测才会暴露。6.3 均衡电阻发热导致温度保护误触发均衡电阻选的是 0.5W 的 0805实测均衡时表面温度到 80 度以上旁边的温度传感器读数跟着上升触发了过温保护。后来换成 1W 的 1206并且把温度传感器移远问题解决。教训是均衡电阻的功率余量要留够布局要远离温度敏感器件。现象可能原因排查方法解决措施电压读数跳变连接器接触不良示波器量采样点换连接器加 RC 滤波均衡后电压反升采样点位置错误检查采样线路径改开尔文连接温度保护误触发均衡电阻发热热成像仪看温度分布换大功率电阻移传感器I2C 通信失败上拉电阻不当示波器看波形调整上拉阻值均衡不开启阈值或死区设置错误读寄存器值重新计算阈值7. 均衡策略的进阶优化从能用 to 好用7.1 自适应均衡电流根据压差调整占空比固定均衡电流简单但不够聪明。压差大时希望均衡快一点压差小时希望慢一点避免过冲。可以用 PWM 控制均衡 MOSFET根据压差调整占空比。压差 100mV 以上占空比 100%压差 50mV占空比 50%压差接近死区占空比 10%。这样均衡更平滑发热也更均匀。PIC18F86J50 有 PWM 外设驱动均衡 MOSFET 的栅极很方便。注意 PWM 频率不要落在音频范围避免啸叫一般选 1kHz 到 10kHz。频率太高MOSFET 开关损耗增加太低均衡电流纹波大。7.2 均衡与充电阶段的配合恒流、恒压、浮充充电分恒流和恒压阶段。恒流阶段电芯电压还没到阈值一般不均衡。恒压阶段电压接近阈值均衡开始工作。浮充阶段电压略低均衡可以间歇工作。MCU 要知道充电器处于哪个阶段可以通过充电电流判断或者跟充电器通信。恒压阶段均衡时充电器输出电流会有一部分被均衡电阻分流导致充电器以为还没充满延长充电时间。这是正常的但要注意充电器能力别让均衡电流超过充电器剩余能力。7.3 数据记录与寿命评估让均衡有据可查均衡次数、每次均衡时长、均衡时压差这些数据记录下来对评估电芯一致性很有价值。如果发现某颗电芯越来越频繁被均衡说明它一致性在变差可能要预警更换。PIC18F86J50 的 EEPROM 可以存这些统计或者通过通信上传到上层系统。我一般会记录最近 100 次均衡事件包括时间戳、电芯编号、起始压差、结束压差、持续时长。这些数据在售后分析时非常有用能判断是电芯问题还是系统问题。8. 两串被动均衡的边界什么时候该换方案被动均衡不是万能的。如果电芯容量差异超过 5%或者压差在静置时都超过 100mV被动均衡那点电流根本追不上这时候要考虑主动均衡或者直接换电芯。另外如果系统对能耗极其敏感比如太阳能供电的备用电源被动均衡耗散的能量也是损失要算进系统功耗预算。两串以上比如四串、六串被动均衡的发热和布线复杂度上升但原理一样。MP2642GR-Z 如果支持多串可以级联。PIC18F86J50 的资源要评估串数多了I2C 读取和状态机管理会更重。我个人在实际操作中的体会是两串被动均衡的核心不是电路多复杂而是参数设置和细节处理。阈值、死区、回差、采样点、散热这五个点做对了方案就稳了。做错了芯片再好也白搭。这套 MP2642GR-Z 加 PIC18F86J50 的组合我前后调了大概两周大部分时间花在采样精度和均衡策略调参上硬件本身反而没怎么改。如果你也在做类似的两串储能或备用电源项目希望这些踩坑经验能帮你少走点弯路。