1. 储能电池均衡的底层逻辑与方案选型
两串电池的均衡,听起来简单,做起来坑不少。我接触过不少做便携储能、小型UPS、太阳能路灯的朋友,大家一开始都觉得“两节电池嘛,随便搞搞就行了”,结果批量出货之后返修率居高不下,拆开一看十有八九是两节电池电压拉开了,一节3.2V一节2.8V,保护板直接锁死。这个项目的核心,就是用MP2642GR-Z这颗双向升降压充电管理芯片,配合STM32F405ZG这颗带浮点运算的Cortex-M4主控,做一套主动均衡方案,把两节串联电池的电压差控制在合理范围内。
先说清楚这个方案解决什么问题。两节电池串联,容量、内阻、自放电率不可能完全一致,充放电循环几百次之后,电压差会越来越大。被动均衡就是给电压高的那节并一个电阻放电,能量全变成热浪费掉了,均衡电流通常只有几十毫安,对于大容量电池来说杯水车薪。主动均衡则是把高电压那节的能量搬到低电压那节去,效率高、发热小、均衡电流可以做到安培级别。MP2642GR-Z本身就是一颗双向工作的升降压控制器,天生适合干这个活——它可以在Buck和Boost模式之间切换,把能量从一端搬到另一端。
为什么选STM32F405ZG而不是更便宜的F103或者G0系列?这里有个实际考量。均衡算法需要实时采样两节电池的电压、电流、温度,还要做PID调节控制PWM占空比,F405的168MHz主频和硬件浮点单元让这些运算绰绰有余。而且F405的ADC是12位、最高2.4Msps,配合DMA可以做到无CPU干预的连续采样,这对电压采样的实时性很关键。你要是用F103,光做浮点运算就够呛,更别说还要跑保护逻辑和通信协议了。
整个系统的架构是这样的:两节电池串联,总电压范围6.0V到8.4V(以磷酸铁锂为例),中间抽头引出。MP2642GR-Z的两个输出端分别接在两节电池的正负极上,通过电感储能,在STM32的控制下,把电压高的那节能量转移到电压低的那节。STM32负责采样、计算、输出PWM、故障保护、以及通过CAN或UART上报状态。
注意:MP2642GR-Z的datasheet里标注的工作电压范围要仔细核对,不同后缀版本参数有差异,选型时务必确认GR-Z这个尾缀对应的具体规格。
方案选型上还有一个岔路口:是用专用均衡芯片还是用分立方案?专用均衡芯片比如某些品牌的被动均衡AFE,集成度高但均衡电流小;分立方案灵活但外围复杂。MP2642GR-Z属于介于两者之间的选择——它是一颗控制器,需要外接MOSFET和电感,但控制逻辑集成在芯片内部,STM32只需要给使能和模式信号,或者通过反馈引脚做闭环调节。这种方案的好处是均衡电流可以自己设计,想做大就选低导通电阻的MOSFET和大电流电感,想省成本就用小一号的,灵活性很高。
2. MP2642GR-Z与STM32F405ZG的硬件设计要点
2.1 芯片关键参数与外围元件计算
MP2642GR-Z是一颗同步双向升降压控制器,支持Buck和Boost两种工作模式,开关频率可以通过外部电阻编程,典型范围200kHz到2MHz。输入电压范围覆盖2.7V到36V,正好覆盖两串电池的电压区间。芯片内部集成了两个栅极驱动器,可以驱动外部的N沟道MOSFET。这里有个细节要注意:它的两个驱动输出是互补的,死区时间内部固定,所以外部MOSFET选型时要关注栅极电荷和导通电阻的平衡。
电感的选择是整个设计里最关键的环节之一。假设我们设定均衡电流为2A,开关频率500kHz,电池电压范围6V到8.4V。在Buck模式下,电感纹波电流通常取输出电流的30%左右,也就是0.6A。电感值计算公式是:
L = (Vout × (1 - D)) / (fsw × ΔIL)
其中D是占空比,在Buck模式下D = Vout / Vin。最恶劣情况是Vin最高8.4V、Vout最低3.0V,此时D = 0.357,代入计算:
L = (3.0 × (1 - 0.357)) / (500000 × 0.6) = 6.43μH
实际选型取标准值6.8μH,饱和电流要大于峰值电流,峰值电流 = 输出电流 + ΔIL/2 = 2 + 0.3 = 2.3A,留一倍余量选5A以上的电感。电感类型建议选一体成型屏蔽电感,直流电阻要小,否则2A电流下的铜损会很可观。
MOSFET选型方面,因为电池电压低,30V耐压的N沟道MOSFET就够用。关键参数是导通电阻Rds(on)和栅极电荷Qg。Rds(on)越小导通损耗越低,但Qg大的话开关损耗会增加。在500kHz频率下,开关损耗往往占主导。我一般选Rds(on)在10mΩ左右、Qg在10nC以内的型号,比如某些PDFN5x6封装的30V MOSFET,平衡得比较好。
采样电路的设计直接决定均衡精度。两节电池的电压采样不能用简单的电阻分压,因为分压电阻本身会消耗电池电量,而且两节电池的采样回路会互相影响。推荐用差分放大器做高边采样,或者用专用的电池采样AFE。STM32F405ZG的ADC参考电压要用高精度基准,比如2.5V或3.0V的基准芯片,温漂要小于20ppm/°C。采样电阻用0.5%精度的薄膜电阻,分压比要计算好,确保最大电压时ADC输入不超过参考电压。
2.2 STM32F405ZG的资源分配与引脚规划
STM32F405ZG是LQFP144封装,引脚资源很丰富,但规划不好也会打架。这个项目里我用到的外设包括:ADC1和ADC2做双通道同步采样,TIM1输出互补PWM驱动MP2642GR-Z的使能和模式切换,USART2做调试串口,CAN1做系统通信,还有几个GPIO做状态指示和故障输入。
ADC的通道分配要特别注意。两节电池的电压采样分别接在ADC1_IN0和ADC1_IN1上,电流采样接ADC1_IN2,温度采样接ADC1_IN3。用DMA循环模式,采样时间设为480个ADC周期,这样在168MHz主频、ADC时钟84MHz下,单次转换时间约5.7μs,四通道扫描一轮不到25μs,完全满足实时性要求。这里有个坑:STM32F405的ADC在采样时间很短的时候输入阻抗要求比较低,如果分压电阻太大,采样电容充不满,读数会偏低。解决办法是在ADC输入脚加一个小电容(1nF到10nF)做电荷缓冲,同时分压电阻不要超过10kΩ。
PWM输出用TIM1的CH1和CH2,配置成互补输出模式,但实际MP2642GR-Z只需要一个PWM信号控制占空比,另一个引脚用来切换Buck/Boost模式。死区时间设成100ns左右,防止直通。TIM1的时钟源用APB2的168MHz,预分频设为0,自动重装载值设为839,这样PWM频率就是168MHz / (839+1) = 200kHz。为什么用200kHz而不是500kHz?因为200kHz下开关损耗更低,虽然电感要选大一点,但整体效率更高,发热更小。
CAN通信的波特率设成500kbps,终端电阻用两个120Ω分别接在总线两端。USART2设成115200波特率,8数据位、1停止位、无校验,用来打印调试信息和接收上位机指令。
2.3 电源树与保护电路设计
整个系统的供电来自两节串联电池,但STM32和MP2642GR-Z都需要稳定的3.3V或5V供电。这里不能用简单的线性稳压器直接从8.4V降到3.3V,因为压差太大,线性稳压器的效率只有40%左右,发热严重。推荐用一颗同步降压转换器,比如输入8.4V输出3.3V、电流500mA的方案,效率可以做到90%以上。
保护电路分三层。第一层是电池本身的保护板,过充、过放、过流、短路保护,这是最后一道防线。第二层是MP2642GR-Z芯片自带的保护功能,包括输入欠压锁定、输出过压保护、逐周期电流限制、过热关断。第三层是STM32的软件保护,通过ADC实时监测电压电流温度,一旦超出阈值就立即关闭PWM输出,并通过CAN上报故障码。
实操心得:软件保护的响应速度取决于ADC采样率和任务调度周期。我一般把保护逻辑放在ADC中断里,采样完成立即判断,响应时间可以做到100μs以内。如果放在主循环里轮询,响应时间可能要到毫秒级,对于短路保护来说太慢了。
还有一个容易被忽略的点:两节电池的中间抽头到MP2642GR-Z的走线要尽量短且等长,否则线路阻抗不一致会导致两节电池的均衡电流不对称。PCB布局时,功率回路面积要最小化,电感和MOSFET尽量靠近芯片,采样线的走线要远离功率线,避免开关噪声耦合进ADC。
3. 均衡控制算法的实现与调参
3.1 电压采样与滤波处理
均衡算法的第一步是准确获取两节电池的电压。STM32F405的ADC是12位的,参考电压3.3V时分辨率是0.8mV。但实际有效位数受噪声影响,可能只有10位左右,也就是3.3mV的分辨率。对于磷酸铁锂来说,3.3mV的电压差已经可以接受,但对于三元锂来说,这个精度还不够,因为三元锂的电压平台更陡,同样的电压差对应的SOC差异更大。
提高采样精度的方法有几个。硬件上,ADC参考电压用外部基准芯片,比如2.5V基准,温漂20ppm。软件上,用过采样技术,连续采样16次求平均,可以把有效分辨率提高到14位左右。具体做法是配置ADC在DMA模式下连续转换,缓冲区设16个元素,转换完成后在中断里做累加平均。这样单次有效采样时间约400μs,对于电池电压这种缓变量来说完全够用。
滤波算法我用的是滑动平均加一阶低通。滑动平均窗口取8个点,滤掉高频噪声;一阶低通的截止频率设成10Hz,进一步平滑。截止频率的计算公式是:
fc = 1 / (2πRC)
在数字域里,一阶低通的差分方程是:
y[n] = α × x[n] + (1-α) × y[n-1]
其中α = 2π × fc × Ts,Ts是采样周期。如果采样周期是1ms,fc=10Hz,那么α = 0.0628。这个系数下,电压变化响应时间大约几十毫秒,对于均衡来说足够快。
3.2 均衡策略与PID调节
均衡策略的核心逻辑是:当两节电池电压差超过阈值时,启动均衡;电压差小于回差时,停止均衡。阈值和回差的设计要考虑电池特性和实际需求。对于磷酸铁锂,电压平台很平,3.2V到3.3V之间可能对应50%的SOC变化,所以阈值不能设太小,否则会频繁启停。我一般设启动阈值30mV,停止阈值10mV,这样既有足够的均衡效果,又不会频繁切换。
均衡电流的大小通过PID调节PWM占空比来控制。目标是把电压高的那节电池的电压降下来,或者把电压低的那节升上去。具体来说,如果第一节电压高于第二节,就让MP2642GR-Z工作在Buck模式,从第一节取电,经过电感储能,再释放到第二节。PID的输入是电压差,输出是PWM占空比。
PID参数整定是个经验活。比例系数Kp决定响应速度,太大会振荡,太小响应慢。积分系数Ki消除稳态误差,但太大会超调。微分系数Kd抑制振荡,但对噪声敏感。我的经验值是:Kp从0.5开始试,Ki从0.01开始,Kd先不加。观察电压差的收敛曲线,如果振荡就减小Kp,如果收敛太慢就增大Ki。最终整定好的参数大概在Kp=0.8、Ki=0.05、Kd=0.02左右,具体还要看电池容量和均衡电流大小。
注意:PID输出要限幅,占空比最小0%、最大95%,防止MOSFET直通。同时要加积分抗饱和,当输出达到限幅值时停止积分累加,否则退出限幅时会有很大的超调。
3.3 状态机与故障保护逻辑
整个均衡过程用一个状态机来管理,状态包括:空闲、采样、均衡、故障、休眠。上电后先进入采样状态,读取两节电池电压和温度,判断是否满足均衡条件。如果电压差超过阈值且温度在允许范围内,进入均衡状态,启动PWM输出。均衡过程中持续监测电压差,当电压差小于停止阈值时回到空闲状态。如果检测到过温、过流、电压异常,立即跳转到故障状态,关闭PWM,点亮故障指示灯,并通过CAN上报故障码。
故障保护的具体阈值:单节电池过压4.25V(三元锂)或3.65V(磷酸铁锂),欠压2.5V或2.0V,温度超过60°C降额,超过80°C关断,均衡电流超过3A关断。这些阈值要根据实际电池规格调整,不能照搬。
状态机的实现用switch-case结构,每个状态里做相应处理,然后根据条件跳转。为了保证实时性,状态机放在主循环里跑,但故障检测放在ADC中断里,一旦触发立即置标志位,主循环检测到标志位后跳转故障状态。这样兼顾了实时性和代码可读性。
4. 实测数据与常见问题排查
4.1 均衡效果实测与效率分析
我用两节标称3.2V/5Ah的磷酸铁锂电池做了测试。初始状态一节3.35V、一节3.15V,电压差200mV。启动均衡后,均衡电流设定2A,实测电压差在15分钟内从200mV降到20mV以内,30分钟后降到5mV以内。均衡过程中的能量转移效率实测约88%,主要损耗在MOSFET导通损耗、电感铜损和开关损耗上。
效率的估算可以这样算:假设均衡电流2A,MOSFET导通电阻10mΩ,两个MOSFET的导通损耗是2² × 0.01 × 2 = 0.08W。电感直流电阻20mΩ,铜损是2² × 0.02 = 0.08W。开关损耗跟频率和Qg有关,估算约0.1W。总损耗约0.26W,转移功率约6W,效率约95%。实测88%偏低,主要是因为电感磁芯损耗和PCB走线阻抗。后来换了更低直流电阻的电感和更粗的走线,效率提升到92%。
温升方面,2A均衡电流下,MOSFET表面温度约45°C,电感表面温度约50°C,环境温度25°C。如果均衡电流加到3A,MOSFET温度会到60°C以上,需要加散热片或者降低环境温度。所以均衡电流不是越大越好,要综合考虑散热和效率。
4.2 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 均衡不启动 | 电压差未超阈值 | 用万用表实测两节电压 | 调整阈值或检查采样电路 |
| 均衡电流偏小 | PWM占空比受限 | 示波器看PWM波形 | 检查PID输出限幅和MOSFET驱动 |
| 电压采样跳动大 | ADC噪声耦合 | 示波器看ADC输入脚 | 加RC滤波,远离功率线 |
| MOSFET发热严重 | 导通电阻大或开关损耗高 | 测MOSFET漏源波形 | 换低Rds(on)型号或降低频率 |
| 均衡方向反了 | 电压采样通道接反 | 核对ADC通道映射 | 交换采样通道或修改代码 |
| CAN通信失败 | 终端电阻缺失或波特率不匹配 | 示波器看CAN差分波形 | 加120Ω终端电阻,核对波特率 |
| 上电烧保险 | 输入反接或短路 | 检查电池极性和PCB短路 | 加防反接电路,检查焊接 |
4.3 独家避坑经验分享
第一个坑是ADC采样时序。STM32F405的ADC在连续扫描模式下,如果采样时间设置太短,前一个通道的残留电荷会影响后一个通道的读数。我一开始把采样时间设成15个周期,结果两节电池电压读数互相串扰,第一节的读数受第二节影响。后来把采样时间加到480个周期,并在两个通道之间插入一个空转换周期,问题解决。
第二个坑是MP2642GR-Z的模式切换。这颗芯片在Buck和Boost模式之间切换时,如果切换瞬间PWM占空比不合适,电感电流会突变,导致输出电压过冲。解决办法是在模式切换前先把PWM占空比降到安全值,切换后再慢慢升上去。STM32里用一个状态机控制这个过程,切换时间约10ms,平滑过渡。
第三个坑是PCB布局。第一版PCB我把电感和MOSFET放在板子边缘,采样线从旁边经过,结果均衡启动后ADC读数跳变超过50mV。后来重新布局,功率回路集中在板子一侧,采样线走另一侧,中间用地线隔离,跳变降到5mV以内。这个教训说明,模拟采样和功率开关在PCB上必须分区,地平面要完整,不能有割裂。
第四个坑是温度保护。我一开始只监测了MOSFET的温度,忽略了电池温度。结果冬天户外测试时,电池温度零下,均衡电流还是2A,导致电池析锂。后来加了电池温度采样,低于0°C时禁止充电均衡,低于-10°C时禁止放电均衡。这个逻辑对储能系统特别重要,因为储能电池经常在户外环境工作。
第五个坑是CAN通信的接地。两个节点之间如果地电位不一致,CAN通信会间歇性失败。解决办法是用隔离CAN收发器,或者确保两个节点共地。我在实际项目里用的是隔离方案,虽然成本高一点,但稳定性好很多。
5. 系统扩展与不同电池类型的适配
5.1 从两串扩展到多串的思路
两串均衡做通了,扩展到多串就是复制粘贴加总线通信的事。每一串用一个MP2642GR-Z加一个STM32F405ZG做本地均衡,多个节点通过CAN总线互联。主节点负责汇总所有电池电压,做全局均衡决策,从节点执行本地均衡。这样架构清晰,扩展性好,想加几串就加几串。
不过多串系统有个新问题:均衡路径变长了。两串的时候能量直接从高电压节搬到低电压节,路径短、效率高。多串的时候,如果第一节电压高、第四节电压低,能量要经过中间几节传递,每经过一级就有损耗。这时候可以考虑用飞渡电容或者变压器方案做跨节均衡,但复杂度会高很多。对于大多数储能应用来说,相邻节均衡已经够用,因为电池不一致性通常是渐变的,相邻节电压差最大。
5.2 磷酸铁锂、三元锂、钛酸锂的参数差异
不同电池类型的均衡策略要区别对待。磷酸铁锂电压平台平,3.2V到3.3V对应大部分容量,所以电压差阈值可以设小一点,20mV就够了,但均衡电流不用太大,因为电压差本身不会拉得很大。三元锂电压平台陡,3.7V到4.2V对应80%容量,电压差阈值可以设大一点,50mV,均衡电流要大一些,因为电压差容易拉大。钛酸锂电压平台在2.4V左右,电压范围窄,均衡阈值设15mV,均衡电流适中。
温度补偿也要考虑。磷酸铁锂在低温下内阻增大,电压采样会有偏差,需要根据温度做补偿。三元锂在高温下自放电率增加,均衡频率要降低。这些细节在代码里用查表法实现,根据温度查对应的补偿系数。
5.3 与BMS系统的集成方式
这个均衡模块最终要集成到BMS里。集成方式有两种:一种是作为独立模块,通过CAN上报电压、温度、均衡状态,BMS主控做决策;另一种是把均衡算法集成到BMS主控里,MP2642GR-Z只做功率级。两种方式各有优劣。独立模块的好处是分担主控负担,坏处是增加成本。集成方案的好处是成本低,坏处是主控要处理的事情太多,实时性可能受影响。
我倾向于独立模块方案,因为STM32F405ZG的性能足够跑均衡算法,而且独立模块可以单独测试、单独更换,维护方便。与BMS主控的通信协议用CAN 2.0B,扩展帧格式,波特率500kbps。报文里包含两节电池电压、均衡电流、温度、状态字、故障码。BMS主控根据这些信息做整体能量管理。
实操心得:CAN报文的发送周期要合理设置。太快了占用总线带宽,太慢了状态更新不及时。我一般设100ms发一次状态报文,故障报文立即发送。这样总线负载率在10%以下,留足余量给其他节点。
6. 写在最后的实操体会
这个项目前后调试了大概三个月,从原理图设计到PCB打样到代码调试,踩的坑比预想的多。最大的体会是:电池均衡看起来是硬件活,实际上是软件活。硬件决定均衡电流的上限,软件决定均衡效果的好坏。同样的硬件,PID参数调得好,电压差可以收敛到5mV以内;调得不好,电压差在20mV左右振荡,永远下不去。
另一个体会是采样精度决定均衡精度。你不可能均衡到比采样精度更小的电压差。所以与其花时间优化算法,不如先把采样电路做好。高精度基准、低温度系数电阻、合理的RC滤波、良好的PCB布局,这些基础工作做到位,算法就是水到渠成的事。
最后说一个容易被忽略的点:均衡的终止条件。很多方案只看电压差,电压差小于阈值就停。但实际上电池在静置和充放电状态下的电压差是不一样的。充放电时电压差大,静置时电压差小。如果只在静置时均衡,效果最好,但均衡时间会很长。我的做法是充放电时用大电流均衡,静置时用小电流均衡,这样兼顾效果和速度。具体电流值根据电池容量和温升来定,一般充放电时2A,静置时0.5A。
这个方案目前已经在几个小批量项目里跑了一年多,返修率很低,均衡效果稳定。如果你也在做类似的两串储能或备用电源项目,这套MP2642GR-Z加STM32F405ZG的组合值得一试。硬件成本不高,软件灵活性大,关键是均衡电流可以自己设计,不像专用芯片那样受限制。