
做储能和备用电源系统时只要涉及两个电芯串联“均衡”就绕不开。我最近用 MP2642GR-Z 配合 PIC18F86K90 做了一块主动均衡板专门处理 2 串电池单元的压差问题实测把初始 120mV 的压差压到了 5mV 以内。这篇文章不是什么官方方案而是我个人从选型、画板、写控制逻辑到最终调通的完整记录。整套思路是PIC18F86K90 负责电压采样、均衡策略和保护状态机MP2642GR-Z 负责真正的电量搬运方向与电流控制。文章会按物理原理、硬件分工、算法实现、状态机、实测调参、踩坑这几个顺序展开适合正在做电池管理、储能备电或小容量 BMS 的工程师参考。我不打算只贴一张电路图而是把“为什么要这样设计”“哪些参数不能照抄数据手册”这些背后逻辑都讲清楚。1. 两节串联电池“跑偏”的物理根因以及均衡到底在解决什么问题1.1 不一致的来源不只是出厂误差两节电池串联时流过它们的电流完全相同但这不是“状态一定一致”的充分条件。容量、内阻、自放电率、温度梯度都会造成实际 SOC 的偏差。举个最典型的例子两节额定 100Ah 的电芯一节实际容量 101.5Ah另一节只有 98.2Ah。系统从满电放到 40% SOC 时大容量那节还剩约 40.6%小容量那节只剩约 39.4%。如果用的是磷酸铁锂这个 SOC 差反映到端电压可能只有十几到几十毫伏听上去不算大但在充电末端非常危险。小容量电芯会先到达 3.65V 的满电电压如果没有均衡手段它要么被充电器强行限流要么被过充而大容量那节永远吃不饱。内阻差异同样会制造压差。假设两节电芯内阻分别是 1.2mΩ 和 2.5mΩ负载电流 20A 时高内阻那节额外多出的极化压降有 26mV。这种动态压差不是“故障”但会让控制器误判 SOC因此均衡算法必须对动态压差和真实容量差做区分。温度也是一个容易被忽视的变量。电池簇里电芯之间如果有 5℃ 的温差自放电率差异会让静态压差随时间慢慢拉大。备用电源系统经常长期浮充或长期静置这种“慢跑偏”恰恰是均衡器最需要处理的场景。1.2 均衡的本质是“搬运电量”不是把电压对齐均衡的目标不是简单让两节电池的端电压完全相等而是让它们在充放电循环中始终处于相近的工作窗口避免某一节提前到达充电截止或放电截止。被动均衡会把高压电芯的能量通过电阻泄放掉虽然电路简单但热量集中在板子上效率和功耗都不理想。我做主动均衡是想把多出来的电量从电压高的一节搬到电压低的一节。相当于把高处的水平到低处的水池系统总能量不损失热量和损耗也小很多。放到储能和备用电源场景里主动均衡的另一个优势是可以在系统停机时工作。很多备电系统长期挂在母线上负载很小均衡器可以趁夜里或闲时把压差悄悄抹平等真正断电切到电池供电时整组电池都已经处于比较一致的状态。这也是我在这个项目里坚持用双向功率路径的原因。2. 硬件分工MP2642GR-Z 的功率路径和 PIC18F86K90 的感知与控制2.1 功率拓扑两节电池之间的一条“可双向流动”通路先看我搭的功率结构。两节电芯串联后系统里有三个关键节点总正、总负、中点。MP2642GR-Z 作为功率级芯片负责在两节电池之间建立一条可以双向流动的能量路径。“双向”是这个拓扑的核心。所谓均衡就是当电池 1 电压偏高时把能量从电池 1 抽出来送给电池 2当电池 2 偏高时反向操作。如果没有双向能力就得做成两套单向 DC-DC成本、面积、控制复杂度都上去了。MP2642GR-Z 的内部架构带有同步整流和方向切换逻辑我只需要在外部配上功率电感和采样电阻MCU 给方向信号和电流目标逐周期的电感电流控制由芯片自己完成。外围参数以我样板上的配置为例电感选了 2.2µH 的功率电感开关频率设置在 500kHz 左右。这个值不要直接照抄因为充放电电流、输入输出电压差、MOS 导通损耗都会影响最优频率。确定电感的思路是先算最大均衡电流对应的峰值电流再留 30% 以上的裕量否则大电流转移时电感先饱和接着就是噪声和发热。2.2 为什么选 PIC18F86K90而不是随手拿颗 32 位 MCU很多人看到均衡方案第一反应是上 32 位 MCU。但我在这个项目里用了 PIC18F86K90原因很实际均衡控制本来就是慢变化任务采样周期做到几十毫秒到几百毫秒都足够8 位机的算力完全不构成瓶颈它内置的多路 ADC、比较器、PWM、EEPROM 和丰富 IO刚好覆盖采样、控制、保护和通信需求。更关键的是安全审查和文档化。储能和备用电源产品经常要过功能安全相关评审8 位机的中断、外设和状态机更容易说清楚逐行审查的成本低很多。32 位机固然性能强但对两节串联单元来说属于过度设计反而引入更多不确定性。当然选它也有代价比如 ADC 的参考电压温漂需要标定EEPROM 写入速度慢不能频繁记录。这些不算致命伤只要在设计阶段留出校准和降额通道就行。2.3 采样电路别让“量不准”毁掉整个算法均衡算法的输入只有两个最重要的量电池 1 电压和电池 2 电压。如果采样不准后面策略写得再好也没有意义。我在两个电池端都用了 0.1% 精度的分压电阻分压点并联高频滤波电容然后进 PIC18F86K90 的 ADC 引脚。重要的一点是分压电阻尽量选同一批次、同温度系的排组否则 -20℃ 到 60℃ 环境变化时两路的漂移方向不一致静态压差会产生十几毫伏的假信号。校准也不可少。板子留了校准模式通过精密源给两个采样通道分别灌入 2.000V、3.200V、4.200V 三档标准电压用两点标定算出每一路的增益和偏移存入 MCU 的 EEPROM。每次上电先读校准参数再做电压换算。没有这一步12 位 ADC 的原始精度根本发挥不出来。3. 均衡算法实现从电压校准到“按需双向搬能量”3.1 电压采样先滤波再换算最后判据ADC 裸读数不能直接用。均衡功率级开关时采样线路会耦合到开关噪声我采用的做法是每个点连续采 32 次掐掉最大值和最小值后算术平均等效于做了一次简易中值滤波。这样单次采样周期约 5ms控制主循环每 100ms 更新一次均衡目标。电压换算公式很简单[ V_{cell} V_{raw} \times K_{div} \times G_{cal} O_{cal} ]其中 (K_{div}) 是分压比(G_{cal}) 和 (O_{cal}) 是校准增益和偏移。校准数据存放在 EEPROM 里代码启动时读取。长期运行后如果发现压差读数系统性偏移可以再次进入校准模式刷新参数。3.2 均衡判据带滞环不能一超过阈值就疯狂动作均衡控制最忌讳抖动。压差刚超过阈值就全功率搬运压差一回来又立刻停止系统会进入震荡。我用的判据是启动阈值 15mV、停止阈值 8mV两者之间形成 7mV 滞环。主循环里的逻辑骨架大致如下#define BAL_START_MV 15 #define BAL_HYST_MV 8 int16_t dV_mv v1_mv - v2_mv; if ((dV_mv BAL_START_MV) bal_allowed) { set_direction(CELL1_TO_CELL2); set_target_current(limit_by_temp(calc_current(dV_mv))); } else if ((dV_mv -BAL_START_MV) bal_allowed) { set_direction(CELL2_TO_CELL1); set_target_current(limit_by_temp(calc_current(-dV_mv))); } else { set_target_current(0); set_direction(IDLE); }这段逻辑看起来简单但真正的工程细节在bal_allowed和calc_current里。bal_allowed要检查电池电压是否在安全窗口内比如是否处于欠压状态、是否温度过高、是否有外部充电使能信号。calc_current则把压差映射成目标电流通常是比例控制[ I_{bal} K_p \times (\Delta V - V_{hyst}) ]并且限幅在 0.1C 或 1A 以内。储能电芯容量通常比较大我一般把均衡电流控制在 0.05C 到 0.1C宁可多跑一段时间也不要让大电流硬搬。比例系数 (K_p) 我不给一个死值因为它和电芯内阻、功率级响应速度强相关必须实测调整。后面调参那一节会讲我怎么把它从震荡调到稳定。3.3 内外环配合MP2642GR-Z 管电流PIC18F86K90 管电压功率级逐周期电流控制如果放在 PIC 里做8 位机很容易被中断拖垮。MP2642GR-Z 的优势在于内部已经实现电流环路MCU 只需要设定方向和目标电流。电压环在 PIC 里做因为电池压差变化很慢。我每 100ms 算一次均衡电流目标功率级芯片每几个开关周期就调整一次电感电流。外环慢、内环快这是控制系统里非常经典的组合能避免两个环互相打架。有一点必须注意目标电流不能频繁跳变。每次更新目标值时我会做一个小斜率限制让电流以每毫秒 0.1A 左右的速度爬升或回降。直接阶跃给定电流往往会在电感上产生明显的冲击响铃挤压 MOS 管的电压裕量。3.4 代码层面的定时与任务划分PIC18F86K90 的定时资源我分配得比较明确1ms 定时器用于电流斜率限制和状态计时100ms 定时器触发一次均衡策略计算500ms 定时器刷新上位机发送的电压、电流、状态帧ADC 采样放在 100ms 任务的入口。每次切通道后需要等一点稳定时间否则刚启动的 ADC 采样会带上保持电容的残留电荷。这个细节经常被忽略表现出来就是电压读数偶尔跳一个大台阶显得系统“神经质”。4. 储能和备用电源下的状态机均衡器不能和充电器抢活4.1 四状态加一故障足以覆盖大多数备电场景我把均衡器运行状态拆成四个主要状态IDLE、BALANCING、CHARGING_FOLLOW、FAULT。状态切换由事件触发而不是时间轮询里硬跳。IDLE 状态是系统静止且压差小于启动阈值时的默认状态。此时功率路径关闭MP2642GR-Z 的使能引脚被 PIC 拉低均衡器自身静态电流要压到最低。BALANCING 状态是正常搬运状态方向由压差符号决定电流目标由比例控制输出。在这个状态下如果检测到外部充电器启动我会立刻切入 CHARGING_FOLLOW而不是继续按自己的节奏搬运。CHARGING_FOLLOW 是专门为储能场景加的状态。备用电源系统经常处于浮充状态充电器主动维持总压均衡器如果还在自顾自地搬运电量很可能出现“均衡器从电池 1 抽电充电器又往整串灌电”的对抗局面。处理办法是每 100ms 重新读取一次总母线电压和充电电流把充电器引起的压差变化作为前馈修正动态降低均衡电流。这样均衡器从“主角”变成“配角”只修正充电器照顾不到的电芯差异。FAULT 状态则是最兜底的保护。过压、欠压、温度越限、通讯掉线、连续多次采样超范围都会让系统立即进入 FAULT关闭功率路径并记录故障码。故障恢复不能自动复位要人工清除或掉电复位防止系统在异常状态下反复尝试均衡。4.2 与主充电器、负载切换的时序配合备用电源有一个典型工况外部交流电正常时系统在市电旁路状态电池长期浮充交流电掉电瞬间负载切换到电池供电电池电流可能在几百毫秒内从 0 跳到几十安培。这种负载突变会让电池端电压瞬间出现一个“虚假压差”本质是两节电芯内阻差造成的动态压降差。我的均衡策略里专门留了一个负载瞬态检测窗口检测到负载电流变化率超过阈值时暂停均衡 1~2 秒等极化电压稳定后再重新判断。否则均衡器会在断电瞬间误以为电池 1 偏高启动大电流搬运实际却是在和负载抢能量。充电器使能信号也要直接进 PIC 的输入捕获或普通 GPIO 中断不要只靠通信帧判断。通信链路一旦延迟或掉线均衡器没有及时降额就可能和充电器形成功率拉扯。我在板子上把充电使能信号做了一个硬件旁路充电器启动时均衡器电流目标自动被压到 20% 以下软件只是在这个基础上微调。5. 实测记录120mV 压差压到 5mV 的调参全程5.1 测试平台和初始现象我在实验室搭了一套两节磷酸铁锂电芯的测试平台两节电芯实际容量差了接近 3Ah。先把它们分别充到不同 SOC制造出约 120mV 的初始压差然后接上均衡板监控电压、电流和温度变化。第一次上电就发现问题压差超过阈值后均衡电流启动但这节电芯的电压读数有明显的台阶跳变。查下来不是电芯问题而是 ADC 采样窗口正好落在功率级开关噪声附近。电流越大噪声耦合越严重电压读数的台阶越明显。后来把采样滤波从 16 次增加到 32 次并在 ADC 引脚前并联了一个 100nF 的高频电容读数才稳定下来。5.2 调节目标电流的“手感”第二步是调 (K_p)。我一开始按理论值把比例系数给得偏大结果压差在 6mV 到 18mV 之间来回震荡。原因是整个电压环路的延迟链条太长采样要 100ms 更新一次功率级建立新电流又要几十毫秒再加上停止滞环的切换时间大 (K_p) 相当于一个没有相位裕度的放大器。把 (K_p) 降到原来的一半左右并且把最小停止压差提高到了 8mV压差才开始收敛。这个过程中看波形比看平均数据更有用我习惯直接抓电压曲线观察有没有等幅振荡或缓慢发散。调完之后的典型数据如下表时间点压差均衡电流状态t0120mV1A启动t30min47mV0.38A比例跟随t60min18mV0.15A接近阈值t90min6mV0A停止均衡最终压差稳定在 5mV 左右考虑到分压电阻温度漂移和 ADC 参考噪声这个水平对两块独立电芯来说已经足够。继续往下压没有意义因为采样本身的绝对误差极限可能就在 3~5mV。5.3 有没有必要加积分项我试验过给电压环加积分项效果适得其反。当压差接近 0 时积分器还在累计过去的大误差输出一个“残余搬运电流”等积分项慢慢退掉时电池 2 已经被搬过头压差反向了。对均衡这种低频、低压差控制比例加滞环足够不一定非要 PID 全套。6. 踩坑总结八个不处理好就会翻车的细节最后集中写几个我实际踩过、也帮别人排查过的细节。每个都看起来很小但都能让整块板子从“良好”变成“不可用”。第一功率地和控制地必须单点连接。我有一版 PCB 把两个地直接铺成一片均衡电流一启动ADC 读数就跳 30mV。后来改成星形单点接地采样值的噪声立刻降到 3mV 以内。第二电感饱和电流不能只看额定电流。MP2642GR-Z 在低压大电流转移时电感峰值电流很容易达到平均电流的 1.5 倍选小了会有明显的啸叫严重时甚至把驱动波形搞乱。我在样板上选了饱和电流超过最大峰值电流 30% 以上的电感。第三均衡电流要随温度降额。储能电芯在低温时的可用电流本来就低低温下强吹均衡电流不仅效率差还有析锂风险。我的逻辑里加了一个温度折减系数低于 0℃ 时均衡电流自动减半低于 -10℃ 直接关闭均衡。第四休眠自耗电必须单独处理。备用电源系统最怕“放着放着电没了”。均衡器在 IDLE 状态也会有静态电流我把整个功率级和采样分压电路用一个 MOS 开关供电PIC 进入睡眠时自动切断系统静态电流降到微安级。第五能量方向不能瞬间翻转。禁止和使能功率路径之间要先让电感电流回零再切换方向否则会在节点上产生尖峰电压严重时冲击到 MP2642GR-Z 的驱动。我给方向切换设计了一个 50ms 的“强制回零窗口”宁可慢一点不让风险跳过。第六分压电阻要选同一温度体系。这个前面提过但值得再强调。两路电压采样如果用了不同批次或不同温度系数的电阻环境温度一变静态压差就会出现假信号均衡器会一直在做“错误的搬运”。第七热插拔和连接器抖动会瞬间改变中点电压。备用电源的维护经常有“不断电换模块”的需求连接器接触不良会让中点电压在几毫秒内突变触发过压保护。可以在输入输出端加一个小电容吸收瞬态并把过压判断延时 20ms 再确认。第八故障记录、校准参数必须存进非易失存储器。PIC18F86K90 自带 EEPROM虽然写入速度不快但均衡任务本来就是慢任务足够用。上电时把历史故障码调出来能省很多现场排查时间。落到实际使用我最大的感触是均衡板的价值不在算法多花哨而在把采样误差和开关时序这两个基础问题处理干净。这两件事做好了比例系数给保守一点压差也能稳稳收住这两件事做不好再复杂的控制算法也只是在错误的数据上疯狂修正。希望这篇记录能帮正在做储能备电均衡的同行少走几个弯路。