
简介针对STM32F103与BQ76930的电池管理系统BMS设计资料包面向电池管理相关开发者和嵌入式学习人群也适合硬件工程师、研究生作为项目参考。内容覆盖产品说明、通信协议、电路原理图、固件程序、上位机交互软件及芯片手册能够帮助读者从硬件电路到软件交互完整理解BMS的构建流程。压缩包共304个文件约97.67MB核心文件包括37个C源码、42个头文件、42个汇编/目标文件以及PDF芯片资料、SCHDOC原理图、HEX固件和可执行上位机程序另有工程配置文件与文档便于直接调试已有1119人学习/下载。学习过程中可掌握STM32F103与BQ76930之间的SPI/I2C通信方法理解电池均衡、保护与监控逻辑原理图展示关键电路连接方式源码中包括BQ76930初始化、数据读取与故障处理流程上位机软件通过串行通信实时展示充放电状态、剩余容量与电池健康度。借助这些资料可继续二次开发并优化系统是自学和项目落地的实用参考。 做电池管理系统这几年手头积攒的工程资料里这套“BMSBQ76930STM32F103电池管理资料”属于我复盘次数最多的一类。理由很简单它没有用集成电量计IC一步到位而是用“模拟前端AFE MCU”的组合把整个BMS链路完整拆开了从电芯采样、均衡控制、保护逻辑到CAN上报每一环都能在代码和原理图里找到对应位置。如果你是准备入门BMS开发或者正在做储能、电动工具、轻型车的电池保护板选型这套资料是一个很好的学习主线。资料本身覆盖了硬件原理、寄存器配置、STM32F103标准库工程和通信协议栈网上能搜到的相关热词也很集中BQ76930、bq769x0寄存器、STM32F103最小系统、freemodbus移植、BMS三级架构BMU/BCU/BAU。下面我把这套方案从选型逻辑、硬件设计、软件配置到实际调试踩坑完整过一遍。1. 方案定位为什么是“BQ76930 STM32F103”这套组合1.1 BQ76930在BMS里到底管什么BQ76930是TI BQ769x0家族里的中端型号支持6到10节串联电芯的电压采集、温度采集、充放电电流采集内部还集成了充电/放电FET驱动、均衡MOS驱动以及一组完整的模拟比较器保护电路。很多人第一次看数据手册会以为它只是“高级ADC”实际上它是一个模拟前端AFE加保护前端所有电芯电压、内部温度和电流检测通道都直接引到芯片内部MCU通过I2C读取寄存器就能拿到全部数据。这里需要强调一个关键点BQ76930不跑应用逻辑它不做SOC估算也不管通信协议。它的职责是把电芯的物理量变成数字量同时在硬件层面执行过压、欠压、过流、短路的快速保护。真正的“大脑”是外接的MCU。这也是这套资料最值得学习的地方——AFE和MCU的职责边界非常清晰。对比一下BQ76920和BQ76940会更明白产品线思路BQ76920支持3到5节BQ76930支持6到10节BQ76940支持9到15节。三者寄存器映射基本一致代码可以平移。选型时先数清楚电芯串联数量再决定用哪颗千万别在6S上用BQ76920硬凑后面采样通道不够会很痛苦。1.2 为什么主控选STM32F103而不是更简单的8位机资料里选STM32F103作为主控我认为是三层考量。第一层是资源够用。F103系列主频72MHzFlash从64KB到512KB可选内置多路ADC、定时器、CAN控制器、USART、I2C、SPIBMS的活它全都能接住。做均衡策略、滤波算法、SOC估算甚至跑一个轻量级RTOS都留有余量。第二层是生态成熟。STM32F103被国内工程师摸得透透的标准库V3.5版本的例程满天飞最小系统原理图、启动文件startup_stm32f10x_hd.s、MAP文件分析法、串口下载流程网上一搜一大把。对刚接触BMS的人来说用F103降低的是“工具链”的入门门槛而不是“BMS逻辑”的复杂度。第三层是通信接口齐全。BMS系统最终要和上位机、充电机、整车控制器或储能变流器交互F103自带CAN控制器和多个USARTCAN协议栈和Modbus RTU都能跑。比如热词里提到的freemodbus v1.6移植到STM32F103标准库实现Modbus RTU配合RS232/RS485收发器就能把电池数据以标准工业协议上报这在备电、储能场景里特别实用。从层级架构上看BQ76930承担的是BMU电池管理单元层面的采集与保护执行STM32F103承担的是BCU电池控制单元层面的策略计算和通信上位机或系统调度端则是BAU电池管理主控层面。这套板子相当于在一个小板子上同时实现了BMU和BCU功能结构上非常典型。2. 硬件设计细节电芯到MCU之间每个环节都不能省2.1 BQ76930外围电路的关键节点BQ76930外围电路看起来简单实际有几个节点决定了一块板子能不能稳定工作。电源输入要先说。芯片供电由BAT引脚从电池组总压取电经过内部LDO输出REGIN、REGOUT等电压轨。资料里的原理图一般会在BAT引脚前加RC滤波和TVS管防止电芯反接或浪涌打坏芯片。REGIN引脚通常要接一个1uF到10uF的陶瓷电容位置尽量靠近芯片这个电容选太小会导致内部LDO不稳定MCU读寄存器时出现随机错误。电芯采样输入VC0到VC10是另一个重点。每两个VC引脚之间接一个RC低通滤波器典型值100Ω加0.1uF能抑制电芯连接线上的高频噪声。这组滤波器的截止频率不能太低否则会影响ADC采样速度和动态响应但也不能省我实测过直接短接RC的板子在电机负载下采样值跳变能达到几十毫伏保护阈值稍近一点就会误动作。均衡电路也要提前规划。BQ76930内部集成了均衡MOS开关外部只需要在每个电芯正负极之间放置均衡电阻。均衡电阻的阻值决定均衡电流常见选型是33Ω到100Ω电流大约30mA到100mA。注意功耗100Ω电阻在4V电芯上耗散约0.16W要选1206或2512封装PCB铺铜要留散热空间。还有一个容易被忽略的引脚是ALERT。BQ76930检测到保护事件后会拉低ALERTMCU可以把这个引脚接到外部中断输入实现快速响应保护状态变化而不是靠轮询I2C寄存器。资料里的原理图大部分都留了这个信号。2.2 STM32F103最小系统与通信接口设计STM32F103最小系统没什么玄学8MHz晶振加两个20pF负载电容复位电路加一个10k上拉和100nF电容BOOT0和BOOT1跳线按烧录方式配置VDDA引脚串联磁珠或小电阻后接模拟电源VREF接基准电压。VREF这路要特别注意BMS对电压精度要求高VREF如果直接用开关电源供电ADC基准会跟着纹波抖最好用单独的LDO或高精度基准源。通信接口方面BQ76930和STM32之间用I2C连接。BQ76930的I2C是开漏输出SDA和SCL必须外接上拉电阻典型值4.7kΩ。有些新手直接复用STM32内部上拉结果发现通信时好时坏就是这个原因。另外BQ76930 I2C地址由芯片的4位地址引脚决定资料里通常配置为0x108位写地址具体要看硬件原理图上的接线。对外通信接口一般预留CAN和RS485两路。CAN收发器用TJA1050或ISO1050终端电阻120Ω不能省否则总线通信会丢帧。软件配置CAN波特率时上面的热词提到SJW同步跳跃宽度这个东西在波特率误差大的时候很关键SJW设为1Tq到4Tq我一般直接配1Tq配合正确的分频和采样点500kbps下跑一整天没问题。RS485则用SP3485或MAX3485方向控制引脚接MCU的一个GPIO注意收发切换时序发完最后一个字节要等发送完成标志再拉低方向脚否则最后一个字会被截断。2.3 供电、采样与保护电路的三个常见坑第一坑是给MCU供电的DCDC布局离采样线太近。F103工作电流本身不大但DCDC的开关节点会产生高频噪声如果走线平行于电芯采样线ADC采集到的电压会被污染。解决办法是采样线走差分对包地避开DCDC电感下方实在绕不开就在VC引脚RC滤波电容上并联一个1nF高频电容。第二坑是分流器信号的地处理。电流采样通过差分放大器或直接用BQ76930的SRP/SRN引脚接分流器两端这是低边采样方案。分流器两端走线必须等长等宽信号地从采样电阻根部单独引回AFE不能和功率地混在一起否则大电流时PCB铜箔压降会被当成电流信号读进去造成过流误判。第三坑是充电和放电MOS的驱动电路。BQ76930的CHG和DSG引脚输出电平有限一般要通过三极管或专用栅极驱动芯片去推功率MOS。资料里常看到用两三个三极管搭的推挽电路这里注意MOS栅极要串10Ω到22Ω电阻限制栅极充电电流栅源之间要并一个10k到100k电阻保证关机时栅极有确定电平。只靠CHG引脚直接推MOS的做法在实验室能工作一到高压大电流场景就等着炸管。3. 软件实现寄存器配置到协议上报的全链路3.1 AFE初始化先把BQ76930配置到已知状态上电后MCU第一件事不是读电压而是把BQ76930复位并配置寄存器。BQ76930有完整的寄存器组包括设备控制、保护配置、ADC配置、均衡控制、CC电流校准等。初始化流程一般分四步。第一步通过I2C发送软复位命令REG0寄存器中SYS_CTRL位置位让芯片回到默认状态。第二步配置保护阈值比如过压保护阈值设为3.65V、欠压保护阈值设为2.80V、放电过流保护阈值按电池规格算好写入对应的保护寄存器。第三步配置ADC采样模式和转换周期BQ76930支持连续采样和按需采样BMS通常开启连续采样保证数据实时性。第四步使能需要的保护功能和均衡功能最后读取状态寄存器确认没有告警。这个顺序本身就是一个很好的调试思路先复位确认通信、再配保护、再开采集、最后使能执行。很多人一上来就开ADC和FET结果保护乱跳却分不清是寄存器没写对还是硬件有问题。3.2 电压、电流、温度采集的软件处理BQ76930的电芯电压寄存器是16位读出来需要根据量程换算。比如内部ADC参考电压典型情况下满量程对应电压具体换算公式在数据手册里有资料里的驱动代码一般已经封装好。读取时要注意一次I2C突发读写最多能读一定长度的寄存器如果一次读10个电芯电压得先确认BQ76930支持的突发长度上限否则最后几个字节读不到。电流读数的处理更讲究。BQ76930通过库伦计数器CCCoulomb Counter累积分流器上的电荷需要先配置分流器电阻值和CC增益。用500μΩ的分流器测50A电流信号只有25mV放大增益要选高挡位同时噪声也会被放大。实际项目里我会在代码里做一阶低通滤波时间常数取200ms左右能过滤掉MOS开关造成的电流尖峰。温度采集方面BQ76930的TS引脚支持外部NTC热敏电阻内部有上拉电流源。NTC的B值、R25阻值决定分压曲线得在代码里做查表或公式转换。注意TS引脚采样的是电压而不是直接电阻值做保护判断时要用换算后的温度再比较别直接拿ADC原始值当温度。3.3 SOC估算与均衡策略BMS的灵魂SOC剩余电量估算是资料里比较出彩的部分。常见做法是OCV查表加库伦积分融合系统上电静置一段时间后根据开路电压查SOC初始值运行过程中用电流对时间积分累加或累减。这个方案的问题在于电流传感器误差会随时间累积所以需要定期用OCV校正。均衡策略则依赖BQ76930的cell balancing功能。最简单的实现是“充满均衡”充电末期检测到某个电芯电压最高打开该电芯对应的均衡MOS通过外部电阻放电让所有电芯的电压趋于一致。进阶一点的方案是“SOC均衡”先估算各电芯SOC然后对SOC偏高的电芯执行放电均衡。这里有个容易搞反的点均衡不是把高电压电芯的能量回馈给低电压电芯而是把高电压电芯的能量通过电阻白白耗散掉。所以均衡电阻的功率和PCB散热必须够否则均衡时间一长板子就烫手。资料里如果给出了均衡电流实测值拿到自己板上要重新算一遍因为电芯内阻、线缆阻抗都会影响实际均衡电流。3.4 CAN与Modbus RTU上报把数据交出去STM32F103这边的软件架构资料里通常采用“定时采集 状态机 通信任务”的结构。主循环里定时触发ADC读取函数更新全局结构体CAN发送任务把电芯最高/最低电压、总压、电流、SOC、告警标志打包成报文周期发送。CAN部分建议提前想好报文ID和数据布局。比如ID 0x1801E0F4发总压、电流、SOCID 0x1802E0F4发电芯电压分组ID 0x1803E0F4发温度和保护状态。这样上位机解析方便也方便以后接入标准协议。关于SJW和波特率F103的CAN外设需要配置分频、BS1、BS2、SJW实测500kbps下典型配置是PCLK136MHz分频4BS19TqBS28TqSJW1Tq采样点约在87.5%整车环境下的容错性不错。Modbus RTU部分可以基于freemodbus v1.6移植到标准库寄存器映射里把电压、电流、温度、SOC、保护状态全部映射成保持寄存器用03功能码读用06功能码写均衡开关和放电允许标志。热词里反复提到freemodbus确实是因为它是开源且稳定性经过验证的比从零手写一帧CRC16解析省力太多。移植时注意freemodbus的定时器依赖需要配置一个1ms的tick给协议栈做收发状态机切换。4. 调试排障实录拿这套方案会遇到的高频问题4.1 I2C通信时好时坏读寄存器偶尔返回0xFF这个问题十有八九是上拉电阻和时序的锅。BQ76930的I2C速率上限较低STM32硬件I2C跑太快容易出现时钟拉伸不匹配建议把I2C时钟降到100kHz以下或者干脆用GPIO模拟I2C。模拟I2C虽然占用CPU但时序完全可控出问题好排查。还有一个隐蔽原因BQ76930的供电电压不稳定。芯片内部LDO需要输入电压高于某个阈值如果电池组电压在欠压边缘抖动芯片会间歇性复位I2C自然读不到。可以看电源指示灯或状态寄存器确认芯片是否活着再查通信。4.2 电芯电压采样偏差同一节电芯不同板子误差超过10mV先排查接触电阻。电芯采样线从电芯极柱到VC引脚中间每经过一个接插件、一个焊点都会引入毫欧级电阻在采样电流极小的条件下电压降不大但如果采样线与均衡线共用均衡电流流过采样线就会造成明显压降。所以采样线必须单独从电芯极柱引出不能和均衡路径共用一段铜箔。再检查VC引脚的RC参数。RC滤波的截止频率如果是按普通噪声设计的遇到强烈干扰源比如电机启动时采样结果会偏大。对策是把截止频率压低到几百赫兹同时在软件上对连续采样值做中值滤波去掉最大最小值后再平均能显著提高稳定性。4.3 过流保护触发后MOS不恢复也无法充电保护后的恢复机制是BQ76930最容易踩坑的地方。芯片的保护恢复分为“电平模式”和“周期模式”前者要求故障消失后某个引脚电平切换后者是芯片周期性检测故障条件是否消失。如果代码里只配置了保护阈值没配置恢复模式那么放电过流保护锁存后即使负载断开FET状态也回不来。解决方案是把恢复模式配成周期检测故障消失后经过恢复时间自动恢复FET。如果项目要求严格必须由主控决定恢复时机则可以把FET控制权完全交给MCU用GPIO直接控制放电允许引脚BQ76930只做硬件快速保护。这个思路特别实用正常工作时MCU控制MOS异常时AFE硬件强断两条路径互为备份。4.4 均衡电阻过热甚至把PCB烤黄均衡电阻过热不是电阻选小了就是散热没做好。拿100Ω电阻做0.15W发热连续均衡几个小时也会在局部积热。建议把均衡电流限制在30mA到50mA对应阻值80Ω到130Ω同时采用均衡轮询策略开启一个电芯均衡一段时间后切换到另一个避免单点持续发热。再配合NTC检测板温板温超过60℃就暂停均衡这是一个很实用的保护逻辑。最后分享一个我常用的调试技巧日志优先重实操这套BMS资料里最宝贵的不是某个具体函数而是整个调试链路。开发时我会在STM32代码里加一个串口调试口把所有关键事件打印出来上电复位原因、BQ76930初始化结果、每次保护触发的类型和时间、均衡开关动作、通信报文收发计数。这些日志配合CAN抓包和电源分析仪能快速定位问题出在硬件还是软件。如果你手上也有这套资料的工程建议从最小系统开始验证先只接BQ76930的I2C打印原始寄存器值再开电芯电压采集最后再调均衡和CAN。每一步验证通过再进行下一步比一次性把整个系统跑起来再慢慢查可靠得多。BMS涉及高压和功率回路千万注意操作安全尤其是接电芯线和带电插拔采样插头一定要先确认连接顺序和绝缘养成先断电再动手的习惯。本文还有配套的精品资源点击获取