ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

两串电池主动均衡实战:MP2642GR-Z与PIC18F86K90压差控制

两串电池主动均衡实战:MP2642GR-Z与PIC18F86K90压差控制

做储能和备用电源系统时,只要涉及两个电芯串联,“均衡”就绕不开。我最近用 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,压差才开始收敛。这个过程中看波形比看平均数据更有用,我习惯直接抓电压曲线,观察有没有等幅振荡或缓慢发散。

调完之后的典型数据如下表:

时间点压差均衡电流状态
t=0120mV1A启动
t=30min47mV0.38A比例跟随
t=60min18mV0.15A接近阈值
t=90min6mV0A停止均衡

最终压差稳定在 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,虽然写入速度不快,但均衡任务本来就是慢任务,足够用。上电时把历史故障码调出来,能省很多现场排查时间。

落到实际使用,我最大的感触是:均衡板的价值不在算法多花哨,而在把采样误差和开关时序这两个基础问题处理干净。这两件事做好了,比例系数给保守一点,压差也能稳稳收住;这两件事做不好,再复杂的控制算法也只是在错误的数据上疯狂修正。希望这篇记录能帮正在做储能备电均衡的同行少走几个弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进