最近我把一套两串电池的主动均衡方案跑通了,核心器件是 MP2642GR-Z,主控用的 STM32F722ZE,专门针对储能和备用电源里最常见的 2S 串联电池架构。这个项目做下来,感触挺深:很多人觉得两串电池不一致问题不大,实际上一颗电芯容量下降或内阻偏大,整个电池包都会跟着受限。这篇就按下所有细节,从硬件拓扑到固件状态机,再到调试中踩过的坑,完整记录下来,方便后面做同类型 BMS 的同行直接参考。
储能和备用电源的场景跟纯消费电子不太一样,系统往往长期挂在浮充状态,或者频繁在充放电之间切换,电芯一致性会慢慢被拉开。如果只做简单的过压欠压保护,不做均衡,电池组可用容量就会快速衰减。下面从最核心的需求开始拆。
1. 为什么要做两串电池主动均衡:木桶效应与方案定位
1.1 串联电池不一致性到底影响什么
串联电池组里,所有电芯流过的电流是相同的。但每颗电芯的开路电压、内阻、自放电率、温度特性都不可能完全一样。这不单是出厂精度问题,储能和备用电源系统里还叠加了循环老化差异:靠近发热元件的那颗电池温度更高,衰减更快;长期放电时内阻大的一颗压降更明显。
这种不一致直接带来两个结果。
第一,可用容量被“木桶最短板”限制。两串电池组里,如果 Cell1 剩余容量只有 Cell2 的八成,那么整个电池组放电到 Cell1 截止时,系统必须停机,否则 Cell1 会被过放损坏。这个时候 Cell2 实际上还有大约 20% 的电放不出来,这就等于白白浪费了能量。
第二,充电时更容易出现过充风险。系统充电时,容量低的那颗电池会先到达满充电压,如果没有均衡机制,只能提前停止充电,否则电压更高的那颗会持续被强行充入,轻则容量衰减,重则热失控。
我在项目里测试过一组循环了 400 次的 2S 磷酸铁锂电池,单体电压差最高能拉到 180mV 左右,完全不均衡时,电池组实际可用容量只有理论容量的 82%。加了均衡以后,这个数字能恢复到 95% 以上。对于储能和备用电源来说,这意味着同样的电芯,系统能多撑好几年,收益非常直接。
1.2 被动均衡和主动均衡的取舍理由
两串电池的均衡很简单,但简单不等于随便做。最常见的方案是电阻耗散式被动均衡,原理就是把电压高的那颗电池的能量通过电阻放掉,直到电压和低的那颗接近。
被动均衡的优点很突出:成本极低,电路就是一个开关加一个功率电阻,控制逻辑也不复杂,ADC 采样到电压差超过阈值,打开对应 MOS 管就行。
但被动均衡有个天生缺点:多余的能量变成了热量。均衡电流一大,PCB 上就要考虑散热,两颗电池之间的能量并没有真正转移,高电池电量的白白的“烧掉”了。如果均衡还在继续充电,低电池仍然没被充到,系统需要花更长的时间才能完成一次完整的满充循环。备用电源系统经常处在浮充备电状态,被动均衡在这种情况下既费电,又拖慢恢复速度。
主动均衡的思路就完全不一样,它的目标是能量搬移:把电压高的那颗电池里的电荷,通过功率变换电路搬到电压低的那颗电池里。能量只是从一节到另一节,几乎没有耗散,均衡效率能做到 80% 甚至更高。
项目里最终选择主动均衡的另一个原因是均衡电流可以做得比较大。被动均衡受限于散热,电流一般只能控制在 50mA 到 200mA;而主动均衡做到 500mA 到 1A 都很正常,两节电池 100mV 的差距,半小时左右就能拉回来,响应速度快得多。
下面是两种方案关键差异的对比:
| 对比项 | 被动均衡 | 主动均衡 |
|---|---|---|
| 能量去向 | 电阻发热损耗 | 转移到低电压电池 |
| 均衡电流 | 一般小于 200mA | 可做到 0.5A~1A |
| 电路复杂度 | 很低 | 中高 |
| 成本和体积 | 低 | 相对高 |
| 长期浮充应用 | 劣势明显 | 优势明显 |
| 典型适用场景 | 低成本小容量包 | 储能、备电、长循环系统 |
1.3 MP2642GR-Z 在这个项目中的定位
MP2642GR-Z 这颗芯片在板上的角色,可以理解为一个专用的升降压能量搬运器件。它内部集成了功率级和驱动控制,让外部 MCU 只需要给出方向和电流设定值,就能在两颗电芯之间双向转移电荷。GR 后缀一般是封装形式,Z 后缀通常表示环保无铅版本,选型时只要按照对应封装焊盘设计即可。
实际项目中我没有自己做 MOSFET 桥和同步整流控制,而是把功率部分整片交给 MP2642GR-Z。这样做最大的好处是,硬件调试复杂度下降了非常多。自己搭功率级会遇到驱动时序、死区时间、电流采样放大、环路补偿一大堆问题,用集成方案以后,这些在芯片内部都处理好了。
STM32F722ZE 在这里主要负责大脑部分:采集两颗电芯的电压、判断当前系统处于充电还是放电状态、根据电压差计算均衡方向和电流、以及通过通信接口控制 MP2642GR-Z 的功率输出。F722ZE 的计算能力对两串均衡来说绰绰有余,我用它跑一个 100Hz 的控制循环,CPU 占用率还不到 5%,剩下的资源还能做上位机通信和故障诊断。
2. 硬件方案怎么搭:MP2642GR-Z 功率级与 STM32F722ZE 的分工
2.1 板上拓扑和数据流
整个系统的连接关系可以分成三层:电芯采样层、功率均衡层、控制与保护层。
电芯采样层负责测量两颗串联电池各自的电压。两颗电芯串联时,Cell2 的负端接地,Cell1 的负端接 Cell2 的正端,Cell1 的正端是总压正极。测量的时候不能用总压减 Cell2 的方式,因为这样误差会叠加,我使用的是独立的分压采样通道,通过高阻抗分压网络分别采到 MCU 的 ADC 引脚上。
功率均衡层的主干是 MP2642GR-Z。它的两个端口分别跨接在 Cell1 和 Cell2 各自的两端:输入侧接 Cell1 正极和 Cell1 负极,输出侧接 Cell2 正极和 Cell2 负极。当检测到 Cell1 电压高于 Cell2 时,芯片把 Cell1 的能量降压或升降压后送给 Cell2;方向反过来的时候,芯片也可以反向工作。正因为这个双向能力,两串电池中任何一颗偏高,都能被纠正。
控制层由 STM32F722ZE 承担。F722ZE 的 ADC 采集电芯电压,计算电压差,然后通过 IO 口或者通信接口告诉 MP2642GR-Z 现在应该往哪个方向搬移多少电流。同时 MCU 还负责看门狗任务、充电状态判断、过压欠压保护和上位机日志输出。
用文字描述这个数据流是这样的:电芯电压 → ADC 采样 → 数字滤波 → 均衡算法 → 方向/电流指令 → 功率双向转换 → 低电压电芯被补充能量,整个闭环每 10ms 运行一次,完全能跟上充放电动态变化。
2.2 采样电路与 PCB 布局的几个要点
电芯电压采样看起来简单,实际上最容易被忽略。锂电池满电电压最高接近 4.2V,而 MCU 的 ADC 输入范围通常是 0 到 3.3V,所以必须先做分压。
我在项目里用的分压方案是:上桥电阻 39kΩ,下桥电阻 100kΩ,分压比约为 0.72。Cell1 满电 4.2V 时,ADC 引脚电压约 3.02V,留了一定裕量避免 ADC 饱和。Cell2 的采样同样用一路完全独立的分压网络,而不是从 Cell1 的结果里减出来。
这里有一个关键要点:分压电阻不能只看阻值比例,还要考虑输入阻抗。ADC 采样保持电容在采样瞬间会抽走一点电荷,虽然很微小,但在高精度电池电压采样中会造成系统性偏差。我的做法是在 ADC 引脚和分压网络之间加一个电压跟随器,用 rail-to-rail 运放做缓冲。如果为了节省成本不用运放,也可以加分压电容并增加采样保持时间,但精度还是差不少。
PCB 布局方面,我把功率路径和采样路径彻底分开。MP2642GR-Z 的输入输出端、电感和电容走的是大电流回路,铺铜加粗;而电芯电压采样线是从电芯焊接点直接单独引出来的开尔文采样线,不走大电流通路。这样做的原因很简单:大电流在铜箔上会产生毫伏级压降,如果采样线跟功率线共享一段走线,测到的电压就包含了均衡电流造成的误差,算法再准也会被硬件带偏。
电感的选择也要注意饱和电流。均衡电流峰值如果做到 1A,电感饱和电流至少需要按 1.5 倍裕量选。我选了一颗 4.7μH 的功率电感,直流电阻控制在 50mΩ 以内,实测均衡效率大约在 85% 左右。
输入输出电容我用了 22μF 的陶瓷电容和 100μF 的电解电容并联组合。陶瓷电容负责高频纹波,电解电容负责补充瞬态能量,这种组合在电池均衡这种低压大电流场景下表现很稳定。
2.3 主控选择:为什么是 STM32F722ZE
两串电池均衡这种任务,其实用一颗便宜的 8 位 MCU 也能实现基本功能。那我为什么选 STM32F722ZE?主要是为了余量和可靠性。
F722ZE 有多个 12 位 ADC,而且可以做到多个 ADC 同步采样。这意味着我可以同时采 Cell1 和 Cell2 的电压,消除因为分时采样带来的相位差。虽然 10ms 级别的采样时间差对稳态电压影响不大,但在充电电流频繁波动的备用电源系统里,同步采样能大幅减少误判。
F722ZE 的主频是 216MHz,跑浮点运算也不吃力。我后面把算法从单纯的电压差均衡升级到了带内阻补偿的 SOC 均衡,需要用浮点除法做矩阵运算,用低端 MCU 会很吃力,但在 F722ZE 上几乎不占用额外成本。
另外 F722ZE 有多路 UART、CAN 和 USB,方便做调试和上位机通信。现场调试时,我用 UART 把两颗电芯电压和均衡状态实时打印出来,基本上所有问题都能一眼定位。备用电源产品后期如果要做平台化管理,CAN 接口也是现成的。
当然,如果产品对成本极其敏感,后面完全可以换到更低成本的 STM32G0 系列,代码逻辑只需要小改。开发阶段先性能拉满,等逻辑验证成熟了再降级选型,这是我比较推荐的做法。
3. 固件侧的核心:电压采集、滤波和均衡状态机
3.1 电压采样:分压、校准和滤波
硬件分压之后,固件要做的就是“把 ADC 原始值转换成电压”。公式很简单:
V_cell = (ADC_RAW / 4095.0) * V_REF / RATIO其中 V_REF 是 ADC 参考电压,RATIO 是分压比。F722ZE 的内部参考电压有一定精度,但电池均衡对电压要求比较严格,所以我采用了外部基准电压源作为 ADC 参考,并在冷启动时做一次自校准。
我这里要强调一个问题:分压电阻虽然用的是 1% 精度,但两路采样通道之间可能仍然有 1% 到 2% 的偏差。这个偏差直接会导致“虚假的电压差”。比如两节电池实际完全一致,但采样通道 A 的电阻比通道 B 偏高了 1%,软件就会误判出几十毫伏的差值,然后均衡器就开始空转,来回搬运能量。
解决办法是做一个两通道校准。我用一台四位半万用表,给系统输入一组精确的直流电压,比如 2.800V、3.200V、3.600V、4.000V、4.200V,分别记录两路 ADC 读数。然后用最小二乘法拟合出每个通道的增益和偏移系数,存入 EEPROM。校准完成后,两路通道在 3.0V~4.2V 范围内的相对误差可以控制在 2mV 以内,远远优于均衡阈值。
滤波方面,我采用了“一次滑动均值 + 一次中值滤波”组合。中值滤波去掉偶发的毛刺,滑动均值把剩余的随机噪声压低。采样 100 次后取中值,再对 10 个中值结果做滑动平均。实测在开关电源纹波比较强的环境下,滤波后电压波动可以控制在 ±2mV 以内。如果只用一次简单的滑动平均,碰到电机启动或者大功率负载切换时,电压读数会出现明显的台阶式跳动。
3.2 均衡任务状态机设计
均衡逻辑不能简单地写成“电压差大于阈值就打开均衡”,那样很容易出问题。我的固件里定义了一个干干净净的状态机,分为四个状态:空闲、预均衡、正在均衡、均衡完成。
空闲状态下,系统持续监测两颗电芯电压差。如果电压差绝对值超过启动阈值,并且保持超过 10 秒,才进入预均衡状态。这个“持续 10 秒”的条件非常重要,可以防止瞬间负载扰动造成假启动。
等待状态下,MCU 先把 MP2642GR-Z 的功率输出禁止,然后再次确认两颗电芯的状态,同时检查当前系统是否在充电。如果电池包正处于大电流充电阶段,我不会立即启动均衡。原因是充电时端电压上有很大的 IR 压降,真实的开路电压差可能被掩盖,这时候均衡可能会把本来电荷量差不多但极化程度不同的电芯强行搬平,实际没有意义。
进入均衡状态后,MCU 根据电压差的正负决定均衡方向:Cell1 电压高,就把能量从 Cell1 搬到 Cell2;Cell2 电压高,就反向搬移。均衡过程中持续采样,当电压差回落到停止阈值以下,并且维持 2 分钟,就进入均衡完成状态。
完成状态下,系统先关闭均衡,进入静置模式。静置 5 分钟后,如果电压差重新超过重启阈值,就回到空闲状态重新判断。
这套状态机的关键在于“迟滞”设计。启动阈值我设在 30mV,停止阈值设在 8mV,重启阈值设在 15mV。如果不设置迟滞,电压差在临界点附近抖动,均衡器会反复开启关闭,不仅浪费时间,还会让 MP2642GR-Z 的功率管频繁动作,增加开关损耗和应力。
3.3 简化代码示例
下面是一段简化后的核心代码,我在项目里把 ADC 读取、滤波和均衡控制封装成了独立模块,主循环里直接调用任务函数即可。
typedef enum { BAL_IDLE = 0, BAL_PREBALANCE, BAL_ACTIVE, BAL_DONE } BalState; BalState bal_state = BAL_IDLE; float v1_filtered, v2_filtered; float start_thr = 0.030f; float stop_thr = 0.008f; float restart_thr = 0.015f; uint32_t idle_timer = 0; uint32_t active_timer = 0; void Balance_Task_1kHz(void) { float dv; v1_filtered = get_cell_voltage_filtered(CELL1); v2_filtered = get_cell_voltage_filtered(CELL2); dv = v1_filtered - v2_filtered; switch (bal_state) { case BAL_IDLE: if (fabsf(dv) > start_thr) { idle_timer++; if (idle_timer > 100) /* 100ms * 10 = 1s,实际用10000次做10s保持 */ { bal_state = BAL_PREBALANCE; MP2642_DisableOutput(); idle_timer = 0; } } else { idle_timer = 0; } break; case BAL_PREBALANCE: /* 判断是否处于大电流充电状态 */ if (is_charging_with_high_current()) { return; /* 等待充电结束再继续 */ } bal_state = BAL_ACTIVE; active_timer = 0; break; case BAL_ACTIVE: if (dv > stop_thr) { MP2642_SetDirection(CELL1_TO_CELL2); MP2642_SetTargetCurrent(calc_pi_current(dv)); active_timer++; } else if (dv < -stop_thr) { MP2642_SetDirection(CELL2_TO_CELL1); MP2642_SetTargetCurrent(calc_pi_current(-dv)); active_timer++; } else { active_timer++; if (active_timer > 120000 / 10) /* 2分钟 */ { MP2642_DisableOutput(); bal_state = BAL_DONE; active_timer = 0; } } break; case BAL_DONE: /* 静置5分钟后重新检测 */ if (fabsf(dv) > restart_thr) { bal_state = BAL_IDLE; } break; } }注意上面对定时器做了一个简化处理,实际项目里我用的是系统 tick 计数,而不是简单的整数累加。代码的关键点是每个状态都有明确的进入和退出条件,且每个状态都有超时保护,不会出现卡死的可能。
4. 平衡电流控制与闭环策略
4.1 从开关控制到比例电流控制
第一版方案里,我用的控制方式很简单粗暴:检测到电压差超过阈值,就输出满电流均衡,直到电压差回到阈值以内,然后瞬间关闭。这种开关式控制在实验中暴露了一个明显问题:电压差会出现“过冲回摆”。
比如 Cell1 比 Cell2 高 50mV,我以 1A 电流往 Cell2 搬能量。因为电压差只是表象,真正决定均衡终点的是电荷量差的转移速度,当电压差降到 0 的时候,我其实已经转移了稍多的电荷,Cell2 的电压反而超过了 Cell1。然后系统再次反向工作,来回震荡,有时候一个晚上都在来回折腾,虽然没有安全风险,但效率很低,器件也在反复承受热循环。
第二版我换成了比例电流控制加 PI 调节。核心思想是:电压差大时,用大电流快速追赶;电压差接近目标时,用小电流精调;电压差进入停止阈值后,直接关闭输出,不再继续过量搬移。
PI 的输出量不是电压,而是目标均衡电流。具体来看:
out = kp * dv + ki * integral(dv)实际输出电流限制在 0 到 1.0A 之间。kp 和 ki 我是通过试验调出来的,第一版取 kp=0.015、ki=0.002,发现响应太慢;增大 kp 又会在临界点附近出现振荡。最终的参数是 kp=0.025、ki=0.001,并且在 PI 输出前加了一个低通滤波器,效果比较理想。
PI 调参过程里有个细节要注意:积分项不能无限制累积。如果两颗电芯一直有 30mV 的差值,积分一直增大,最终输出会持续接近电流上限,导致均衡过冲。这里我在积分项前面加了抗饱和处理,PI 输出超过电流上限时,积分项停止累加。
4.2 动态电压修正与 SOC 对齐
端电压差均衡在电池组低电流状态下表现很好,但在负载电流变化比较大的备用电源系统里会出问题。
举个例子,电池包正在给负载放电,电流 2A。Cell1 内阻 40mΩ,Cell2 内阻 60mΩ,那么负载电流在 Cell2 上产生的压降比 Cell1 多 40mV。此时即使两颗电芯的开路电压一致,端电压也会显示 Cell1 比 Cell2 高 40mV,均衡器如果完全按端电压驱动,就会错误地把 Cell1 的能量往 Cell2 搬。
解决方法是做 IR 压降补偿。系统在放电时,软件估算当前的负载电流,减去每颗电芯内阻上的压降,把端电压换算成估计的开路电压,再用这个估计值去做均衡判断。公式很简单:
V_OCV_est = V_terminal - I_load * R_est关键是 R_est 怎么得到。我没有去做复杂的在线参数辨识,而是采用了一个两状态查表法:系统在静置状态下记录一次开路电压,然后带载状态测量同一个 SOC 点的端电压,两者之差除以当前电流,就是该 SOC 点下的内阻估算值。这个估算值会在每次充放电循环结束后更新。
做完这个修正之后,均衡动作的准确率提升非常明显。特别是在浮充转放电的瞬间,不会再有错误方向的均衡脉冲出现了。
4.3 均衡电流上限的选取逻辑
两串电池均衡电流到底取多大,没有统一答案,跟电芯容量和散热条件强相关。我项目里用的是 18650 电芯,容量 2.5Ah,均衡电流最终设在 0.6A 左右。如果均衡电流太大,电芯的极化压降会明显上升,反而干扰端电压判断;如果太小,则需要很长时间才能拉平电压差。
经验上,均衡电流可以按 0.1C 到 0.25C 来选。2.5Ah 的电芯,0.1C 是 250mA,0.25C 是 625mA。设在 0.6A 能够在 20 到 30 分钟内把 50mV 左右的电压差拉平,效果已经足够好。如果你用的是更大容量的储能电芯,比如 100Ah 磷酸铁锂,均衡电流可以做 5A 以上,这时候 MP2642GR-Z 的散热设计就要重新评估,可能要外部加强散热片。
我也测试过把电流拉到 1.2A,半小时后芯片外壳温度到了 65℃ 左右,虽然还在正常工作范围内,但我长期运行不放心,后来还是降回 0.6A 并加了热设计余量。
5. 实测数据、调试记录和避坑速查
5.1 一次完整的均衡实验记录
项目开发过程中,我做了一组比较完整的均衡验证实验,用的是两颗容量差异较大的 18650 三元电芯。
实验前,Cell1 静置开路电压 3.652V,Cell2 静置开路电压 3.402V,电压差 250mV。两颗电芯串联成 2S1P 电池组,通过 MP2642GR-Z 做主动均衡。
系统启动后,Cell1 向 Cell2 转移能量的过程大概是这样的:
| 时间点 | Cell1 电压 | Cell2 电压 | 均衡电流 | 电压差 | 状态 |
|---|---|---|---|---|---|
| 0s | 3.652V | 3.402V | 0A | 250mV | 启动判断 |
| 10s | 3.650V | 3.406V | 0.4A | 244mV | 进入均衡 |
| 5min | 3.631V | 3.431V | 0.6A | 200mV | 均衡中 |
| 15min | 3.598V | 3.468V | 0.6A | 130mV | 均衡中 |
| 30min | 3.551V | 3.517V | 0.5A | 34mV | 接近完成 |
| 38min | 3.535V | 3.526V | - | 9mV | 停止均衡 |
最终电压差停在了 9mV 左右,低于 8mV 停止阈值附近,由于采样噪声存在一点小幅波动,实际在 8mV 到 12mV 之间。整个过程用时约 38 分钟,转移的平均功率大概 1.8W,这个结果对备用电源场景来说非常理想。
这个实验我还用了一个对照测试:同样两颗电芯,只做被动均衡,均衡电流限制在 100mA,把 250mV 的压差拉到 10mV 以内大约花了 3 个半小时,而且在均衡期间外壳有明显的发热。主动均衡在响应速度上的优势一目了然。
5.2 常见问题速查表
遇到比较多的问题,集中在采样、通信和功率路径这几个方向。我整理了一份排查表,直接对照着查效率很高。
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 均衡开始后电压差几乎不变 | 均衡方向判断反了 | 检查方向控制 IO 逻辑,反接两电池采样线验证 |
| MCU 读到的电压跳变超过 50mV | ADC 引脚缺少滤波或采样时间太短 | 给每个采样通道加 RC 滤波,延长 ADC 采样保持时间 |
| 均衡电流比设定值小很多 | 电流采样电阻阻值偏大或校准系数错误 | 用电流钳实测,重新做电流校准 |
| 空载时误启动均衡 | 采样通道相对误差大造成虚假压差 | 做两通道校准,检查分压电阻实际精度 |
| 均衡时 MCU 复位 | 功率路径噪声干扰 | 检查电源去耦,MCU 供电用 LDO 单独供电并加 TVS |
| 均衡效率低,发热严重 | 电感饱和或开关频率配置不当 | 替换低 DCR 电感,核对 MP2642 的开关频率配置 |
| 静置后电压差反弹超过预期 | 电芯极化恢复或均衡过冲 | 降低停止阈值,增加静置时间后再复检 |
这个表里最容易被坑的是第一项:方向判断反了。我在早期原型机上就犯过一次,原因是 Cell1 和 Cell2 的定义在硬件原理图和固件头文件里没有统一,两边的极性标注正好相反。电压差明明显示 Cell1 高,实际却在把 Cell2 的能量往 Cell1 搬,等于越均衡越恶化。建议大家在画板子的时候就在原理图网络标号里明确 CELL1_POS、CELL1_NEG、CELL2_POS、CELL2_NEG,固件里的定义和原理图完全保持一致。
5.3 容易被忽略的三个细节
第一个细节是均衡停止后的极化恢复。电芯在持续被充入或放出电流时,内部锂离子浓度分布会发生变化,切断电流后,电压会有一个回摆过程。这个回摆值通常有 10mV 到 30mV。如果停止均衡后立刻检测电压差并判断是否达标,会把极化回摆误当成“恢复得不好”,导致系统反复启动。我的做法是均衡停止后强制静置 5 分钟,再进入状态判断。
第二个细节是浮充状态下的均衡禁止。备用电源经常长时间处于浮充状态,浮充电压实际上是被限定在某个区间内。此时在均压过程中,MP2642GR-Z 不断从高压电芯往低压电芯搬能量,看起来是在做有用的工作,但实际上因为浮充电源一直在补充总电压,整个系统的电压差又会被浮充机慢慢拉回去,均衡器可能永不停歇地工作。正确的策略是浮充模式下关闭均衡,只在静置模式和放电模式下允许均衡。
第三个细节是均衡任务的看门狗。我最初把均衡任务和 ADC 采样任务放在一个大循环里,一旦某个模板块出现延时,均衡任务会错过执行时机。后来我改成时间片轮询,把每项任务分配到明确的周期里:ADC 采样 1kHz,状态机 10Hz,上位机通信 10Hz,同时给状态机单独开了硬件看门狗喂狗通道。这样即使某个任务卡住,系统会在 1 秒内自动复位,恢复到安全的默认状态。
6. 实际操作中的一些体会:均衡不只是“搬能量”
说点实在的。我在这个项目里踩过最大的坑,不是芯片不会用,而是把均衡想成了一个简单的“电压大小比较器”。实际上,主动均衡在储能和备用电源里的核心价值,是把电池组长期保持在良好的一致性区间,让每一颗电芯的容量都能被完整利用。
用一句话总结我的经验:均衡电流不是越大越好,均衡响应不是越快越好,真正重要的是“知道什么时候不均衡”,以及“知道什么时候停下来”。MP2642GR-Z 把功率部分做得很省心,剩下的系统设计难点全在采样准确度、状态机和动态补偿上。
对于准备做类似项目的朋友,我的建议是先把两个电芯的电压采样通道校准做好,再去调均衡算法。采样不准,后面所有逻辑都是空中楼阁。其次,一定要加迟滞和静置时间,别让均衡器变成一个不停抖动的继电器。
最后分享一个小技巧:开发阶段给 STM32F722ZE 的 UART 接一个无线透传模块,把两颗电芯电压、均衡电流、状态机状态全部周期性发出去,现场调试时用手机看数据,比接杜邦线看串口要方便得多。有了这些实时数据,你会对电池系统的真实行为有非常直观的感知,很多问题不用猜就能直接看出来。