一组铅酸电瓶或者两串磷酸铁锂电池串联在一起用最开始都挺好跑一段时间就发现容量对不上、电压越差越大。最典型的场景就是备用电源明明按标称算能撑8小时结果第2年只能撑3小时换下来的电池拆开量总有一节状态很好、另一节已经严重落后。这不是电池质量问题是串联电池组天然的不一致性问题在累积。今天想聊的就是怎么用主动均衡控制芯片 MP2642GR-Z 配合 8 位单片机 PIC18F87J50在储能系统和备用电源里对两个串联电池单元做均衡把这块短板尽量补回来。这个方案适合三类人看一是做 BMS 或者储能电源硬件设计的工程师想从被动均衡升级到主动均衡二是嵌入式开发者想了解 PIC18F87J50 这类 8 位单片机在电源系统里怎么干采样、控制和状态机三是虽然不做设计、但需要评审供应商方案的硬件经理看完至少能知道主动均衡方案的边界在哪、哪些参数可以拿来评判好坏。1. 先想明白串联电池为什么必须均衡1.1 不一致性从哪里来很多人的第一反应是“电池出厂一致性差”这话既对也不对。出厂时电芯的内阻、容量、自放电率确实存在离散但更麻烦的是运行中出现的差异。温度梯度几乎没法避免。一组电池装在一个密闭箱体里中间的电池散热差两端的散热好温度差个 5 到 8 度很常见。根据电化学经验规律温度每升高 10 度自放电率差不多翻倍。也就是说高温位置的电池在以更快的速度“自我放电”低压位置自然就落后了。再就是循环老化差异。放电深度、脉冲电流、充电截止方式不同都会让电芯衰减速度不一样。备用电源更是如此——大部分时间处于浮充或静置状态但每次停电带载都有可能是深度放电落后电池在深度放电时电压会被拉得更低进一步加速老化。这就是一个恶性循环不一致导致落后电池被过度放电过度放电又让它与健康电池的差异更大。1.2 不均衡会造成什么后果串联回路里电流是相同的充放电时容量最小的那节电池最先充满、最先放空。充电时均衡差的组里落后电池会很快到达充电截止电压为了保护它整个系统只能停止充电结果其他电池根本没充满系统可用容量缩水。放电时落后电池先到放电截止电压系统为了保护它只能切掉负载其他电池的剩余容量全部浪费。对铅酸电池过充还会导致失水和正极栅格腐蚀对锂电池过充有热失控风险过放会导致析铜、内阻不可逆增大。所以均衡不是“优化项”在串联电池组里是“必选项”。我在实际项目里见过太多因为省了一颗均衡芯片最后整组电池提前退役的案例按整个系统寿命算省下的成本远远填不上换电池的支出。1.3 被动均衡和主动均衡的差别被动均衡是“烧”能量。电池组里高的那节通过电阻放电把多余能量变成热量消耗掉直到和低的拉平。电路简单、成本低常见的 BMS 芯片内部集成的大多是这种方案。但问题也很明显均衡电流小一般 50mA 到 100mA碰上 100Ah 以上的储能电池均衡基本是杯水车薪。能量被变成热量系统效率低电柜里还要额外处理热。均衡时高电量电池明明可以继续充电却在“放热”白白损失能量。主动均衡是“搬”能量。通过电感、变压器或者电容把高电量电池的能量直接搬到低电量电池里能量只在电池之间流动不变成热。效率能做到 90% 以上均衡电流可以做到 1A、2A 甚至更高。标题里 MP2642GR-Z 这类芯片走的就是这个路线。对储能和备用电源场景被动均衡的问题会被放大电池容量大需要均衡的差异电量可能达到几十安时靠 100mA 的被动均衡要跑几十个小时而且产生的热量在密闭电柜里很难散出去。主动均衡虽然外围复杂一点但从效果和可靠性来说对这个场景更合适。对比项被动均衡主动均衡能量去处电阻发热转移到相邻电池典型均衡电流50mA ~ 200mA1A ~ 5A能量效率低热损耗90% 以上电路复杂度低中高适合场景小容量消费电池储能、备用电源、动力电池2. 方案选型MP2642GR-Z 和 PIC18F87J50 怎么分工2.1 MP2642GR-Z 在系统里承担什么MP2642GR-Z 是一颗面向串联电池组主动均衡的控制芯片典型工作方式是配合外部电感实现相邻电池单元之间的双向能量转移。从标题来看这个设计就是用一颗 MP2642GR-Z 管理两节串联电池单元让能量在两者之间来回搬运。这类芯片内部一般集成了功率开关管和栅极驱动逻辑外部只需要接电感、采样电阻和少量电容电阻。MCU 通过控制逻辑告诉芯片“往哪个方向搬”、“要不要搬”芯片内部完成 PWM 开关动作和电流限制。它最大的价值是把主动均衡最难的部分——同步整流控制、死区管理、峰值电流限制——封装进了芯片内部。做嵌入式的人都知道用分立 MOS 管自己搭同步升降压最头疼的就是死区时间调不好导致上下管直通轻则效率下降重则炸管。用集成方案可以把这部分风险直接交给芯片厂商。2.2 PIC18F87J50 为什么够用有人会问现在动不动就上 Cortex-M为什么还要用 8 位的 PIC18F87J50答案是这件事的“控制复杂度”并没有那么高。均衡系统的核心任务有两块一是把两节电池的电压、温度采准二是根据电压差和状态机逻辑决定均衡方向、启停。这两件事按 10ms 或者 100ms 的周期跑就够了对算力几乎没有压力。PIC18F87J50 属于这个厂商的高端 8 位系列内部集成了多通道 ADC、多个定时器、ECCP/PWM 模块、UART、SPI、I2C引脚数量和封装也够用。对于“两节串联电池均衡 通信上报”这个应用资源不但够还有不少富余。选它的另一个原因是可靠性。备用电源和储能设备常常在高温、高湿、强振动的环境里长期运行8 位机的外设少、中断路径短出问题的概率反而低。我已经不止一次在工业备电项目里看到工程师因为“别人都上 32 位”上了复杂平台结果一个 errata 就折腾几个月。工具够用就好不是越贵越好。2.3 整体系统架构把整个均衡系统拆开看大致是五个部分电池组两节串联电池单元中间连接点就是 MP2642GR-Z 均衡电路的公共参考点。电压/温度采样两节电池各自的电压通过分压电阻进入 PIC18F87J50 的 ADC温度用 NTC 热敏电阻采集。均衡执行器MP2642GR-Z 加一个外部电感MCU 的普通 IO 或 PWM 引脚控制均衡方向和使能。主控 MCUPIC18F87J50 负责周期采样、滤波、状态机判断、保护逻辑以及把状态通过 UART/RS485 上报。通信接口把电压差、均衡电流、故障状态上报给上位监控系统方便远程运维。对两节电池的方案MCU 只需要一路均衡控制以后扩展到更多节可以每个“相邻两节”配一个均衡模块由同一个 MCU 统一调度。这也是先做两节验证再扩展的常见路径。2.4 选型时真正重要的三个边界我不建议只看芯片手册首页的“支持多大均衡电流”就拍板有三条边界必须确认。第一芯片支持的最大均衡电流对应的散热条件是什么。连续 2A 均衡和峰值 2A 均衡对电感、PCB 的要求完全不同。第二芯片有没有故障上报引脚。备用电源要求“无人值守”均衡器内部短路、过温、电感饱和这些问题不能只靠外部 MCU 发现芯片自带 FAULT 输出会让系统安全等级高很多。第三工作电压范围能不能覆盖电池电压的下限到上限。磷酸铁锂单节工作范围大概是 2.5V 到 3.65V铅酸电池单节 12V 的范围是 10.8V 到 14.4V。芯片的供电和功率级工作范围必须覆盖实际电池电压不然低压时均衡能力会直接丢失。3. 均衡电路设计与关键参数计算3.1 电感式均衡的工作原理MP2642GR-Z 配合一个外部电感本质上是一个双向的升降压变换器。以两节电池 Cell1 和 Cell2 为例当 Cell1 电压高、Cell2 电压低时让 Chip 内部的功率开关以一定占空比动作先让 Cell1 给电感充电电流在线性上升然后关断电感续流把能量注入 Cell2。这样就把 Cell1 的电荷搬到了 Cell2。反过来同理。这跟水泵抽水很像电感就是那个“水桶”两个功率管就是“进水阀”和“出水阀”MCU 决定水往哪个方向抽、抽多大流量。抽水的动力来自高电压一侧的电池所以整个过程中能量是从高 SOC 单元流向低 SOC 单元而不是被电阻烧掉。双向的含义是“方向可切换”。刚开始可能是 Cell1 高、Cell2 低均衡一段时间后可能反过来了这时 MCU 要切换方向。MP2642GR-Z 这类集成芯片一般把方向切换逻辑也做进了控制端MCU 只需给出高/低电平选择方向。3.2 电感选型的核心计算电感是主动均衡电路里最关键的磁性元件。选型主要看两个指标感值 L 和峰值电流 I_peak。对于 Buck-Boost 拓扑电感纹波电流的经典计算式是ΔI Vin × D / (fsw × L)其中 Vin 是电源端电压D 是占空比fsw 是开关频率L 是感值。举例假设单节电池电压 Vin 3.7VD 0.5fsw 300kHz我们希望纹波电流 ΔI 控制在 500mA 左右那感值大约是L 3.7 × 0.5 / (300000 × 0.5) ≈ 12.3uH所以选一个 12uH 的电感起步是合理的。但注意这只是纹波实际流过电感的平均电流如果设定为 1A峰值电流就是 1A 0.5A/2 1.25A。选电感时饱和电流至少留 20% 到 30% 的裕量也就是 1.6A 以上。电感饱和是非常隐蔽的故障——它会表现为均衡电流上不去、芯片发烫但不会报任何错。储能系统里如果电池容量很大、电压差也大需要提高均衡电流比如直接上到 2A那电感的饱和电流最好按 3A 以上选同时注意 DCR直流电阻越低越好减少能量损耗。DCR 每升高 10mΩ2A 电流下就白白损失 0.04W 热量长时间均衡对热设计很不利。3.3 外围电路与 MCU 接口MP2642GR-Z 的外围电路一般围绕“供电、使能、方向、故障反馈”这几个信号展开。以我习惯的设计方式为例用两节电池的高端和低端给芯片供电芯片内部做欠压保护。外部独石电感串在两端电池的互连节点上电感的两个端点分别接两个电池正极或者中间抽头结构具体以芯片数据手册推荐电路为准。MCU 使用两个普通 IO一个控制 EN/使能一个控制 DIR/方向。故障输出引脚接 MCU 的外部中断一旦均衡器报告过流或过温MCU 立刻切断使能并进入故障处理流程。MCU 和 MP2642GR-Z 之间不需要通信协议几个 IO 就够了。这也是这类专用均衡芯片的方便之处——你不用去管芯片内部寄存器逻辑简单可靠性也高。如果芯片支持 PWM 控制均衡电流也可以用 PIC18F87J50 的 CCP/ECCP 模块产生 PWM 来控制占空比。普通 IO 控制是“要么最大电流均衡要么关闭”PWM 控制则可以精细调节均衡电流在需要温和均衡的场景比如备用电源浮充状态更实用。3.4 采样电路的“坑”要先排掉均衡电路的电压采样看似简单实际最容易出问题。特别是“均衡工作时采样”这个时刻电感上的开关动作会产生高频干扰电压采样值会上下跳。处理方法有三个采样时机避开开关动作。软件控制在均衡 PWM 关断后的死区时间再打开 ADC这是最有效的方式。分压电阻后面加 RC 低通滤波。截止频率取 1kHz 左右即可太高滤不掉干扰太低会拖慢响应。对采样值做软件滤波滑动平均加中值滤波组合使用能同时压制高频毛刺和偶然性跳变。我自己的习惯是ADC 采样用 8 次到 16 次去掉最大最小各一次再把剩余数据取平均。这个逻辑写起来不复杂但效果非常明显实测能把电压读数的峰峰跳动从几十毫伏压到 2mV 以内。4. PIC18F87J50 端软件实现思路4.1 资源分配先看手上的外设怎么分PIC18F87J50 的 ADC 至少有 10 个以上通道两节电池电压占 2 路、NTC 温度占 1 路其他通道可留给电流检测或外部信号。ADC 通道 0Cell1 电压ADC 通道 1Cell2 电压ADC 通道 2NTC 温度普通 IO 端口 A0均衡使能普通 IO 端口 A1均衡方向外部中断 INT0故障输入UART1状态上报软件按 10ms 周期跑主循环100ms 周期做一次完整均衡判断这样即使均衡启动对 MCU 占用也极低。4.2 电压采样与滤波先说一个原则均衡系统里所有判断都基于电压所以电压采样必须校准。没有校准之前不要跑均衡逻辑。PIC18F87J50 内部 ADC 是 10 位的参考电压可以用内部参考。实际使用中分压电阻的精度直接决定采样误差。1% 精度的分压电阻最普通要追求更好读数就用 0.1% 的。对 3.7V 量程1% 电阻在最坏情况下能引入约 18mV 误差这已经接近均衡判断阈值了必须注意。滤波函数我一般这么写uint16_t Adc_GetFiltered(uint8_t ch, uint8_t times) { uint16_t buf[16]; uint16_t temp; uint32_t sum 0; uint8_t i, maxIdx 0, minIdx 0; // 读取 times 次数据存入 buf for (i 0; i times; i) { ADCON0 (ADCON0 0xC3) | (ch 2); // 切换 ADC 通道 GO_DONE 1; while (GO_DONE); buf[i] (ADRESH 8) | ADRESL; if (buf[i] buf[maxIdx]) maxIdx i; if (buf[i] buf[minIdx]) minIdx i; __delay_ms(1); // 等待采样稳定也避开均衡开关噪声 } // 去掉最大最小值求平均 for (i 0; i times; i) { if (i maxIdx || i minIdx) continue; sum buf[i]; } return (uint16_t)(sum / (times - 2)); }这段代码里__delay_ms(1)不只是让采集中断间留点时间更重要的是给了外部 RC 滤波足够的建立时间。如果你把采样周期压缩到几十微秒分压电容上的电压还没稳定采出来的数一定偏。4.3 均衡控制状态机均衡判断不能做成一锤子买卖必须是一个完整状态机。核心是防止“均衡-停止-再均衡”的振荡。简单措施就是滞回启动阈值 50mV停止阈值降到 10mV。启动与停止阈值之间留出死区这跟比较器滞回是一个道理。参考状态机typedef enum { BAL_IDLE, BAL_SETUP, BAL_ACTIVE, BAL_DONE } BalState; BalState balState BAL_IDLE; uint16_t balTimer 0; #define BAL_START_DIFF_MV 50 #define BAL_STOP_DIFF_MV 10 #define BAL_TIMEOUT_SEC 600 void Bal_Task(void) { uint16_t vCell1, vCell2; int16_t diff; vCell1 Adc_GetFiltered(CH_CELL1, 8); vCell2 Adc_GetFiltered(CH_CELL2, 8); diff (int16_t)(vCell1 - vCell2); switch (balState) { case BAL_IDLE: if (abs(diff) BAL_START_DIFF_MV Bal_SystemOK()) { balTimer 0; balState BAL_SETUP; } break; case BAL_SETUP: // 确认方向然后给外部均衡器上电 Bal_SetDirection(diff 0 ? DIR_CELL1_TO_CELL2 : DIR_CELL2_TO_CELL1); Bal_Enable(); balState BAL_ACTIVE; break; case BAL_ACTIVE: if (abs(diff) BAL_STOP_DIFF_MV) { Bal_Disable(); balState BAL_IDLE; } else if (balTimer BAL_TIMEOUT_SEC) { Bal_Disable(); balTimer 0; balState BAL_IDLE; // 超时保护进入常规定检 } break; default: balState BAL_IDLE; break; } }这个状态机有几个细节值得注意。均衡方向切换千万别在使能状态下直接翻转。如果芯片没有内置换向保护直接翻转方向等于把电感短路一下可能触发过流甚至损坏功率管。安全的做法是“先关闭均衡等一个断电延时再切换方向再重新使能”。对我前面用普通 IO 控制的设计来说软件在切换方向前强制等 10ms 以上确保开关管完全关断。均衡超时保护必须有。备用电源可能长期无人维护万一电池出现微短路或者其他故障导致电压差一直无法收敛均衡器如果不超时退出就会一直满负荷工作磨耗器件寿命。600 秒只是示例值实际按电池容量、均衡电流和允许的最大均衡时间计算。4.4 保护逻辑保护逻辑优先级高于均衡逻辑。以下条件任一满足均衡立即停止并上报故障状态任意电池电压超过过充保护阈值任意电池电压低于过放保护阈值NTC 温度超过上限比如 55 度MP2642GR-Z 报故障均衡超时这里有一个容易被忽略的问题均衡停止要区分“正常完成”和“故障停止”故障停止要进入锁存状态而不是下个周期又自动恢复。如果 MCU 不锁存过温之后芯片刚凉下来又立刻启动均衡可能反复热冲击反而更容易损坏。5. 储能和备用电源场景里的工程化落地5.1 不同状态下的均衡策略不一样储能系统和备用电源看起来都是“电池挂着”但工况差异巨大均衡策略要跟着变。储能系统会频繁充放一天可能几个循环均衡应该主要在充电末端跑。充电末端电池电压差异最明显这时启用大电流均衡能有效减少充满时的电压离散。备用电源则不同绝大部分时间浮充或者静置电池始终维持在高 SOC。这种情况下电压差往往不大但 SOC 差可能已经存在。对铅酸电池我的经验是定期做一次“维护性均衡”时间选在浮充电压稳定后的半夜用小电流均衡 1 到 2 小时把长期浮充带来的差异磨平。对磷酸铁锂电压平台平坦均衡判断不能只靠电压最好结合库仑计或者开路电压估算 SOC按 SOC 差来跑均衡。5.2 通信上报设计单机均衡做得再好如果状态传不到运维系统价值都打了折扣。PIC18F87J50 自带 UART扩展一颗隔离 RS485 收发器就可以把状态挂到监控总线上。上报内容建议包括电池 1、2 的电压和温度当前均衡状态空闲、正向均衡、反向均衡、完成均衡累计时间和累计安时数故障标志位和故障代码我在实际项目里发现通信协议越简单越好。不要一开始就上复杂帧结构只有电压、状态、故障三个寄存器跑起来非常稳。后续要扩展每帧加长度字段就行。5.3 低功耗设计备用电源还有一个特殊需求市电正常时系统由 AC/DC 供电电池处于浮充此时 MCU 和均衡器的功耗不能拖累整个待机功耗预算。做法是分级休眠。正常时 MCU 可以每秒钟醒来一次做一次电压巡检如果电压差小于启动阈值就继续睡。均衡器完全断电只有 NTC 检测和 MCU 的低功耗定时器在运行。只有当检测到电压差超过阈值、或者系统进入放电工况时才把均衡器上电全速工作。PIC18F87J50 平时可以用内部低频振荡器做定时唤醒需要通信时再切回外部晶振。这个细节对备用电源的待机功耗影响很大一根通信线都不能忽略。5.4 热设计与 PCB 布局主动均衡电流越大电感和芯片的发热越明显。2A 均衡电流下就算效率 92% 到 95%也有 0.1W 到 0.3W 的功率损耗集中在指甲盖大小的器件上温度不容小觑。PCB 布局方面我有几个实操建议电感放在芯片旁边走线宽 2mm 以上回路闭合面积越小越好。功率地、采样地、模拟地分开在芯片 GND 引脚附近单点汇合。电压采样分压点从电池端子直接取不要从电流路径上取避免导线压降导致采样偏差。均衡发热器件跟 NTC 温度探头保持距离不然热反馈会“自己骗自己”。尤其最后一条我曾经调试一块板子时发现温度保护莫名其妙触发量了半天才发现 NTC 离均衡电感太近电感 60 度NTC 报 55 度保护当然一直动作。6. 调试实录常见问题与排查技巧6.1 均衡电流很小或者上不去均衡电流上不去最常见的三个原因按概率排电感饱和、采样电阻取值偏大、PWM 占空比被限制。电感饱和的坑前面说过表面征状就是电流到某个值后不再上升、芯片温度快速升高。示波器直接看电流波形最直观正常是三角波叠加直流饱和时三角波顶部会被“削平”出现明显畸变。采样电阻偏大是另一个隐蔽问题。它决定了芯片的峰值电流限制点阻值大一点点限制电流就低不少。如果量到电流和理论值差很多先核对采样电阻的实际阻值不要只看丝印。我用过的采样电阻有过“丝印和实测差 20%”的案例低成本的贴片电阻批次离散不能忽视。6.2 均衡一启动电压读数就跳这是典型的采样被开关噪声干扰。排查和解决办法按优先级排列采样时序错开 PWM 开关动作。先关均衡延迟 1ms 以上再采电压采完再开均衡代价是均衡有效占空比稍微下降但电压精度大幅提升。分压电阻输出加 RC 低通滤波R 取 10kΩC 取 100nF截止频率约 160Hz够滤掉开关噪声又不至于影响 100ms 级的均衡巡检。如果还不行检查 ADC 采样保持时间设置。PIC18F87J50 的 ADC 采样时间可以配置默认值在低阻抗源下够用分压电阻阻抗高时要把采样保持时间调长否则转换出的值偏小。6.3 芯片和电感发烫发烫的本质是效率低。效率低在哪要看是轻载还是重载发烫。轻载发烫多半是同步整流死区时间不合适或者频率太高导致开关损耗占比过大。如果芯片允许适当降低开关频率能明显改善。重载发烫先看电感DCR 太大或者磁芯损耗偏高再看 PCB 布线功率回路太长、过孔太少铜箔电阻几十毫欧都会拖低效率。另外均衡不是瞬间完成的动作如果电池电压差一直很大均衡器可能连续工作几小时这时候散热不解决好局部温度很容易过百。我在备用电源项目里的处理办法是均衡电流按 1A 设计均衡时同时开启通风风扇确保热量能被及时带走。6.4 均衡启动了但电压差不收敛这种情况比“不启动”更难查因为电路看起来都在工作。经验上有两类原因第一类是电压采样本身不准被均衡“拉偏”。均衡电流在电池内阻上会产生压降如果采样点取在均衡电流通路上均衡时测到的电压包含内阻压降导致状态机误判。解决方案是在均衡停止的瞬间采样或者把采样点远离大电流路径。第二类是电池本身有微短路或者自放电过大。均衡只能搬能量不能修复电池。如果经过多个循环均衡每次充满后电压差又迅速拉开基本可以判定是电池内部问题不是均衡系统的锅。这时候正确做法是上报维护工单让现场换掉落后电池而不是让均衡器一直硬扛。6.5 常见问题速查表现象可能原因排查手段处理建议均衡电流达不到设计值电感饱和、采样电阻偏大、占空比受限示波器看电流波形、核对采样电阻阻值更换更大饱和电流电感、调整采样电阻电压读数跳变开关噪声干扰、ADC 采样时间短关均衡后采样、观察是否恢复调整采样时序、加 RC 滤波芯片和电感高温死区不合理、DCR 大、布线差热像仪定位热点换低 DCR 电感、加散热铜箔、降低频率均衡不收敛采样被电流拉偏、电池内部故障均衡停止瞬间采样、对比开路电压改进采样点、更换落后电池故障反复触发NTC 离热源太近、阈值设置太极限查温度布局、看温度曲线移开 NTC、增加保护回差写在最后的一点心得做了几个均衡项目之后我最大的体会是均衡能不能起作用七分靠采样两分靠策略一分才是均衡器本身。MP2642GR-Z 这类专用芯片把功率级做好了但你的 MCU 读数不准、状态机逻辑混乱再好的芯片也发挥不出来。所以调试时别急着把均衡电流拉到最大先把两节电池的电压采样精度和稳定性调到位比如在 2.0V 到 3.6V 区间内做到正负 10mV 以内的读数一致性再放均衡器介入。等均衡真的跑起来你会看到电压差从几十毫伏慢慢收拢到个位数毫伏那种感觉才是整套方案真正work的信号。