1. 储能电池均衡的工程背景与核心需求
1.1 为什么两串电池组需要主动均衡
储能系统和备用电源系统里,两串锂电池组是最常见的低压架构之一。不管是通信基站的备电模块、家庭光伏的储能小柜,还是工业设备里的UPS后备单元,只要用到两节电芯串联,就绕不开一个老生常谈的问题:两颗电芯的一致性会随着循环次数逐渐分化。
新出厂的电芯,容量差可能只有1%到2%,电压差在静置状态下也就十几毫伏。但经过几百次充放电循环之后,由于制造工艺的微小差异、温度分布的不均匀、自放电率的不同,两颗电芯的荷电状态(SOC)会越拉越开。串联结构里,充电电流和放电电流对两颗电芯是相同的,谁容量小谁就先到截止电压。充电时容量小的那颗先冲到4.2V,保护板为了安全必须切断充电,此时另一颗可能才4.05V,整个电池组的可用容量就被那颗弱的拖累了。放电时同理,弱的那颗先跌到3.0V,系统就得停止放电,强的那颗还剩一堆电量放不出来。
长期这么跑下去,弱电芯会加速老化,形成恶性循环。我见过一个通信备电项目,两串磷酸铁锂跑了两年,两颗电芯的电压差从出厂时的20mV拉到了180mV,整组可用容量掉了将近三成。所以,主动均衡不是锦上添花,而是两串架构下维持系统寿命的必要手段。
1.2 被动均衡与主动均衡的取舍
市面上最常见的均衡方案是被动均衡,说白了就是给每颗电芯并一个电阻,电压高的那颗通过电阻放电,把多余的能量以热量形式消耗掉。这个方案便宜、简单,一颗均衡IC加几个外围电阻就能搞定。但它有两个硬伤:一是能量全变成热,效率为零;二是均衡电流通常只有几十毫安,对于容量几千毫安时以上的储能电芯来说,均衡速度慢得让人着急。
主动均衡则是把电压高的电芯的能量搬到电压低的电芯去,效率高、均衡电流大。常见的主动均衡拓扑有电感式、电容式、变压器式几种。电感式均衡在两串架构里特别合适,因为只需要一个电感就能在上下两颗电芯之间转移能量,元件少、成本可控、效率能到85%以上。
这次项目选用的MP2642GR-Z就是一颗专门为两串电池主动均衡设计的控制芯片,配合STM32F745VG做系统主控,实现了一套完整的均衡方案。下面我把整个设计思路、芯片选型逻辑、实操细节和踩过的坑都摊开来讲。
1.3 目标读者与阅读收益
这篇内容适合正在做储能BMS、备用电源管理、或者任何涉及两串锂电池均衡的硬件工程师和嵌入式开发者。如果你正在纠结选被动还是主动均衡、不知道怎么配MP2642的外围参数、或者STM32那边的控制逻辑写不顺,那这篇东西应该能帮你省下不少调试时间。我会把芯片的关键参数计算过程、电感选型、采样时序、状态机设计都讲清楚,代码部分也会给出可直接参考的框架。
2. 方案整体设计与关键器件选型
2.1 系统架构总览
整个均衡系统分成三层:功率级、控制级、监控级。
功率级就是MP2642GR-Z加上外围的电感、采样电阻和两颗电芯。MP2642内部集成了上下两个功率MOSFET和驱动电路,外面只需要接一个均衡电感就能实现双向能量转移。芯片的工作模式是:检测到两颗电芯电压差超过设定阈值时,启动均衡,把高电压电芯的能量通过电感泵到低电压电芯去。
控制级是STM32F745VG,负责配置MP2642的工作参数、读取均衡状态、管理整个系统的充放电逻辑。F745VG这颗料在储能BMS里用得很多,Cortex-M7内核跑200MHz,浮点运算和DSP指令集都有,做SOC估算和均衡策略绰绰有余。它的CAN、UART、SPI、I2C外设齐全,方便跟上位机或其他模块通信。
监控级包括电压采样、电流采样和温度采样。电压采样我用的是STM32内部的12位ADC,配合外部精密分压电阻。电流采样用霍尔传感器,温度用NTC热敏电阻。这些数据用来判断均衡的启动条件和终止条件。
2.2 MP2642GR-Z的核心特性与选型理由
MP2642GR-Z是一颗两串电池主动均衡控制器,关键参数如下:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 工作电压范围 | 4V~36V | 覆盖两串锂电和两串磷酸铁锂 |
| 均衡电流 | 最大2A | 取决于外部电感选型 |
| 均衡效率 | 最高93% | 电感式能量转移 |
| 静态电流 | 15μA | 待机时几乎不耗电 |
| 通信接口 | I2C | 最高400kHz |
| 封装 | QFN-16 | 3mm x 3mm |
选它的理由很直接:集成度高、外围简单、效率够用。相比用分立MOS搭电感均衡电路,MP2642把驱动、死区控制、电流检测全集成进去了,PCB面积能省一半以上。而且它的I2C接口可以直接跟STM32通信,不需要额外的隔离或电平转换。
注意:MP2642GR-Z的均衡电流不是固定的,由外部电感值和芯片内部设定的峰值电流决定。选电感的时候要算清楚,不然要么均衡太慢,要么电感饱和烧芯片。
2.3 STM32F745VG在系统中的角色分配
STM32F745VG在这个项目里干四件事:
第一,初始化配置。上电后通过I2C配置MP2642的均衡阈值、峰值电流、工作模式。这些参数不是写死的,而是根据电芯类型和系统状态动态调整。
第二,数据采集与处理。用ADC采集两颗电芯的电压、总电流、温度,做滑动平均滤波,计算SOC和SOH。
第三,均衡策略执行。根据电压差、温度、电流状态决定是否启动均衡、均衡方向、均衡强度。这部分是一个状态机,后面会详细讲。
第四,通信与保护。通过CAN或UART把数据传给上位机,同时监控过压、欠压、过温、过流,异常时切断充放电回路。
F745VG的200MHz主频和512KB Flash、320KB RAM,跑这些任务很轻松。我实测下来,主循环周期1ms,CPU占用率不到15%,还有大量余量做数据记录和算法升级。
2.4 均衡电感与采样电阻的计算过程
均衡电感的值直接决定均衡电流的纹波和峰值。MP2642的数据手册给了公式:
L = (V_cell × (1 - D)) / (f_sw × ΔI_L)
其中V_cell是单颗电芯电压,D是占空比,f_sw是开关频率(MP2642内部固定为200kHz),ΔI_L是电感电流纹波。
假设单颗电芯电压3.7V,占空比0.5,想要纹波电流为平均电流的30%,平均均衡电流1A,则ΔI_L = 0.3A。
L = (3.7 × 0.5) / (200000 × 0.3) = 30.8μH
实际选型取标准值33μH,饱和电流要大于峰值电流1.15A,我选的是4.7A饱和电流的屏蔽电感,留足余量。
采样电阻方面,MP2642通过一个外部电阻设定峰值电流。公式是:
R_sense = V_th / I_peak
V_th内部基准是50mV,I_peak设1.2A,则R_sense = 50mV / 1.2A = 41.7mΩ。取标准值40mΩ,实际峰值电流1.25A,在安全范围内。
实操心得:采样电阻一定要用低温漂的合金电阻,普通厚膜电阻温漂几百ppm,夏天高温时均衡电流会明显偏小。我一开始用了普通0805电阻,温升40度后均衡电流掉了15%,换成合金电阻后稳如老狗。
3. 硬件设计与关键细节解析
3.1 功率级电路布局要点
MP2642的功率级布局有几个死穴,踩中一个就等着看烟花。
第一个死穴是电感的位置。电感要尽量靠近芯片的SW引脚,走线短而粗。我见过一个设计把电感放在板子另一头,走线绕了3厘米,结果SW节点的振铃大到把芯片的过压保护都触发了。正确的做法是电感距离SW引脚不超过5mm,走线宽度至少1mm。
第二个死穴是输入输出电容的接地。MP2642的VIN和GND之间要放一个10μF的陶瓷电容,这个电容的接地回路要尽可能短。如果接地回路太长,高频开关电流会在寄生电感上产生电压尖峰,轻则效率下降,重则芯片损坏。我的做法是在芯片的VIN和PGND引脚旁边各放一个0603封装的10μF电容,接地过孔直接打在焊盘上。
第三个死穴是采样电阻的开尔文连接。采样电阻两端要单独走两根线到芯片的电流检测引脚,不能跟功率走线共用。否则功率走线上的压降会叠加到采样信号上,导致电流检测不准。我一般用0欧姆电阻做开尔文连接点,把采样信号从电阻焊盘的内侧引出。
3.2 电压采样电路的设计与校准
两串电池的电压采样,我用的是电阻分压加STM32内部ADC的方案。分压电阻选100kΩ和10kΩ,分压比11:1,单颗电芯4.2V时分压后是0.38V,在ADC量程内。
但这里有个坑:STM32的ADC输入阻抗不是无穷大,如果分压电阻太大,ADC采样时会拉低电压,导致读数偏小。F745VG的ADC输入阻抗在采样时间较长时大约几百kΩ,跟100kΩ的分压电阻并联后,等效分压比会变化。
解决办法有两个:一是降低分压电阻值,比如用10kΩ和1kΩ,但这样静态功耗会增大到0.4mA,对低功耗系统不友好;二是在分压点和ADC之间加一个电压跟随器,用运放做缓冲。我选了第二个方案,用一颗低功耗运放做缓冲,静态电流只有5μA,既保证了精度又不影响功耗。
校准方面,我在生产时用精密电源给两颗电芯分别加4.0V,记录ADC读数,算出实际的增益和偏移,把校准系数存在STM32的Flash里。这样每块板子的电压采样精度都能做到±5mV以内。
3.3 I2C通信的隔离与保护
MP2642挂在STM32的I2C总线上,但MP2642的供电是电池直接供的,而STM32的供电来自LDO。如果电池电压和LDO输出电压不一致,I2C通信可能会有问题。
更麻烦的是,当系统进入低功耗模式时,STM32可能会断电,但电池还在给MP2642供电。这时候I2C总线上如果有上拉电阻接到STM32的电源,就会通过上拉电阻给STM32的IO口灌电流,导致STM32无法完全断电。
我的做法是在I2C总线上加一颗双向电平转换芯片,同时把上拉电阻接到MP2642的电源侧。这样即使STM32断电,I2C总线也不会反向供电。电平转换芯片选的是自动方向识别的型号,不需要额外的方向控制引脚,省事。
注意:I2C的走线要尽量短,最好在同一层,避免过孔。如果实在要过孔,确保SDA和SCL的过孔数量一致,保持时序对称。我吃过亏,SDA多打了一个过孔,400kHz通信时偶尔出现数据错误,降到100kHz才稳定。
3.4 温度采样与热管理
温度采样用10kΩ的NTC热敏电阻,贴在电芯表面和MP2642的封装旁边。NTC和一颗10kΩ的精密电阻串联分压,接到STM32的ADC。
NTC的阻值随温度变化是非线性的,直接用线性公式算误差很大。我用的是查表法加线性插值,在-20°C到80°C之间每10°C存一个阻值点,共11个点,插值后精度能到±0.5°C。
热管理方面,MP2642在2A均衡电流时自身功耗大约0.3W,QFN封装的热阻约50°C/W,温升15°C左右。如果环境温度50°C,芯片结温65°C,还算安全。但如果均衡电流长期跑2A,建议在芯片底部铺铜散热,过孔打到背面的大铜面。
我实测过,不加散热铜皮时芯片表面温度比环境高22°C,加了铜皮和过孔后只高13°C。这个差距在高温环境下就是能不能稳定工作的区别。
4. 软件架构与均衡策略实现
4.1 系统状态机设计
整个均衡系统的软件核心是一个状态机,我把它分成六个状态:
IDLE:空闲状态,不均衡,只做数据采集。两颗电芯电压差小于30mV时进入这个状态。
BALANCE_UP:均衡方向为下电芯到上电芯。当上电芯电压低于下电芯,且差值超过阈值时进入。
BALANCE_DOWN:均衡方向为上电芯到下电芯。当上电芯电压高于下电芯,且差值超过阈值时进入。
FAULT:故障状态。检测到过温、过流、通信失败时进入,关闭均衡,等待故障清除。
SLEEP:低功耗状态。系统长时间无操作且电压差在允许范围内时进入,MP2642进入待机模式。
CHARGE/DISCHARGE:充放电状态。均衡策略会根据充放电状态调整阈值和电流。
状态之间的切换条件用电压差、温度、电流三个变量判断。比如从IDLE到BALANCE_DOWN的条件是:电压差大于50mV,温度在0°C到60°C之间,电流小于0.1C。这三个条件同时满足才启动均衡,避免误触发。
4.2 均衡阈值与迟滞设计
均衡阈值不能设得太小,否则两颗电芯电压稍微波动一下就触发均衡,均衡电路频繁开关,效率低还发热。也不能设得太大,否则均衡效果不明显。
我的经验值是:启动阈值50mV,停止阈值20mV。也就是说,电压差超过50mV时启动均衡,均衡到电压差小于20mV时停止。这中间的30mV就是迟滞带,防止在阈值附近反复切换。
这个阈值不是固定的,会根据充放电状态调整。充电时电芯电压上升快,阈值可以放宽到60mV;放电时电压下降快,阈值收紧到40mV;静置时电压稳定,阈值用50mV。
代码里用一个结构体存这些参数:
typedef struct { uint16_t balance_start_mv; // 启动阈值 uint16_t balance_stop_mv; // 停止阈值 uint16_t balance_current_ma; // 均衡电流设定 uint8_t balance_enable; // 均衡使能 } BalanceConfig_t; BalanceConfig_t balance_cfg = { .balance_start_mv = 50, .balance_stop_mv = 20, .balance_current_ma = 1000, .balance_enable = 1 };4.3 MP2642寄存器配置与I2C驱动
MP2642的寄存器不多,关键的有四个:
| 寄存器地址 | 名称 | 功能 |
|---|---|---|
| 0x00 | CONFIG | 使能、方向、峰值电流设定 |
| 0x01 | STATUS | 均衡状态、故障标志 |
| 0x02 | VCELL1 | 上电芯电压读数 |
| 0x03 | VCELL2 | 下电芯电压读数 |
配置流程是:先写CONFIG寄存器设定峰值电流和使能,然后读STATUS确认芯片正常,最后根据电压差写方向位。
I2C驱动我用的是STM32的硬件I2C,配置成400kHz快速模式。但这里有个坑:MP2642的I2C时序要求比较严格,特别是起始条件的保持时间。STM32的硬件I2C在400kHz时,如果GPIO的驱动能力设成最低档,上升沿会太慢,导致通信失败。
我的解决办法是把I2C引脚的GPIO速度设成HIGH,同时上拉电阻从10kΩ降到4.7kΩ。这样上升沿时间从1.2μs降到400ns,通信稳定了。
// I2C初始化关键配置 hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); // GPIO速度配置 GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);4.4 电压差计算与均衡方向判断
电压差的计算看起来简单,但实际做的时候要注意采样时序。两颗电芯的电压不能同时采样,STM32的ADC是分时复用的。如果先采上电芯再采下电芯,中间隔了几十微秒,如果这时候有充放电电流,两颗电芯的电压会变化,算出来的差值就不准。
我的做法是在静置状态或者电流小于0.05C时才做均衡判断。如果系统正在大电流充放电,暂停均衡判断,只做数据记录。这样虽然均衡的响应慢了一点,但准确性高,不会因为采样时序问题误判方向。
电压差算出来之后,还要做滑动平均滤波。我用的是8点滑动平均,每1ms采一次,8ms更新一次电压差值。这样既能滤掉开关噪声,又不会引入太大延迟。
#define FILTER_LEN 8 static uint16_t vcell1_buf[FILTER_LEN] = {0}; static uint16_t vcell2_buf[FILTER_LEN] = {0}; static uint8_t filter_idx = 0; uint16_t get_filtered_vdiff(void) { uint32_t sum1 = 0, sum2 = 0; for (int i = 0; i < FILTER_LEN; i++) { sum1 += vcell1_buf[i]; sum2 += vcell2_buf[i]; } uint16_t avg1 = sum1 / FILTER_LEN; uint16_t avg2 = sum2 / FILTER_LEN; return (avg1 > avg2) ? (avg1 - avg2) : (avg2 - avg1); }4.5 均衡过程中的动态调整
均衡启动后,不是一成不变地跑到底。我会根据电压差的变化动态调整均衡电流。
电压差大的时候,比如超过100mV,均衡电流设到1.5A,快速拉近。电压差降到50mV以下时,均衡电流降到0.5A,精细调整。电压差接近停止阈值20mV时,电流降到0.2A,避免过冲。
这个动态调整是通过写MP2642的CONFIG寄存器实现的。MP2642支持16档电流设定,每档125mA,从0.125A到2A。我把它映射成四档:0.2A、0.5A、1A、1.5A,对应不同的电压差区间。
实操心得:动态调整均衡电流能明显缩短均衡时间。我对比过,固定1A均衡从100mV拉到20mV需要42分钟,动态调整只需要28分钟,快了三分之一。而且动态调整时芯片温升更低,因为大电流只跑前半段。
5. 实操调试与问题排查实录
5.1 上电调试的完整流程
板子焊好之后,不要急着上电池。我一般按这个顺序调试:
第一步,静态电流测试。不焊MP2642,只焊STM32和外围,用可调电源加3.3V,测静态电流。正常应该在20mA左右(STM32跑起来后的功耗)。如果超过50mA,检查有没有短路或者GPIO配置错误。
第二步,I2C通信测试。焊上MP2642,但不接电芯,用可调电源给MP2642供5V。STM32跑I2C扫描程序,看能不能读到MP2642的地址。MP2642的7位地址是0x60,写地址0xC0,读地址0xC1。如果读不到,用示波器看SDA和SCL的波形,检查上拉电阻和时序。
第三步,电压采样校准。接上两颗电芯(或者用电源模拟),用万用表测实际电压,对比STM32的ADC读数。如果误差超过10mV,调整校准系数。
第四步,均衡功能测试。故意把两颗电芯的电压拉开,比如一颗3.8V一颗3.6V,看MP2642能不能正常启动均衡。用示波器看电感电流波形,应该是三角波,峰值跟设定值一致。
第五步,温升测试。让均衡跑满1.5A,持续30分钟,用热像仪看MP2642和电感的温度。MP2642表面温度不应超过85°C,电感不超过100°C。
5.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| I2C读不到MP2642 | 上拉电阻太大、地址错误、芯片未供电 | 示波器看波形、万用表测电压 | 换4.7kΩ上拉、确认地址0x60 |
| 均衡不启动 | 电压差未达阈值、温度超限、CONFIG未使能 | 读STATUS寄存器、检查温度 | 调整阈值、检查CONFIG的使能位 |
| 均衡电流偏小 | 采样电阻温漂、电感饱和、VIN电压不足 | 测采样电阻两端电压、看电感电流波形 | 换合金电阻、换大饱和电流电感 |
| 芯片发热严重 | 均衡电流过大、散热不足、开关损耗高 | 热像仪测温度、算功耗 | 降低均衡电流、加散热铜皮 |
| 电压采样跳动 | ADC参考电压不稳、分压电阻温漂、滤波不足 | 测VDDA、换精密电阻、加滤波 | 加LC滤波、用0.1%电阻、增加滑动平均点数 |
| 均衡方向反了 | 电芯接线反、寄存器方向位写反 | 万用表测电芯实际电压 | 调换电芯接线、检查方向位 |
5.3 几个踩过的坑与解决方案
坑一:电感啸叫。均衡启动后电感发出吱吱声,频率跟开关频率一致。原因是电感磁芯松动或者绕组没浸漆。换了一体成型电感后声音消失。如果你遇到类似问题,先确认电感是不是屏蔽式的,开放式电感更容易啸叫。
坑二:均衡时电压采样跳变。均衡电流一启动,ADC读数就跳几十毫伏。原因是均衡电流在采样电阻和走线上产生了压降,叠加到了电压采样回路。解决办法是把电压采样点移到电芯接线端子处,不要跟功率走线共用。我重新画了一版PCB,把采样线单独走,跳变从50mV降到了5mV。
坑三:低温下均衡不启动。冬天在室外测试,温度零下5度,均衡死活不启动。查了半天发现是NTC的阻值表只写到-20°C,但代码里的温度判断下限设的是0°C。把下限改成-10°C后正常。这个坑提醒我,温度保护的范围要根据实际应用场景设定,不能照搬手册。
坑四:I2C通信偶发失败。跑了几小时才出现一次,很难复现。后来用逻辑分析仪抓了半天,发现是STM32在中断里调用了I2C读写,而主循环也在调,两个任务抢总线。加了互斥锁之后问题消失。所以I2C这种共享资源,一定要做好并发保护。
5.4 均衡效果实测数据
我在实验室做了对比测试,两颗280Ah的磷酸铁锂电芯,初始电压差120mV,环境温度25°C。
| 时间 | 上电芯电压 | 下电芯电压 | 电压差 | 均衡电流 |
|---|---|---|---|---|
| 0min | 3.320V | 3.200V | 120mV | 1.5A |
| 10min | 3.295V | 3.225V | 70mV | 1.0A |
| 20min | 3.275V | 3.245V | 30mV | 0.5A |
| 28min | 3.265V | 3.255V | 10mV | 0.2A |
| 30min | 3.262V | 3.258V | 4mV | 停止 |
从120mV拉到4mV用了30分钟,平均均衡电流约0.9A。如果换成被动均衡,100mA的电流需要至少6小时,而且能量全浪费了。主动均衡的优势在这个测试里体现得很明显。
6. 系统优化与扩展思路
6.1 低功耗模式的实现
备用电源系统很多时候是待机状态,均衡电路不能一直跑。我在软件里加了低功耗管理:当电压差小于20mV且持续5分钟,系统进入SLEEP模式。STM32切到STOP模式,MP2642写待机寄存器,整个系统功耗从25mA降到80μA。
唤醒条件是电压差超过30mV或者收到上位机的唤醒命令。STM32的RTC闹钟每10秒唤醒一次,采一次电压,判断是否需要退出SLEEP。这样平均功耗大约120μA,对于备用电源来说完全可以接受。
6.2 SOC估算与均衡策略的联动
单纯的电压均衡有个问题:磷酸铁锂的电压平台很平,3.2V到3.3V之间可能对应30%的SOC变化。如果只看电压差,可能会在SOC差很大的时候电压差却很小,导致均衡不启动。
我的改进方案是结合SOC估算。用安时积分加开路电压校正的方法估算每颗电芯的SOC,当SOC差超过5%时,即使电压差只有10mV也启动均衡。这样能更准确地反映两颗电芯的实际能量差异。
SOC估算的代码框架:
typedef struct { float soc; // 当前SOC float capacity_ah; // 额定容量 float coulomb_count; // 安时积分累计 float ocv; // 开路电压 } CellSOC_t; void soc_update(CellSOC_t *cell, float current_a, float dt_s) { cell->coulomb_count += current_a * dt_s / 3600.0f; float soc_ah = cell->coulomb_count / cell->capacity_ah; // 开路电压校正,静置时调用 if (fabsf(current_a) < 0.01f) { float soc_ocv = ocv_to_soc(cell->ocv); cell->soc = 0.95f * soc_ah + 0.05f * soc_ocv; } else { cell->soc = soc_ah; } }6.3 多组电池的扩展方案
如果系统需要管理多组两串电池,比如一个机柜里有8组,STM32的I2C总线可以挂多片MP2642。每片MP2642的地址可以通过ADDR引脚配置,支持最多4个不同地址。如果超过4组,可以用I2C多路复用器扩展。
软件上,每组电池维护一个独立的状态机和配置结构体,主循环轮询各组的状态。F745VG的RAM有320KB,跑8组电池的状态机绰绰有余。
6.4 数据记录与远程监控
STM32F745VG带SDMMC接口,可以接一张SD卡做数据记录。我每10秒记录一次两颗电芯的电压、电流、温度、SOC、均衡状态,存成CSV格式。一天的数据量大约8MB,一张8GB的卡能存好几年。
远程监控方面,通过CAN总线把数据发给上位机,或者加一颗4G模块做云端上传。不过4G模块的功耗和成本要考虑,如果只是本地监控,CAN就够了。
7. 一些个人体会与建议
这套方案我从选型到量产跑了大概四个月,中间改了两版PCB,烧过三颗MP2642(都是布局问题),最后稳定下来的版本已经在小批量出货了。回头来看,有几个点值得刚入行的朋友注意。
第一,均衡电流不是越大越好。我一开始追求2A均衡,结果电感体积大、发热严重、PCB面积也大。后来降到1.5A,均衡时间只多了几分钟,但整体方案紧凑了很多。均衡电流要根据电芯容量和可接受的均衡时间来定,一般0.5C到1C之间比较合适。
第二,电压采样的精度比均衡电流更重要。均衡策略全靠电压差来判断,如果采样不准,均衡就是瞎均衡。我在采样电路上花的调试时间比均衡电路还多,但值得。±5mV的采样精度让均衡终止判断很干脆,不会来回振荡。
第三,热设计要留余量。实验室25°C跑得好好的,到了现场40°C环境温度,芯片温度直接飙到90°C。后来加了散热铜皮和导热垫,才把温度压到75°C以下。如果你的应用环境温度可能超过35°C,散热设计一定要提前考虑。
第四,软件状态机要健壮。现场什么情况都可能发生,电芯接触不良、通信线松动、温度传感器脱落。状态机里每个状态都要有超时保护和异常恢复机制,不能卡死在一个状态里出不来。
最后分享一个小技巧:MP2642的STATUS寄存器里有个均衡完成标志位,均衡结束时芯片会置位。我一开始没注意这个位,靠软件轮询电压差来判断均衡结束,结果因为采样噪声偶尔会误判。后来改成读STATUS的标志位,准确多了。这个位在数据手册的第12页,很容易漏掉,但用起来真香。