基于MP2642GR-Z与PIC18F86J15的2S电池主动均衡模块设计
做储能和备用电源系统的人基本都绕不开一个词电池均衡。只要电池是串联的不管两串还是二十串时间一长都会出现单体电压拉开的情况。我最近做完的这块板子就是用 MP2642GR-Z 这颗均衡芯片配合 PIC18F86J15 这颗 MCU专门针对最小单元的“两个串联电池组”做主动均衡。它用在储能柜和备用电源的电池管理模块里核心任务很单一让两节电池的电压尽量保持一致延长电池组寿命避免过充、过放和容量衰减。这套方案适合谁参考如果你正在做 2S 锂电池、磷酸铁锂电池的均衡模块或者想在储能系统里把均衡功能和主控分离、减轻后端 BMS 的负担那这篇笔记基本覆盖了从选型到调通的完整路径。器件选型、采样电路、软件状态机、实测数据、踩坑记录我都会展开讲尽量让拿到板子的人能直接照着复现。1. 项目思路拆解两串电池不均衡的账要先算清楚1.1 不均衡从哪里来两节电池串联电气结构很简单正极接负极就是一组。但真实世界不存在两节完全一样的电池。容量有离散内阻不一致自放电率不同甚至电池包内部一边温度高、一边温度低这些都是不均衡的来源。更麻烦的是不均衡会在每一次充放电循环里被放大容量小的一节每次都比另一节先充满、先放空长期下来衰减更快然后差距越来越大。这个现象在储能和备用电源场景尤其明显。备用电源长期处于浮充状态电池一直挂在充电回路里储能系统则是每天深充深放。两种工况都会放大单体差异。后果叠加起来就变成充电时容量小或内阻高的一串先到达截止电压BMS 为了保护电池只能停充剩下的那串永远充不满。放电时最弱的一串先被拉低到欠压保护点而另一串还有大量剩余电量。长期这样循环被反复深充深放的那串衰减速度远超预期整组电池寿命大幅缩短。所以结论很清楚对两串电池不加均衡短期看只是损失 5% 到 10% 的可用容量时间一长就是整组提前退役。均衡不是锦上添花而是串联电池组能长期稳定工作的必要措施。1.2 为什么选“均衡芯片 普通 MCU”而不是其他方案均衡有两条技术路线被动均衡和主动均衡。被动均衡最常见也最便宜就是在电压偏高的电池两端并联一个放电电阻把多余能量以热量形式放掉。它的优点是电路简单、可靠、好理解缺点是均衡电流小、只能在高压侧做减法、发热明显。对储能和备用电源来说单节电池容量很大几十毫安的被动均衡电流基本等于是安慰剂根本拉不平电芯之间的容量差。主动均衡恰恰相反它把高电压电池的能量搬运到低电压电池电流可以做到 1A 量级效率高、发热小。主流拓扑有电容电荷泵、电感储能、反激式变压器三种。MP2642GR-Z 这类集成开关管的均衡芯片走的是电荷泵加电感储能的方向外围只需少量元件很适合做成独立模块。那为什么还要加 PIC18F86J15 这颗 MCU因为均衡芯片只负责“搬运能量”它自己不知道什么时候该搬、搬到什么程度停下来。这些决策需要电压采样、阈值判断、状态切换还要和上位机通信。用专用 AFE模拟前端也可以做但成本高策略固化不够灵活。在 2S 这种最小系统里用普通 MCU 加分立采样反而更划算策略完全由自己掌控。选型逻辑拆开就是MP2642GR-Z 负责高频开关和能量转移把均衡电流从硬件层面做出来PIC18F86J15 负责采样、算法、通信把均衡策略从软件层面做聪明。功率部分和控制部分分离后面所有设计都围绕这个分工展开。2. 核心器件拆解MP2642GR-Z 与 PIC18F86J15 怎么分工2.1 MP2642GR-Z双向能量转移是核心能力MP2642GR-Z 属于集成度比较高的电池均衡专用芯片。它内部集成了开关管和部分控制逻辑外部只需要一颗储能电感和少量电容就可以在相邻两节电池之间双向搬运能量。当第一节电压高于第二节它能把能量从第一节搬给第二节反过来也能反向搬。这个双向能力对均衡来说很重要因为电池状态是动态的今天可能第一节偏高明天可能就变成了第二节偏高。在我们项目里的典型接法是这样的两颗电芯串联电池组的正极、中点、负极分别接到均衡芯片的对应端口一颗贴片电感跨接在开关节点上控制信号由 MCU 给出。芯片的开关频率通常在几百 kHz 量级具体工作频率和最大均衡电流依芯片批次和外围参数而定。我们实测在电池压差 100mV 时平均转移电流能到 1A 左右不同版本会不一样以你手头手册为准。这颗芯片在工程上很友好第一是外围元件极少布局压力小第二是通过使能引脚和方向控制引脚把“决策权”完整交给了外部 MCU。也就是说芯片只负责执行能量转移判断逻辑全部放在软件里。这一点正是我们选择这套组合的核心原因。2.2 PIC18F86J15采样、决策、通信一肩挑PIC18F86J15 是 PIC18 家族的一颗 8 位 MCU常见于 3.3V 供电的工业应用。它的特点是外设够用、功耗低、成本可控特别适合电池管理这类对可靠性要求高、又不希望把资源浪费在复杂操作系统上的场景。在项目里它的职责可以拆成四块ADC 采样采集两节电池的电压、电池温度、环境温度等模拟量。ADC 分辨率在 10/12 位量级配合精密分压电阻和软件滤波能把电压分辨率做到 1mV 级别这是精确均衡判断的基础。GPIO 控制通过普通 IO 口控制 MP2642GR-Z 的使能脚和方向脚必要时还控制状态 LED 或外部继电器。通信上报通过 UART也可以换 I2C 或 SPI看系统接口需求把两节电池电压、均衡状态、故障码上报给上位控制板或监控屏。在储能系统里这块板通常是电池包内的子板需要响应主控的查询指令。可靠性管理开看门狗防止程序跑飞用内部模块做欠压检测配置参数存进 EEPROM掉电不丢失。这些能力单独看都不算豪华但组合在一起正好覆盖了 2S 均衡模块的全部控制需求而且留出了后续扩展成 4S 甚至更多串的控制余量。2.3 两个芯片之间的配合逻辑简单描述就是八个字MCU 决策芯片执行。没有均衡需求时PIC18F86J15 把使能引脚拉低MP2642GR-Z 完全休眠系统待机电流很低。当检测到某一节电池电压相对另一节偏高而且压差超过预设阈值比如 20mVMCU 就输出使能信号并设置均衡方向。此时均衡芯片开始工作把高压侧能量向低压侧搬运。MCU 在搬运过程中持续监控电压变化当压差缩小到接近死区值比如 5mV时关闭均衡。整个过程是闭环控制而不是芯片自己开环工作。这个配合方式也方便加入各种保护逻辑。比如电池温度过高时即使压差很大也先不均衡比如电池处于大电流放电状态时端电压波动大容易误判软件可以在检测到电流超过阈值时强制暂停均衡。这些都是单纯靠硬件芯片难以实现的策略。3. 硬件电路设计实操采样、驱动与布板要点3.1 两串电池电压采样电路设计这个部分是整个硬件设计里最容易被轻视、又最容易翻车的环节。很多人觉得拿 ADC 直接量电池两端就行实际上两串电池的中点电压和系统地之间有个坑直接用单端 ADC 去量中点电压会和负极形成共地干扰低压差信号完全测不准。两串电池的电压采样正确做法通常有两种。第一种是差分采样。用精密运放把每一个 cell 的电压转换成单端信号再送进 ADC。优点是共模抑制好、精度高缺点是板上要多一片运放成本略增还要给运放做零漂校准。第二种是两路分压对地。先用两个电阻分压网络把每个 cell 对地的绝对电压降下来再用两个 ADC 通道采样最后在软件里做减法得到压差。优点是电路最简单、成本最低缺点是两路的增益误差和分压电阻精度都会叠加到最终差值上所以分压电阻必须用 1% 甚至更高精度软件里还要做差分校正。我们最终选了第二种因为两块电池的中点和系统地之间有明确的电气参考只要 MCU 的 ADC 参考地和电池负极共地先测两个绝对电压再相减是可行的。但有三个细节必须守住分压电阻阻值要偏大100kΩ 级别把电池的静态漏电压到微安级ADC 引脚要加 RC 滤波典型值 10kΩ 加上 100nF 电容滤掉高频噪声ADC 采样时间要够不要跟 GPIO 翻转的边沿撞在一起否则毛刺会直接进采样结果。我在调试中最深的教训是ADC 原始数据不能直接拿来判断均衡必须做多次采样和软件滤波。具体原因在实测部分会详细展开。3.2 均衡功率回路的布板要点MP2642GR-Z 的功率回路电池、电感、开关管、续流电容是高频大电流回路布局不好会出现地弹、辐射干扰严重时芯片还会自己震荡。功率布板的三条核心原则第一功率回路要最小化。从电池正极到芯片开关端、再到电感、再到电池负极这段回路要短、要粗不要绕远。PCB 上用开窗加锡的方式降低回路阻抗效果比单纯加宽走线更明显。第二功率地和控制地要单点相连。ADC 采样电路的参考地不要混进功率地否则均衡大电流会在公共地阻抗上产生压降直接影响采样电压。我见过一块板图省事把所有地连成一片结果均衡一启动采到的电压直接跳了 20mV。第三电感要紧贴芯片摆放。电感是发热和磁辐射大户一方面散热路径要短另一方面要尽量远离 ADC 采样网络和 MCU 的晶振区域必要时加屏蔽罩。3.3 MCU 供电与通信接口PIC18F86J15 由 3.3V 供电。在储能系统里3.3V 通常由电池组电压经过 DC-DC 或 LDO 降压得到。这里有一个特别容易踩的坑如果 3.3V 是从电池组高侧取电均衡器工作时电池电压会被主动拉平MCU 供电不能出现大的跌落。实测下来单独用一颗低噪声 LDO并且在电源输入端放一个 22μF 左右的钽电容或 MLCC 阵列能有效避免均衡启动瞬间的电压跌落。另外LDO 的输出纹波要小否则会直接影响 ADC 参考电压的稳定性。通信接口方面默认跑 UART波特率 9600 或 19200帧结构简单一些更可靠。数据内容少但一定要加校验字节而不是裸发裸收。通信地和电池负极必须保证共地否则在均衡大电流回路附近浮地会导致乱码。4. 软件控制策略与状态机实现4.1 电压采集、滤波与校准代码逻辑本身不复杂难的是让 ADC 读到的数据稳定可信。我第一版程序每 10ms 读一次 ADC直接求平均值来判断压差。结果均衡器一启动读数就乱跳。原因就是功率地的噪声通过参考地串进了 ADC。后来改成两套动作。第一套是软件滤波每 20ms 采样 8 次去掉最高最低值再对中间 6 次求平均。等效采样率虽然降到 40Hz但稳定性提高很多。核心代码大概是这样的#define ADC_SAMPLE_CNT 8 uint16_t ReadCellVoltage(uint8_t ch) { uint32_t sum 0; uint16_t maxv 0, minv 0xFFFF; for (uint8_t i 0; i ADC_SAMPLE_CNT; i) { uint16_t v ADC_Read(ch); if (v maxv) maxv v; if (v minv) minv v; sum v; } return (uint16_t)((sum - maxv - minv) / (ADC_SAMPLE_CNT - 2)); }第二套是采样窗口。均衡不是一直跑的软件把均衡设计成间歇式比如跑 250ms、停 50ms。停下来的那 50ms 里没有大电流正好用来采样。MCU 只在这个无均衡窗口里更新电压数据采回来的数据基本是干净的。另一个关键是校准。分压电阻和 ADC 本身都有误差不校准的话两路通道自带 20mV 偏差很正常均衡系统会被这个偏差一直带着跑。我们出厂时做两点校准通常在 3.0V 和 3.6V 两个点记录原始 ADC 值算出每通道的增益和偏移写进 EEPROM。之后每次上电都按校准参数把原始值换算成实际电压。4.2 带迟滞的均衡状态机均衡动作不能做成单阈值开开关关必须加入迟滞否则压差会在阈值附近反复穿越芯片每隔几秒重启一次能量来回搬运器件应力也大。我的状态机只有四个状态IDLE等待采样计算压差。BALANCE_HIGH检测到 CELL1 偏高使能均衡方向为 CELL1 到 CELL2。BALANCE_LOW检测到 CELL2 偏高方向反过来。FAULT过温、过压、过放或芯片异常停止均衡并上报故障。进入条件和退出条件这样处理#define DELTA_ON 0.020f // 压差超过20mV开启均衡 #define DELTA_OFF 0.005f // 压差低于5mV关闭均衡 int8_t delta_mv (int8_t)((v_cell1 - v_cell2) * 1000.0f); bool balance_should_run (balancing FALSE abs(delta_mv) 20) || (balancing TRUE abs(delta_mv) 5);也就是说如果均衡正在跑压差必须降到 5mV 才关闭如果均衡没有跑要等压差超过 20mV 才启动。这个迟滞设计看着简单实际效果非常好既避免了频繁开关又能保证均衡最终停留在两颗电池电压足够接近的位置。4.3 通信上报与告警处理上报数据我喜欢用固定长度的简单帧结构。内容包含两节电池电压、电池温度、均衡状态、故障码帧格式是 8 字节帧头、两路电压高字节低字节、状态字节、校验字节、帧尾。上位机只需要解析固定位置逻辑简单不容易出错。帧字节含义示例0帧头0xAA1-2CELL1 电压高字节低字节3-4CELL2 电压高字节低字节5均衡状态0待机1均衡2故障6校验前6字节异或7帧尾0x55告警分成两级。警告级是压差持续超过 100mV说明电池一致性偏差较大但均衡仍在工作故障级是任一电池电压超过过压阈值或者温度超过 60℃立即停止均衡并置故障码。这里有个工程建议告警阈值一定做成可配置的最好放 EEPROM。三元锂、磷酸铁锂、钛酸锂的平台电压完全不同硬编码等于逼用户在换电芯型号时重新烧一遍程序量产维护成本很高。5. 实测数据、调试心得与常见故障排查5.1 测试平台与实测数据搭建测试平台时我没有一上来就接电池而是先用两台可编程电源模拟两节电池精确控制压差和工况。算法逻辑验证完再换真实电芯测。真实电芯测试用的是两节同批次、但衰减状态不同的磷酸铁锂标称 3.2V初始压差约 80mV。记录的数据如下时间(分钟)CELL1(V)CELL2(V)压差(mV)均衡电流(A)芯片表面温度(℃)03.3123.232801.124153.3043.242620.938353.2903.256340.742603.2783.268100.340903.2723.2702027这组数据能清楚看到均衡过程的三个特征开始阶段电流大、压差下降快随着压差缩小平均转移电流逐渐下降最后压差稳定在 5mV 以内芯片进入待机。90 分钟把 80mV 压差拉到 2mV这个速度是被动均衡方案很难做到的被动均衡通常要花半天以上而且会产生大量热量。5.2 调试中踩过的三个坑第一个坑就是前面反复提到的 ADC 采样抖动。均衡启动后读数乱跳最初差点让我以为是均衡芯片把采样电路干扰坏了。排查下来根因是地弹加软件没滤波。用 4.1 节那套“去极值平均加无均衡窗口采样”的办法改完采样跳动从 ±15mV 降到了 ±2mV效果立竿见影。第二个坑是均衡死区设太小。第一版我把关闭阈值设成 0mV结果压差在 0 附近来回穿越芯片每隔几秒就重新启动一次。虽然逻辑上没错但能量被来回倒腾器件应力也在增加。改成 5mV 关闭阈值后系统稳定了很多实测均衡效果没有任何下降。第三个坑是电感啸叫。最开始用的电感额定电流偏小在 1A 均衡电流下进入饱和状态除了啸叫芯片表面温度也偏高。换了一颗饱和电流 2A 以上的功率电感之后啸叫消失温度明显下降。经验是均衡电感不要只看标称电流要看饱和电流至少留出 1.5 倍余量。5.3 常见问题排查速查表整理一个我经常拿来给别人排查问题的速查表现象可能的根因排查方法均衡不启动使能引脚没拉高、方向设反、压差阈值未到测量引脚电平打印压差原始值均衡一直不停关闭阈值太小、两路采样偏差未校准检查校准数据和死区配置采样电压乱跳地弹、ADC 采样时间不足、滤波不够检查 PCB 地分割加软件滤波电感啸叫电感饱和电流不足、外围参数不匹配换大饱和电流电感看开关波形芯片异常发热占空比过大、散热不良、电感参数不对用示波器量开关节点波形通信乱码波特率误差、共地不良、线缆过长核对晶振精度检查通信地均衡效果不明显压差阈值设得太大、均衡电流过小调低开启阈值检查电感选型6. 从两串到多串方案扩展与工程落地建议6.1 多串级联扩展思路两串是串联电池组的最小结构也是多级均衡系统的“细胞”。要扩展到 4 串或更多有两条路。第一条是每两串配一个独立均衡模块模块间靠隔离通信握手。因为这种均衡芯片处理的是相邻两节电池所以 4 串需要 3 个模块1-2、2-3、3-4 各一组。模块可以各自带一颗 MCU也可以共用一颗主控按地址区分。第二条是用一颗 PIC18F86J15 同时管理多颗均衡芯片。只要 IO 口够用可以让一个 MCU 轮询控制多个 MP2642共用同一套电压采样和状态机逻辑。优点是成本低缺点是采样和均衡的时序协调复杂软件调试量明显增加。给我的建议是先按第一条跑通确认策略没问题再去做集成优化。6.2 量产与可靠性层面的细节最后说几个工程落地时必须注意的细节。第一均衡芯片的外围参数在不同批次之间可能略有差异量产板一定要预留调试焊盘和可替换的电阻电容位。我们最早全部使用固定参数想调整电感电容时只能重新投板耽误了整个测试周期。第二均衡能缓解不一致但救不了已经严重损坏的电池。我在软件里明确做了一条判断当压差持续超过 200mV 且均衡无效时上报上位机标记该电池组异常避免用户误以为均衡是万能的。第三如果产品面向备用电源均衡策略需要和充电策略联动。浮充阶段电压高、电流小是均衡的最佳窗口大电流放电阶段电池端电压波动大测量的压差失真软件里应该按电流阈值屏蔽均衡。第四别忘了看门狗和复位电路。电池管理设备常年在线一次程序跑飞可能造成均衡误动作轻则浪费能量重则长期过放。PIC18F86J15 的看门狗一定要开超时时间也别设太长我们用的 1 秒窗口比较稳妥。这些点都做到位以后这套“MP2642GR-Z PIC18F86J15”方案就可以从两串稳定扩展到整组电池管理。我自己做完这个模块最深的体会是主动均衡硬件只是工具真正决定效果的是采样是否可靠、阈值是否科学、软件是否扛得住工业现场的噪声。把这些基础控制住电池组的一致性维护就不再是一件玄学的事了。