基于MP2642GR-Z与STM32F405ZG的两串电池主动均衡方案设计与实现 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 / (8391) 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 × TsTs是采样周期。如果采样周期是1msfc10Hz那么α 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。最终整定好的参数大概在Kp0.8、Ki0.05、Kd0.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导通损耗、电感铜损和开关损耗上。效率的估算可以这样算假设均衡电流2AMOSFET导通电阻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。如果均衡电流加到3AMOSFET温度会到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的组合值得一试。硬件成本不高软件灵活性大关键是均衡电流可以自己设计不像专用芯片那样受限制。