毕业设计| STM32+TI BQ76940设计48V BMS方案
2023-04-26 来源:zhihu
这是根据TI官方那个方案改:精确监测和 50μA 待机电流、13S、48V 锂离子电池组参考设计TIDA-010030,链接如下:https://www.ti.com.cn/tool/cn/TIDA-010030#technicaldocuments原方案里的MCU用的是TI自家的MSP430,由于没用过,我自己改成了STM32F103C8T6。
除了电量计这块没有进行充放电学习过程外,基本实现要求功能,自定义的过流,短路,过放,过温都行。可以自动识别充放电,充电过程进行电池均衡(这里设置了一节),防充电器倒冲(程序存在BUG我最后只做到了10V,如果一上来就低于10V就不管用了),CAN总线传输数据也整上了。BQ7718我买错型号了,所以这个冗余保护部分就没测试过,不过这部分所在的第二块儿PCB很简单,直接改官方的PCB也行,我就是这么干的。
具体方案
原理框图:
总览原理图:
STM32我是用Cubmx进行的快速开发,配置起来很方便,具体流程我也是根据网上各种Cubemx教程一点一点来的,在此之前完全没用过,软件一直在吃灰。
注意事项
1)电流采样部分的PCB布线
这块儿很重要,硬件不行直接影响后面的软件程序设计。电流采用回路没设计好直接导致采集回来的电流老飘,然后误动作,因此我重打了一块板子,唉。
这里分享一个ADI的设计方法,可以借鉴学习:https://www.analog.com/en/analog-dialogue/articles/optimize-high-current-sensing-accuracy.html
第一次给这种板子布线,傻傻的,光顾连线了,额。程序开发到一半发现电流怎么都归不了零,明明什么负载都没接,它却处于一个较高的波动,极其蛋疼。没法设计自动识别充放电了。于是第二次我参照官方的PCB进行了以下改进,做出来终于正常了。
所以布线要认真,我这一共弄了三版,第一版直接封装搞错好几个。。。。。。
2)与BQ76940的IIC通讯
Cubemx的硬件IIC下,我用的BQ7694003的IIC地址是0X08,实际上要写0X10。
由于我用的是Cubemx的硬件IIC,所以玩过这个硬件IIC的想必都碰过坑,我还行,做足了前期准备。幸运的是我参考了这篇博文:STM32F103硬件IIC在HAL库下入坑指南 https://blog.csdn.net/niushijia007/article/details/99671761
同时我还在网上搜刮到了BQ76940和BQ34Z100-G1的相关程序。
在刚开始测试与BQ76940进行IIC通讯时,发生了无法通讯的问题,其根源在于BQ76940使用的是7位IIC地址:0X08。而STM32的硬件IIC是取8位地址中的前7位(从左往右数),然后直接将其最低位强制改为0(表示写操作)或1(表示读操作),最后最高位补0。这样导致我输入的从机地址是0X08,实际上发送出去的是0X40,BQ76940根本不响应,通过逻辑分析仪才看出来。
之后通过将从机地址手动左移一位后变为了0X10,这一次终于正确了,发送出的是0X08。可是,IIC读操作回来的数据仍然对不上。经过逻辑分析仪比对,人工CRC计算,发现CRC校验没过。校验时需要用到从机地址。虽然逻辑分析仪中显示的发送地址是0X08,但从机计算时采用的却是0X10加上读操作1(即0X11)。因此主机在进行CRC计算时就需要手动在原从机地址上+1处理,修改后读操作就能成功通过CRC校验。(PS:读操作即使不进行CRC计算流程也行,不过嘛,带CRC更保险)具体原因可以看BQ76940的官方CRC通讯手册。
补一张读操作时的图片,用下面的工具选择CRC-8,然后输入“11 FF”即可计算出从机BQ76940返回的CRC值:“B1”。
3)与BQ34Z100-G1的IIC通讯
BQ34Z100-G1这款电量计是阻抗跟踪的,比较准,不过对于新手来说也坑,它得预先配置文件,我是咸鱼专门买了个自制的EV2400然后用BqStudio配置的,要不真的很难整。
好在网上程序也好找,直接搬然后改一改就行。我只搬了后续的读取部分,初始化有些麻烦,还是老老实实用BqStudio配置吧。
还有它的IIC地址,搞得我很方,在Cubemx的硬件IIC上你写0XAA它实际输出的是0X55,就能用了,和之前那个BQ7694003的0X08你得手动左移一位不一样。
不过,芯片调试这里TI官方可是给了现成的调试软件,BQ76940有专门的上位机程序,BQ34Z100-G1有BqStudio,建议咸鱼卖个便宜的EV2400一步到位,省很多麻烦。