STM32 BMS电池管理系统 电池管理控制器 主控STM32F103C8T6,具有以下功能: 1.具有单体电压、总体电压检测,过充、过放告警及保护功能 常温下静态电压采样精度可达<20mV 2.具有充放电电流检测,充放电过流告警及保护功能 上位机可以显示充放电状态 3.具有均衡功能,均衡条件程序默认压差大于50mV,可设置其它阈值 具有通讯功能,有TTL,CAN,2种通讯方式,同时具有蓝牙无线传输功能,通过微信小程序即可查看实时电池信息 5.具有通过USB下载程序功能 提供AD格式原理图,源代码,代码含有大量的中文注释 说明文档,芯片说明书,上位机软件,附送一套非ST主控 bms电池管理系统方案(pcb+原理图+代码),一套soc代码,及bms相关学习资料
最近捣鼓了一下基于 STM32 的 BMS 电池管理系统,真的是乐趣满满,今天就来跟大家分享分享。
主控芯片 STM32F103C8T6
这个系统的核心主控是 STM32F103C8T6,别看它个头不大,功能可强大着呢。
系统功能亮点
1. 电压检测与保护
它具备单体电压、总体电压检测能力,而且还有过充、过放告警及保护功能,常温下静态电压采样精度能达到 <20mV,这精度相当可以了。在代码实现上,ADC 采集部分的代码是关键。
// 初始化 ADC 外设 void ADC_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能 ADC1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置 PA1 为模拟输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // ADC 复位 ADC_DeInit(ADC1); // ADC 初始化 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 使能 ADC1 ADC_Cmd(ADC1, ENABLE); // ADC 校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } // 获取 ADC 转换值 uint16_t Get_ADCValue(void) { // 选择 ADC 通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 启动 ADC 转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 等待转换完成 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 返回 ADC 转换值 return ADC_GetConversionValue(ADC1); }这里,先初始化 ADC 相关的 GPIO 引脚,配置为模拟输入模式。然后对 ADC 进行一系列设置,包括工作模式、转换模式等。获取 ADC 值的函数里,先选择要采集的通道,启动转换后等待转换完成,最后返回采集到的值,通过这个值就能换算出实际的电压值啦。如果检测到电压超过或低于设定阈值,就触发过充或过放告警及保护逻辑。
2. 充放电电流检测与状态显示
系统还能检测充放电电流,并且有充放电过流告警及保护功能,上位机还可以显示充放电状态。电流检测一般通过采样电阻和运算放大器把电流信号转换为电压信号,再通过 ADC 采集。假设采集电流的 ADC 通道是 ADCChannel2,代码跟上面电压采集类似,修改通道配置就行。
// 获取电流 ADC 转换值 uint16_t Get_CurrentADCValue(void) { // 选择 ADC 通道为电流检测通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5); // 启动 ADC 转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 等待转换完成 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 返回 ADC 转换值 return ADC_GetConversionValue(ADC1); }得到 ADC 值后,根据采样电阻和运算放大器的参数换算出实际电流值,与设定的过流阈值比较,决定是否触发告警和保护。而上位机显示充放电状态,可以通过串口或者其他通讯方式把状态信息发送过去。
3. 均衡功能
这个系统的均衡功能也很有意思,均衡条件程序默认压差大于 50mV,不过也可以设置其它阈值。实现均衡功能的代码逻辑大概是这样:
// 假设已经获取到各个单体电池电压值存放在数组 voltage[] 中 // 电池数量为 battery_num void Balance(void) { uint8_t i, j; for(i = 0; i < battery_num - 1; i++) { for(j = i + 1; j < battery_num; j++) { if(abs(voltage[i] - voltage[j]) > balance_threshold) { // 这里添加均衡动作代码,比如控制 MOS 管进行能量转移 // 简单示例,实际要根据硬件电路来 if(voltage[i] > voltage[j]) { // 控制与电池 i 相连的 MOS 管导通一段时间进行放电 // 假设 MOS 管控制引脚为 GPIO_Pin_10,这里简单示意 GPIO_SetBits(GPIOx, GPIO_Pin_10); // 延时一段时间 for(int k = 0; k < discharge_time; k++); GPIO_ResetBits(GPIOx, GPIO_Pin_10); } else { // 控制与电池 j 相连的 MOS 管导通一段时间进行放电 // 假设 MOS 管控制引脚为 GPIO_Pin_11,这里简单示意 GPIO_SetBits(GPIOx, GPIO_Pin_11); // 延时一段时间 for(int k = 0; k < discharge_time; k++); GPIO_ResetBits(GPIOx, GPIO_Pin_11); } } } } }这里通过比较各个单体电池的电压差,当超过设定的均衡阈值时,就采取相应的均衡动作,通过控制 MOS 管来实现电池间的能量转移,让电池组的各个电池电压尽可能一致。
4. 丰富的通讯功能
系统有 TTL、CAN 两种通讯方式,同时还具有蓝牙无线传输功能,通过微信小程序就能查看实时电池信息。以蓝牙通讯为例,一般会用到蓝牙模块,通过串口与 STM32 连接。初始化串口代码如下:
// 初始化 USART 用于蓝牙通讯 void USART_Bluetooth_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能 GPIOA 和 USART1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置 PA9(TX)为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 PA10(RX)为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // USART1 初始化 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能 USART1 USART_Cmd(USART1, ENABLE); }初始化好串口后,就可以通过串口向蓝牙模块发送数据,蓝牙模块再把数据发送到手机,微信小程序通过蓝牙连接接收数据并显示。
5. USB 下载程序功能
通过 USB 就能下载程序,这可方便多了。在硬件设计上,需要有 USB 接口电路,连接到 STM32 的 USB 相关引脚。在开发环境里,设置好下载方式为 USB 下载,就能轻松把编译好的程序烧录到芯片里。
丰富的资料配套
这个项目还提供 AD 格式原理图,源代码里含有大量的中文注释,还有说明文档、芯片说明书、上位机软件。不仅如此,还附送一套非 ST 主控 BMS 电池管理系统方案(PCB + 原理图 + 代码),一套 SOC 代码,以及 BMS 相关学习资料。这些资料对于深入研究 BMS 系统,学习 STM32 的应用真的是非常有帮助。无论是新手入门,还是老手想进一步优化系统,都能从这些资料里找到有用的东西。
STM32 BMS电池管理系统 电池管理控制器 主控STM32F103C8T6,具有以下功能: 1.具有单体电压、总体电压检测,过充、过放告警及保护功能 常温下静态电压采样精度可达<20mV 2.具有充放电电流检测,充放电过流告警及保护功能 上位机可以显示充放电状态 3.具有均衡功能,均衡条件程序默认压差大于50mV,可设置其它阈值 具有通讯功能,有TTL,CAN,2种通讯方式,同时具有蓝牙无线传输功能,通过微信小程序即可查看实时电池信息 5.具有通过USB下载程序功能 提供AD格式原理图,源代码,代码含有大量的中文注释 说明文档,芯片说明书,上位机软件,附送一套非ST主控 bms电池管理系统方案(pcb+原理图+代码),一套soc代码,及bms相关学习资料
总之,基于 STM32 的 BMS 电池管理系统可玩性非常高,通过对各个功能的代码实现和研究,能学到不少硬件和软件结合的知识,感兴趣的小伙伴不妨也动手试试。