首页 / 资讯中心 / 文章详情

基于MP2642GR-Z与STM32F767BI的两串电池被动均衡BMS设计实战

基于MP2642GR-Z与STM32F767BI的两串电池被动均衡BMS设计实战 ★ FEATURED ARTICLE
1. 从两个串联电芯说起为什么被动均衡在储能BMS里依然是主流选择储能系统和备用电源系统里电池组的安全与寿命很大程度上取决于电芯之间的一致性。两个串联电芯的架构看起来简单——比如两节磷酸铁锂或三元锂电芯串起来标称电压7.4V左右——但恰恰是这种小串数架构在便携储能、小型UPS、通信基站备电、太阳能路灯等场景里用得极多。问题也随之而来两节电芯出厂时容量、内阻、自放电率就有差异用久了差异还会被放大充电时容量小的那节先到上限放电时它又先到下限整组可用容量被最弱的那节电芯死死卡住。均衡要解决的就是这件事。均衡分两条技术路线被动均衡和主动均衡。被动均衡说白了就是给电压偏高的那节电芯并一个电阻把多余的电量以热量形式放掉等两节电压拉平。主动均衡则是把电量从高电压电芯搬到低电压电芯能量不浪费但电路复杂、成本高、控制逻辑也麻烦。在储能和备用电源这类对成本敏感、均衡电流需求不大的场景里被动均衡凭借电路简单、可靠性高、静态功耗可控的优势依然是绝大多数方案的首选。这次要聊的方案核心器件是MP2642GR-Z和STM32F767BI。MP2642GR-Z是一颗面向电池管理的模拟前端类器件负责电芯电压采集、均衡开关驱动这些底层活儿STM32F767BI是ST的Cortex-M7高性能MCU主频高、外设丰富负责跑均衡策略、做状态判断、跟上层通信。两者配合构成一个典型的两串电池均衡控制系统。这套组合的价值在于用一颗专用模拟前端把危险的、需要高精度采样的活儿接过去让MCU专注在策略和通信上既保证了采样精度和均衡安全又留足了算力余量给后续功能扩展。这篇文章面向的是正在做小型储能BMS、备用电源管理板、或者两串电池保护板的硬件和嵌入式工程师。如果你正在纠结均衡电路怎么搭、采样精度怎么保证、均衡策略怎么写、MCU和前端怎么配合那接下来的内容应该能帮你少走不少弯路。我会从器件选型逻辑、硬件连接细节、均衡策略实现、实测踩坑几个维度展开尽量把每个为什么这么做讲透。2. MP2642GR-Z与STM32F767BI的分工逻辑谁该干什么活2.1 为什么不让MCU直接采集电芯电压很多刚入行的工程师第一反应是两节电芯而已用STM32F767BI的ADC直接采不就行了分压电阻一搭两个通道一读完事。这个思路在小电流、低精度场景下勉强能用但放到储能和备用电源系统里问题会一个接一个冒出来。首先是共模电压问题。两节电芯串联第二节电芯的正极对地电压是两节电压之和比如8.4V。STM32的ADC输入范围通常以VDDA为参考一般3.3V你直接采8.4V会烧引脚。用分压电阻可以解决电压范围但分压电阻的精度、温漂会直接引入采样误差。储能系统里电芯电压采样精度通常要求做到±10mV以内普通1%精度的分压电阻在温度变化下很难稳住这个指标。其次是采样时序和隔离。两节电芯的电压需要同步采集否则在充放电电流波动时先后采集的两个值对应的工况不同算出来的压差是假的。MCU的ADC多通道轮询采集存在时间差而专用前端器件通常支持同步采样或者快速顺序采样能保证数据的一致性。MP2642GR-Z这类器件就是为解决这些问题设计的。它内部集成了高精度ADC、分压网络、均衡开关驱动直接跨接在电芯组上通过通信接口把数字化后的电压值送给MCU。MCU拿到的是已经处理好的、精度有保证的数据不用再操心模拟前端的那些坑。这就是分工的核心逻辑模拟的归模拟数字的归数字。2.2 STM32F767BI在这套系统里到底承担什么角色既然前端把采样和均衡驱动都做了那STM32F767BI是不是就闲着恰恰相反它的活儿一点不轻松。第一是均衡策略的执行。前端只负责采和放但什么时候放、放多久、放到什么程度这些决策得MCU来做。比如两节电芯压差超过多少mV才启动均衡、均衡时是持续放还是PWM间歇放、温度过高时要不要暂停均衡这些都是策略层面的东西需要MCU根据实时数据判断。第二是系统状态管理。储能和备用电源系统不是孤立运行的它要跟充电管理、放电管理、上位机通信配合。MCU要综合电芯电压、电流、温度判断当前是充电、放电还是待机状态不同状态下均衡策略可能完全不同。比如充电末期是均衡的黄金窗口这时候压差最容易拉大均衡要更积极放电过程中均衡意义不大反而可能加剧不一致。第三是通信和记录。STM32F767BI带CAN、UART、USB、以太网等丰富外设可以方便地跟系统主控或上位机对接把电芯电压、均衡状态、告警信息上报。F767的Flash和RAM都够大还能做历史数据记录方便后期分析电芯衰减趋势。第四是算力预留。F767是Cortex-M7内核带双精度浮点单元跑一些简单的SOC估算、健康度评估算法绰绰有余。虽然两串系统用不上太复杂的算法但留足算力意味着后续功能升级不用换主控。2.3 两者配合的通信方式选择MP2642GR-Z和STM32F767BI之间怎么通信是个需要认真对待的问题。常见的选择有I2C、SPI、UART几种。I2C线少、协议简单但速度偏慢而且多器件挂载时地址冲突和总线锁死是常见坑。SPI速度快、全双工适合数据量大的场景但线多隔离设计麻烦。UART简单直接点对点通信不容易出幺蛾子。具体选哪个要看MP2642GR-Z支持的接口类型和系统对采样速率的要求。如果只是两串电池、采样率要求不高比如每秒几次I2C完全够用布线也省事。如果系统里还有其他I2C器件地址规划要提前做好避免冲突。不管选哪种通信的可靠性设计都不能省上拉电阻要算对、走线要短、必要时加隔离或TVS保护这些细节后面会展开讲。3. 硬件连接与关键参数计算把原理图上的每个电阻都算明白3.1 电芯到前端的连接采样线和均衡线的处理MP2642GR-Z跨接在两节串联电芯上需要连接的电芯节点有三个电芯组负极也就是系统地、两节电芯之间的中点、电芯组正极。这三个点分别对应第一节电芯的负极、第一节电芯的正极兼第二节电芯的负极、第二节电芯的正极。采样线要从电芯节点引到前端器件的对应引脚。这里有个容易被忽视的细节采样线要尽量短并且从电芯节点单独走线不要跟大电流的充放电回路共用走线。原因很简单充放电电流在走线电阻上产生的压降会叠加到采样电压上电流越大误差越大。储能系统充放电电流可能到几安甚至十几安哪怕走线电阻只有几毫欧压降也能到几十毫伏直接把采样精度毁掉。正确做法是从电芯极耳或者最近的连接点单独引采样线走线尽量细但不要断形成开尔文连接的效果。均衡线通常和采样线共用节点因为均衡就是在电芯两端并电阻。但要注意均衡电流的路径均衡电流从电芯正极流出经过前端内部的均衡开关和外部均衡电阻回到电芯负极。这条路径上的走线要能承受均衡电流线宽要够。如果均衡电流设100mA走线至少按200mA的余量设计别让走线成了保险丝。3.2 均衡电阻的选型与功耗计算均衡电阻是这套系统里唯一主动发热的元件选型和布局都要慎重。均衡电流的大小直接决定均衡速度和发热量。两串电池组容量通常不大比如几安时到几十安时均衡电流设50mA到200mA比较常见。设太大电阻功耗高、发热大PCB布局困难设太小均衡慢充电窗口期内可能均衡不完。假设均衡电流设为100mA单节电芯最高电压按4.2V算均衡电阻上的功耗是P I² × R 0.1² × R均衡电阻阻值由均衡电流和电芯电压决定R V / I 4.2V / 0.1A 42Ω。取标准值43Ω实际电流约97.7mA功耗约0.41W。这个功耗不算大但也不能用0402或0603封装硬扛建议用0805或1206封装功率余量留一倍以上选1W的电阻更稳妥。如果均衡电流设200mA电阻约21Ω功耗约0.84W这时候就得考虑电阻的散热和PCB铜箔面积了。多个电阻挨着放会互相加热布局时要拉开间距或者用多个电阻并联分摊功耗。注意均衡电阻的功耗计算要按电芯最高电压算不能按标称电压算。磷酸铁锂充满4.0V左右三元锂充满4.2V算功耗时取上限否则实际功耗会超出预期。3.3 去耦与滤波别让噪声毁了采样精度前端器件的供电和参考电压引脚去耦电容不能省。一般建议每个供电引脚配一个0.1μF的陶瓷电容紧贴引脚放置再配一个1μF到10μF的储能电容。参考电压引脚如果外接基准去耦要求更高要按基准器件的手册来。采样线上的滤波也要考虑。电芯电压本身比较干净但充放电回路的高频噪声可能耦合过来。可以在采样节点对地加一个小电容比如100nF构成RC低通滤波。电容不能太大否则会拖慢采样响应均衡开关动作时也会影响电压恢复。100nF配前端器件的输入阻抗截止频率通常在几十kHz足够滤掉开关噪声又不影响正常采样。如果系统里有大功率开关电源或者电机类负载采样线的滤波要更讲究可能需要共模电感或者屏蔽线。具体方案要看实际噪声环境没有万能公式实测波形是最可靠的判断依据。3.4 保护设计均衡开关失效时会发生什么被动均衡最大的风险是均衡开关失效。如果开关短路均衡电阻会一直挂在电芯上持续放电轻则把电芯放亏重则过热起火。所以均衡回路必须有保护。前端器件通常有均衡超时保护比如单次均衡时间超过设定值就强制关闭。这个功能要用起来不能只靠MCU软件计时。MCU软件可能跑飞或者死循环硬件超时保护是最后一道防线。另外均衡电阻附近建议加温度检测用NTC贴在电阻旁边MCU定期读温度超过阈值就暂停均衡并告警。这个成本不高但能有效防止热失控。储能系统的安全要求比消费电子高得多这些保护措施不能省。4. 均衡策略的代码实现从压差判断到状态机4.1 采样数据的读取与滤波STM32F767BI从MP2642GR-Z读到的电压数据不能直接拿来用要先做滤波。前端器件的ADC本身有噪声通信过程也可能引入误码所以需要软件滤波。最简单的滤波是滑动平均取最近N次采样求平均。N取8到16比较合适太小滤波效果不明显太大响应慢。滑动平均对周期性噪声效果好但对突发干扰无能为力。可以再加一个中值滤波取最近N次采样的中值能有效剔除偶发的跳变值。两者结合先中值再平均效果比较稳。滤波之后还要做合理性判断。两节电芯电压应该在合理范围内比如磷酸铁锂在2.0V到4.0V之间三元锂在2.5V到4.3V之间。超出范围的数据直接丢弃并记录异常次数连续异常就告警。这个判断能防止前端器件故障或者通信错误导致的误动作。#define FILTER_N 8 typedef struct { uint16_t buf[FILTER_N]; uint8_t idx; uint8_t cnt; } filter_t; uint16_t filter_update(filter_t *f, uint16_t new_val) { f-buf[f-idx] new_val; f-idx (f-idx 1) % FILTER_N; if (f-cnt FILTER_N) f-cnt; /* 中值滤波拷贝后排序取中间值 */ uint16_t tmp[FILTER_N]; memcpy(tmp, f-buf, sizeof(tmp)); /* 简单插入排序N很小开销可忽略 */ for (int i 1; i f-cnt; i) { uint16_t key tmp[i]; int j i - 1; while (j 0 tmp[j] key) { tmp[j 1] tmp[j]; j--; } tmp[j 1] key; } return tmp[f-cnt / 2]; }上面这段代码是中值滤波的实现N取8排序开销很小F767跑起来毫无压力。实际项目中我会把中值和滑动平均串起来用先中值剔除跳变再滑动平均平滑数据。4.2 均衡启动与停止的阈值设计均衡什么时候启动、什么时候停止直接决定均衡效果和系统功耗。阈值设得太紧均衡频繁启停开关损耗和发热都上去了设得太松压差拉大了才均衡效果差。常见的做法是设两个阈值启动阈值和停止阈值中间留一个回差。比如压差超过30mV启动均衡压差降到10mV以下停止。回差的存在避免了压差在阈值附近波动时均衡反复开关。阈值具体设多少跟电芯类型和系统要求有关。磷酸铁锂的电压平台很平压差本来就小启动阈值可以设20mV到30mV。三元锂电压曲线陡压差容易拉大启动阈值可以设30mV到50mV。储能系统对寿命要求高阈值可以设紧一点让电芯一致性保持得更好。还有一个细节均衡只在充电末期或者静置状态下做放电过程中不做。原因是放电时电芯电压受内阻和电流影响大采到的电压不能真实反映SOC差异这时候均衡可能越均越乱。充电末期电芯接近满充电压对SOC敏感压差能真实反映容量差异这时候均衡最有效。4.3 均衡状态机的实现均衡逻辑用状态机写最清晰。状态可以分几个空闲、均衡中、暂停、故障。空闲状态定期采样判断是否满足均衡启动条件。满足就进均衡中不满足就继续空闲。均衡中状态打开压差高的那节电芯对应的均衡开关持续采样监控。如果压差降到停止阈值以下关闭均衡回空闲。如果温度超限或者收到暂停命令进暂停状态。如果检测到故障比如电压异常、通信中断进故障状态。暂停状态关闭所有均衡开关等待条件恢复。温度降下来或者暂停命令解除后回空闲重新判断。故障状态关闭均衡上报故障等待人工处理或者自动恢复条件满足。typedef enum { BAL_IDLE 0, BAL_ACTIVE, BAL_PAUSE, BAL_FAULT } bal_state_t; typedef struct { bal_state_t state; uint8_t active_cell; /* 0: 第一节, 1: 第二节 */ uint32_t start_tick; uint32_t accum_ms; } bal_ctx_t; #define BAL_START_MV 30 #define BAL_STOP_MV 10 #define BAL_MAX_TEMP 60 #define BAL_MAX_ON_MS (30 * 60 * 1000UL) /* 单次最长30分钟 */ void bal_task(bal_ctx_t *ctx, uint16_t v0, uint16_t v1, int16_t temp) { uint16_t diff (v0 v1) ? (v0 - v1) : (v1 - v0); switch (ctx-state) { case BAL_IDLE: if (temp BAL_MAX_TEMP) break; if (diff BAL_START_MV) { ctx-active_cell (v0 v1) ? 0 : 1; ctx-start_tick HAL_GetTick(); ctx-accum_ms 0; bal_switch_on(ctx-active_cell); ctx-state BAL_ACTIVE; } break; case BAL_ACTIVE: ctx-accum_ms HAL_GetTick() - ctx-start_tick; if (temp BAL_MAX_TEMP) { bal_switch_off(ctx-active_cell); ctx-state BAL_PAUSE; } else if (diff BAL_STOP_MV) { bal_switch_off(ctx-active_cell); ctx-state BAL_IDLE; } else if (ctx-accum_ms BAL_MAX_ON_MS) { bal_switch_off(ctx-active_cell); ctx-state BAL_PAUSE; } break; case BAL_PAUSE: if (temp BAL_MAX_TEMP - 5) { /* 5度回差 */ ctx-state BAL_IDLE; } break; case BAL_FAULT: default: bal_switch_off(0); bal_switch_off(1); break; } }这段状态机代码把启动、停止、超时、过温几种情况都覆盖了。实际项目里还要加上通信中断判断、电压异常判断逻辑类似都是往故障状态跳。4.4 均衡与充电阶段的配合均衡效果最好的时机是充电末期。充电过程中电芯电压逐渐上升容量小的那节先到上限压差开始拉大。这时候启动均衡把高电压电芯的多余电量放掉让充电电流能继续给低电压电芯充直到两节都充满。实现上MCU要跟充电管理逻辑配合。充电器通常有恒流和恒压两个阶段。恒流阶段电芯电压还没到上限压差不大均衡可以不启动或者小电流启动。恒压阶段电压接近上限压差拉大均衡要全力工作。MCU可以根据充电状态调整均衡策略比如恒压阶段把启动阈值调低让均衡更积极。还有一个细节均衡时放掉的是电量充电器要能补上这部分电量否则均衡会拖慢充电速度。如果充电器功率有限均衡电流要设小一点避免充电电流全被均衡吃掉。这个平衡要根据实际充电器能力和电芯容量来调。5. 实测中踩过的坑从采样跳变到均衡发热5.1 采样值周期性跳变地线走线惹的祸项目调试初期遇到一个怪现象两节电芯的采样值每隔几秒就跳变一次跳变幅度几十毫伏而且两节电芯的跳变方向相反一个变大一个变小。用示波器看采样线波形发现跳变跟充电电流的PWM调制同步。排查过程先怀疑前端器件配置问题换了采样速率、改了滤波参数没用。再怀疑通信误码加了校验和重传还是跳。最后用示波器同时看采样线和地线发现地线上有几十毫伏的开关噪声而且采样线的地回路和功率地回路共用了一段走线。根因很清楚采样线的地回路和充放电功率回路共用了走线功率电流在地线电阻上产生的压降叠加到了采样回路上。两节电芯的采样回路共用同一段地线压降方向相反所以一个采样值偏大一个偏小。解决办法把采样线的地回路单独走线从电芯负极单独引一根地线到前端器件的地引脚跟功率地分开最后在电芯负极单点汇合。改完之后跳变消失采样值稳定在±5mV以内。这个坑的教训是小信号采样线的地回路一定要跟功率回路分开哪怕多走一根线也比后期调试省事。5.2 均衡电阻发热导致邻近采样漂移均衡电阻工作时会发热如果布局时离采样线或者前端器件太近热量会传导过去导致采样值漂移。实测中遇到过均衡启动后被均衡那节电芯的采样值慢慢偏高均衡停止后又慢慢恢复漂移幅度十几毫伏。原因是均衡电阻紧挨着采样线的走线电阻发热后走线电阻变化加上前端器件温度升高后基准电压漂移两个因素叠加。解决办法是把均衡电阻挪到远离采样线和前端器件的位置并且加大电阻焊盘和铜箔面积帮助散热。改完之后漂移降到几毫伏以内可以接受。如果PCB空间实在紧张挪不开可以考虑用两个电阻并联分摊功耗降低单个电阻的温升。或者用带散热焊盘的功率电阻把热量导到PCB内层铜箔上。5.3 通信偶发失败上拉电阻和总线电容的匹配I2C通信在实验室跑得好好的到了现场偶尔失败失败后总线锁死要断电重启才能恢复。这种问题最头疼因为复现困难。排查思路先看上拉电阻。I2C的上拉电阻要根据总线电容和通信速率算。总线电容包括走线电容、器件引脚电容、连接器电容一般按100pF到200pF估算。上拉电阻太大上升沿变缓高速通信时数据出错上拉电阻太小功耗大器件可能拉不低。标准模式100kHz下上拉电阻常用4.7kΩ到10kΩ。快速模式400kHz下用2.2kΩ到4.7kΩ。如果总线电容大上拉电阻要相应减小。实测中把上拉电阻从10kΩ换成4.7kΩ通信失败率明显下降。另外I2C总线锁死通常是从机在传输过程中被复位或者干扰导致时钟线被拉低不放。解决办法是在软件里加总线恢复逻辑检测到总线锁死时把SCL当普通GPIO用手动发9个时钟脉冲让从机释放总线。这个逻辑很实用建议都加上。5.4 均衡开关误动作上电时序没处理好系统上电时MCU和前端器件的上电时序如果不匹配可能出现均衡开关误动作。实测中遇到过一上电均衡电阻就发热但MCU还没开始跑程序说明是前端器件在上电过程中自己把均衡开关打开了。查前端器件手册发现它的均衡开关默认状态跟某个配置引脚的电平有关。这个引脚在上电时如果悬空或者电平不确定均衡开关可能默认打开。解决办法是给这个配置引脚加一个下拉电阻确保上电时是确定的低电平均衡开关默认关闭。MCU初始化完成后再通过通信配置前端器件打开需要的功能。这个坑的教训是上电时序和默认状态一定要仔细看手册不能想当然。尤其是涉及功率输出的引脚默认状态必须是安全的。6. 从两串到多串这套方案的扩展思路两串电池均衡是最简单的场景但实际项目里经常需要扩展到三串、四串甚至更多。MP2642GR-Z这类前端器件通常支持级联多颗器件串起来可以覆盖更多电芯。STM32F767BI的通信外设丰富可以挂多路I2C或者SPI也可以加多路复用器扩展。扩展时要注意几个点。一是通信地址规划多颗前端器件挂同一总线时地址不能冲突通常通过配置引脚设置不同地址。二是采样同步多颗器件的采样时刻要尽量对齐否则算出来的压差没有意义。三是均衡策略要升级两串时只需要比较两节电压多串时要找出最高和最低的那节均衡逻辑更复杂但核心思路一样把高的放掉等低的追上来。STM32F767BI的算力跑多串均衡策略绰绰有余甚至可以跑一些简单的模型预测提前判断哪节电芯会先到上限提前启动均衡。这些进阶玩法等基础功能稳定了再考虑先把两串的采样精度和均衡可靠性做扎实。7. 几个容易被忽视的细节写在实际项目收尾时第一个细节是均衡次数的记录。每次均衡启动和停止都记一条日志包括时间、电芯电压、压差、持续时间。这些数据短期看不出价值但用几个月后回头看能清楚看到哪节电芯衰减快、均衡越来越频繁是判断电芯健康度的好材料。STM32F767BI的Flash够大存几个月的数据没问题。第二个细节是均衡开关的软启动。均衡开关突然打开电芯电压会瞬间被拉低一点如果采样正好在这个瞬间会读到异常值。可以在打开均衡开关后延时几十毫秒再采样或者用PWM软启动让均衡电流逐渐上升。这个细节对采样精度要求高的系统很有用。第三个细节是低功耗模式下的均衡处理。备用电源系统很多时候是待机的MCU可能进低功耗模式。均衡在待机时通常不需要做但前端器件的采样不能停否则电芯过放没人管。可以让前端器件独立做低压保护MCU定期唤醒读数据这样既省电又安全。第四个细节是均衡电阻的降额。电阻的实际功耗要按额定功率的50%以下用比如算出来0.4W就选1W的电阻。电阻长期工作在高温下阻值会漂移寿命会缩短。降额使用虽然多花几分钱但可靠性提升明显储能系统里这点成本值得花。这套MP2642GR-Z加STM32F767BI的两串均衡方案我从选型到调试走了一遍最大的体会是模拟前端的活儿交给专用器件MCU专注策略和通信分工清晰调试起来心里有底。采样精度和均衡可靠性是两串系统的命门地线走线、滤波设计、保护逻辑这三块做扎实后面基本不会出大问题。均衡策略不用追求复杂阈值加回差加状态机简单可靠就是最好的策略。
阅读完成 · 觉得有帮助?
咨询建站