智能电池管理系统(BMS)

智能电池管理系统(BMS)

智能电池管理系统(BMS)完整代码

基于STM32F103的完整BMS系统代码:

c 复制代码
/**
  ******************************************************************************
  * @file    bms_main.c
  * @author  BMS Development Team
  * @brief   智能电池管理系统主程序
  *          基于STM32F103 + LTC6811 AFE芯片
  *          支持12串锂电池管理
  ******************************************************************************
  */

#include "main.h"
#include "stm32f1xx_hal.h"
#include "ltc6811.h"
#include "bms_core.h"
#include "bms_soc.h"
#include "bms_protection.h"
#include "bms_balance.h"
#include "bms_charge.h"
#include "bms_communication.h"
#include "bms_storage.h"
#include "eeprom_emulation.h"

/* 全局变量定义 -------------------------------------------------------------*/
BMS_System_t BMS;
CAN_HandleTypeDef hcan;
SPI_HandleTypeDef hspi1;
I2C_HandleTypeDef hi2c1;
ADC_HandleTypeDef hadc1;

/* 函数声明 ---------------------------------------------------------------*/
static void SystemClock_Config(void);
static void GPIO_Init(void);
static void SPI1_Init(void);
static void I2C1_Init(void);
static void ADC1_Init(void);
static void CAN_Init(void);
static void Timer_Init(void);
static void BMS_System_Init(void);
static void BMS_Main_Task(void);
static void BMS_Periodic_Task_1ms(void);
static void BMS_Periodic_Task_10ms(void);
static void BMS_Periodic_Task_100ms(void);
static void BMS_Periodic_Task_1000ms(void);
static void Error_Handler(void);

/**
  * @brief  主函数
  * @retval int
  */
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    GPIO_Init();
    SPI1_Init();
    I2C1_Init();
    ADC1_Init();
    CAN_Init();
    Timer_Init();
    
    /* 初始化BMS系统 */
    BMS_System_Init();
    
    /* 启动看门狗 */
    IWDG_Start();
    
    /* 主循环 */
    while (1)
    {
        BMS_Main_Task();
        
        /* 低功耗模式 */
        __WFI();
    }
}

/**
  * @brief  BMS系统初始化
  */
static void BMS_System_Init(void)
{
    /* 重置BMS结构体 */
    memset(&BMS, 0, sizeof(BMS_System_t));
    
    /* 从EEPROM加载参数 */
    BMS_LoadParameters();
    
    /* 初始化AFE芯片 */
    LTC6811_Init();
    
    /* 初始化SOC估算器 */
    SOC_Estimator_Init();
    
    /* 初始化保护模块 */
    Protection_Module_Init();
    
    /* 初始化均衡模块 */
    Balance_Module_Init();
    
    /* 初始化充电管理 */
    Charge_Manager_Init();
    
    /* 初始化通信模块 */
    BMS_Comm_Init();
    
    /* 设置系统状态 */
    BMS.system_state = BMS_STATE_INIT;
    BMS.fault_status = 0;
    BMS.battery_status = BATTERY_IDLE;
    
    /* 记录系统启动 */
    BMS_LogEvent(EVENT_SYSTEM_START, 0);
}

/**
  * @brief  BMS主任务
  */
static void BMS_Main_Task(void)
{
    static uint32_t tick_1ms = 0;
    static uint32_t tick_10ms = 0;
    static uint32_t tick_100ms = 0;
    static uint32_t tick_1000ms = 0;
    uint32_t current_tick = HAL_GetTick();
    
    /* 1ms任务 */
    if (current_tick - tick_1ms >= 1)
    {
        tick_1ms = current_tick;
        BMS_Periodic_Task_1ms();
    }
    
    /* 10ms任务 */
    if (current_tick - tick_10ms >= 10)
    {
        tick_10ms = current_tick;
        BMS_Periodic_Task_10ms();
    }
    
    /* 100ms任务 */
    if (current_tick - tick_100ms >= 100)
    {
        tick_100ms = current_tick;
        BMS_Periodic_Task_100ms();
    }
    
    /* 1000ms任务 */
    if (current_tick - tick_1000ms >= 1000)
    {
        tick_1000ms = current_tick;
        BMS_Periodic_Task_1000ms();
    }
}

/**
  * @brief  1ms周期任务
  */
static void BMS_Periodic_Task_1ms(void)
{
    /* 电流采样和库仑计更新 */
    BMS_Current_Sampling();
    
    /* 故障快速检测 */
    Protection_Fast_Check();
    
    /* 看门狗喂狗 */
    IWDG_Reload();
}

/**
  * @brief  10ms周期任务
  */
static void BMS_Periodic_Task_10ms(void)
{
    /* 电压温度采集 */
    BMS_Measurement_Task();
    
    /* SOC估算 */
    SOC_Estimation_Task();
    
    /* 均衡控制 */
    Balance_Control_Task();
    
    /* 保护策略执行 */
    Protection_Strategy_Task();
}

/**
  * @brief  100ms周期任务
  */
static void BMS_Periodic_Task_100ms(void)
{
    /* 充电管理 */
    Charge_Management_Task();
    
    /* CAN通信发送 */
    BMS_CAN_Transmit_Task();
    
    /* 状态监控 */
    BMS_Status_Monitor();
}

/**
  * @brief  1000ms周期任务
  */
static void BMS_Periodic_Task_1000ms(void)
{
    /* 参数保存到EEPROM */
    BMS_SaveParameters();
    
    /* 故障记录管理 */
    BMS_FaultLog_Management();
    
    /* 系统自检 */
    BMS_SelfTest_Task();
    
    /* 发送心跳包 */
    BMS_SendHeartbeat();
}

/**
  * @brief  BMS测量任务
  */
void BMS_Measurement_Task(void)
{
    uint8_t afe_status;
    
    /* 启动AFE测量 */
    afe_status = LTC6811_StartCellVoltageMeasurement();
    if (afe_status != AFE_OK)
    {
        BMS_LogEvent(EVENT_AFE_ERROR, afe_status);
        return;
    }
    
    HAL_Delay(3);  /* 等待测量完成 */
    
    /* 读取电芯电压 */
    afe_status = LTC6811_ReadCellVoltages(BMS.cell_voltages);
    if (afe_status != AFE_OK)
    {
        BMS_LogEvent(EVENT_AFE_READ_ERROR, afe_status);
        return;
    }
    
    /* 读取温度 */
    afe_status = LTC6811_ReadTemperatures(BMS.temperatures);
    if (afe_status != AFE_OK)
    {
        BMS_LogEvent(EVENT_TEMP_READ_ERROR, afe_status);
        return;
    }
    
    /* 计算统计值 */
    BMS_CalculateStatistics();
}

/**
  * @brief  电流采样和库仑计更新
  */
void BMS_Current_Sampling(void)
{
    static int32_t coulomb_count = 0;
    int16_t current_raw;
    float current;
    
    /* 读取电流采样值 */
    current_raw = ADC_GetCurrentValue();
    
    /* 转换为实际电流值(单位:A) */
    current = (float)current_raw * CURRENT_SCALE_FACTOR;
    BMS.pack_current = current;
    
    /* 更新库仑计 */
    coulomb_count += (int32_t)(current * 1000 / 3600);  /* mAh计数 */
    BMS.coulomb_count = coulomb_count;
    
    /* 更新电流统计 */
    if (current > BMS.max_current)
        BMS.max_current = current;
    if (current < BMS.min_current)
        BMS.min_current = current;
}

/**
  * @brief  SOC估算任务
  */
void SOC_Estimation_Task(void)
{
    static uint32_t soc_update_counter = 0;
    float soc_coulomb, soc_ocv, soc_final;
    
    /* 每10次执行一次完整SOC估算 */
    if (++soc_update_counter >= 10)
    {
        soc_update_counter = 0;
        
        /* 库仑计法SOC */
        soc_coulomb = SOC_CoulombCounting(&BMS);
        
        /* OCV法SOC(需要电池静置时使用) */
        if (BMS.pack_current < 0.1 && BMS.pack_current > -0.1)
        {
            soc_ocv = SOC_OCV_Method(BMS.pack_voltage);
            /* 使用卡尔曼滤波器融合两种方法 */
            soc_final = SOC_KalmanFilter(soc_coulomb, soc_ocv);
        }
        else
        {
            soc_final = soc_coulomb;
        }
        
        /* 应用温度补偿 */
        soc_final = SOC_TemperatureCompensation(soc_final, BMS.temp_max);
        
        /* 限制SOC范围 0-100% */
        if (soc_final > 100.0f) soc_final = 100.0f;
        if (soc_final < 0.0f) soc_final = 0.0f;
        
        BMS.state_of_charge = soc_final;
    }
}

/**
  * @brief  均衡控制任务
  */
void Balance_Control_Task(void)
{
    uint8_t i;
    uint8_t balance_flags = 0;
    
    /* 检查均衡条件 */
    if (BMS.system_state == BMS_STATE_NORMAL &&
        BMS.battery_status != BATTERY_CHARGING &&
        BMS.state_of_charge > BALANCE_SOC_THRESHOLD)
    {
        /* 被动均衡 */
        for (i = 0; i < CELL_COUNT; i++)
        {
            if (BMS.cell_voltages[i] > BALANCE_VOLTAGE_THRESHOLD)
            {
                balance_flags |= (1 << i);
                LTC6811_EnableDischarge(i, ENABLE);
            }
            else
            {
                LTC6811_EnableDischarge(i, DISABLE);
            }
        }
        
        /* 主动均衡(需要额外硬件支持) */
        if (BMS.config.enable_active_balance)
        {
            Active_Balance_Control();
        }
        
        BMS.balance_flags = balance_flags;
    }
    else
    {
        /* 关闭所有均衡 */
        for (i = 0; i < CELL_COUNT; i++)
        {
            LTC6811_EnableDischarge(i, DISABLE);
        }
        BMS.balance_flags = 0;
    }
}

/**
  * @brief  保护策略任务
  */
void Protection_Strategy_Task(void)
{
    static uint32_t protection_check_counter = 0;
    uint8_t fault_detected = 0;
    
    /* 保护检查计数器 */
    if (++protection_check_counter >= 5)  /* 50ms检查一次 */
    {
        protection_check_counter = 0;
        
        /* 过压保护检查 */
        if (Protection_OverVoltage_Check())
        {
            fault_detected = 1;
            BMS_SetFault(FAULT_OVERVOLTAGE);
        }
        
        /* 欠压保护检查 */
        if (Protection_UnderVoltage_Check())
        {
            fault_detected = 1;
            BMS_SetFault(FAULT_UNDERVOLTAGE);
        }
        
        /* 过流保护检查 */
        if (Protection_OverCurrent_Check())
        {
            fault_detected = 1;
            BMS_SetFault(FAULT_OVERCURRENT);
        }
        
        /* 过温保护检查 */
        if (Protection_OverTemperature_Check())
        {
            fault_detected = 1;
            BMS_SetFault(FAULT_OVERTEMPERATURE);
        }
        
        /* 温度过低保护 */
        if (Protection_UnderTemperature_Check())
        {
            fault_detected = 1;
            BMS_SetFault(FAULT_UNDERTEMPERATURE);
        }
        
        /* 如果有故障,执行保护动作 */
        if (fault_detected)
        {
            Protection_Execute_Action();
        }
    }
}

/**
  * @brief  充电管理任务
  */
void Charge_Management_Task(void)
{
    static Charge_State_t charge_state = CHARGE_IDLE;
    static float cc_current_setpoint = 0;
    static float cv_voltage_setpoint = 0;
    
    switch (charge_state)
    {
        case CHARGE_IDLE:
            /* 检查是否允许充电 */
            if (BMS_CanStartCharge())
            {
                charge_state = CHARGE_PRECHARGE;
                BMS.battery_status = BATTERY_CHARGING;
                BMS_LogEvent(EVENT_CHARGE_START, 0);
            }
            break;
            
        case CHARGE_PRECHARGE:
            /* 预充电阶段:小电流充电至最低电压 */
            if (BMS.pack_voltage < PRECHARGE_VOLTAGE_THRESHOLD)
            {
                cc_current_setpoint = PRECHARGE_CURRENT;
                Charge_SetCurrent(cc_current_setpoint);
            }
            else
            {
                charge_state = CHARGE_CC;
                cc_current_setpoint = CHARGE_CURRENT_MAX;
            }
            break;
            
        case CHARGE_CC:
            /* 恒流充电阶段 */
            Charge_SetCurrent(cc_current_setpoint);
            
            /* 检查是否达到恒压点 */
            if (BMS.cell_voltage_max >= CHARGE_VOLTAGE_MAX - 0.01f)
            {
                charge_state = CHARGE_CV;
                cv_voltage_setpoint = CHARGE_VOLTAGE_MAX * CELL_COUNT;
            }
            break;
            
        case CHARGE_CV:
            /* 恒压充电阶段 */
            Charge_SetVoltage(cv_voltage_setpoint);
            
            /* 检查充电完成条件 */
            if (BMS.pack_current < CHARGE_TERMINATION_CURRENT)
            {
                charge_state = CHARGE_COMPLETE;
            }
            break;
            
        case CHARGE_COMPLETE:
            /* 充电完成 */
            Charge_Stop();
            BMS.battery_status = BATTERY_FULL;
            BMS_LogEvent(EVENT_CHARGE_COMPLETE, 0);
            charge_state = CHARGE_IDLE;
            break;
            
        case CHARGE_FAULT:
            /* 充电故障处理 */
            Charge_Stop();
            BMS.battery_status = BATTERY_FAULT;
            break;
    }
}

/**
  * @brief  CAN通信发送任务
  */
void BMS_CAN_Transmit_Task(void)
{
    static uint8_t can_msg_counter = 0;
    CAN_TxHeaderTypeDef tx_header;
    uint8_t tx_data[8];
    uint32_t tx_mailbox;
    
    /* J1939协议消息 */
    switch (can_msg_counter)
    {
        case 0:
            /* PGN 61444: 电池组状态 */
            tx_header.StdId = 0x18FF50F4;  /* J1939广播地址 */
            tx_header.ExtId = 0;
            tx_header.RTR = CAN_RTR_DATA;
            tx_header.IDE = CAN_ID_STD;
            tx_header.DLC = 8;
            
            /* 数据:SOC, SOH, 电压, 电流, 温度 */
            tx_data[0] = (uint8_t)BMS.state_of_charge;
            tx_data[1] = (uint8_t)BMS.state_of_health;
            tx_data[2] = (uint8_t)(BMS.pack_voltage >> 8);
            tx_data[3] = (uint8_t)BMS.pack_voltage;
            tx_data[4] = (uint8_t)(BMS.pack_current + 1000);
            tx_data[5] = (uint8_t)(BMS.pack_current >> 8);
            tx_data[6] = (uint8_t)BMS.temp_max;
            tx_data[7] = (uint8_t)BMS.temp_min;
            
            HAL_CAN_AddTxMessage(&hcan, &tx_header, tx_data, &tx_mailbox);
            break;
            
        case 1:
            /* PGN 61443: 电池组电压信息 */
            tx_header.StdId = 0x18FF50F3;
            tx_header.ExtId = 0;
            tx_header.RTR = CAN_RTR_DATA;
            tx_header.IDE = CAN_ID_STD;
            tx_header.DLC = 8;
            
            /* 数据:最高/最低电芯电压,电芯电压1-3 */
            tx_data[0] = (uint8_t)(BMS.cell_voltage_max * 100);
            tx_data[1] = (uint8_t)(BMS.cell_voltage_min * 100);
            tx_data[2] = (uint8_t)(BMS.cell_voltages[0] * 100);
            tx_data[3] = (uint8_t)(BMS.cell_voltages[1] * 100);
            tx_data[4] = (uint8_t)(BMS.cell_voltages[2] * 100);
            tx_data[5] = (uint8_t)BMS.balance_flags;
            tx_data[6] = BMS.fault_status;
            tx_data[7] = BMS.warning_status;
            
            HAL_CAN_AddTxMessage(&hcan, &tx_header, tx_data, &tx_mailbox);
            break;
            
        case 2:
            /* PGN 61445: 电池温度信息 */
            tx_header.StdId = 0x18FF50F5;
            tx_header.ExtId = 0;
            tx_header.RTR = CAN_RTR_DATA;
            tx_header.IDE = CAN_ID_STD;
            tx_header.DLC = 8;
            
            /* 数据:温度1-6 */
            for (uint8_t i = 0; i < 6; i++)
            {
                tx_data[i] = (uint8_t)BMS.temperatures[i];
            }
            tx_data[6] = (uint8_t)BMS.temp_max;
            tx_data[7] = (uint8_t)BMS.temp_min;
            
            HAL_CAN_AddTxMessage(&hcan, &tx_header, tx_data, &tx_mailbox);
            break;
    }
    
    can_msg_counter = (can_msg_counter + 1) % 3;
}

/**
  * @brief  EEPROM参数保存
  */
void BMS_SaveParameters(void)
{
    static uint32_t save_counter = 0;
    
    if (++save_counter >= 600)  /* 每10分钟保存一次 */
    {
        save_counter = 0;
        
        /* 保存系统参数 */
        EE_SaveParameter(PARAM_SOC_ADDR, (uint16_t)(BMS.state_of_charge * 10));
        EE_SaveParameter(PARAM_SOH_ADDR, (uint16_t)(BMS.state_of_health * 10));
        EE_SaveParameter(PARAM_CYCLE_COUNT_ADDR, BMS.cycle_count);
        EE_SaveParameter(PARAM_TOTAL_AH_ADDR, (uint16_t)(BMS.total_ah_throughput));
        
        /* 保存配置参数 */
        EE_SaveParameter(PARAM_CONFIG_ADDR, *(uint16_t*)&BMS.config);
    }
}

/**
  * @brief  故障记录管理
  */
void BMS_FaultLog_Management(void)
{
    Fault_Record_t fault_record;
    
    /* 检查是否有新故障 */
    if (BMS.new_fault_detected)
    {
        fault_record.timestamp = HAL_GetTick();
        fault_record.fault_code = BMS.latest_fault;
        fault_record.soc_at_fault = BMS.state_of_charge;
        fault_record.voltage_at_fault = BMS.pack_voltage;
        fault_record.current_at_fault = BMS.pack_current;
        fault_record.temperature_at_fault = BMS.temp_max;
        
        /* 保存故障记录到EEPROM */
        EE_SaveFaultRecord(&fault_record);
        
        BMS.new_fault_detected = 0;
        BMS.fault_record_count++;
    }
}

/**
  * @brief  系统时钟配置
  */
static void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
    /* 配置HSE */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
    
    /* 配置系统时钟 */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
}

/**
  * @brief  CAN初始化
  */
static void CAN_Init(void)
{
    CAN_FilterTypeDef can_filter;
    
    hcan.Instance = CAN1;
    hcan.Init.Prescaler = 9;
    hcan.Init.Mode = CAN_MODE_NORMAL;
    hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan.Init.TimeSeg1 = CAN_BS1_13TQ;
    hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
    hcan.Init.TimeTriggeredMode = DISABLE;
    hcan.Init.AutoBusOff = ENABLE;
    hcan.Init.AutoWakeUp = DISABLE;
    hcan.Init.AutoRetransmission = ENABLE;
    hcan.Init.ReceiveFifoLocked = DISABLE;
    hcan.Init.TransmitFifoPriority = DISABLE;
    
    if (HAL_CAN_Init(&hcan) != HAL_OK)
    {
        Error_Handler();
    }
    
    /* 配置CAN过滤器 */
    can_filter.FilterBank = 0;
    can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
    can_filter.FilterIdHigh = 0x0000;
    can_filter.FilterIdLow = 0x0000;
    can_filter.FilterMaskIdHigh = 0x0000;
    can_filter.FilterMaskIdLow = 0x0000;
    can_filter.FilterFIFOAssignment = CAN_RX_FIFO0;
    can_filter.FilterActivation = ENABLE;
    can_filter.SlaveStartFilterBank = 14;
    
    HAL_CAN_ConfigFilter(&hcan, &can_filter);
    
    /* 启动CAN */
    HAL_CAN_Start(&hcan);
    HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
}

/**
  * @brief  定时器初始化
  */
static void Timer_Init(void)
{
    /* 配置系统定时器 */
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
    
    /* 配置独立看门狗 */
    IWDG_InitTypeDef iwdg;
    iwdg.Prescaler = IWDG_PRESCALER_64;
    iwdg.Reload = 0x0FFF;
    iwdg.Window = 0x0FFF;
    HAL_IWDG_Init(&iwdg);
}

/**
  * @brief  错误处理函数
  */
static void Error_Handler(void)
{
    /* 点亮错误指示灯 */
    HAL_GPIO_WritePin(LED_ERROR_GPIO_Port, LED_ERROR_Pin, GPIO_PIN_SET);
    
    /* 记录系统复位 */
    BMS_LogEvent(EVENT_SYSTEM_RESET, 0);
    
    /* 系统复位 */
    NVIC_SystemReset();
}

/**
  * @brief  CAN接收中断回调函数
  */
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
    CAN_RxHeaderTypeDef rx_header;
    uint8_t rx_data[8];
    
    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data) == HAL_OK)
    {
        /* 处理CAN消息 */
        BMS_ProcessCANMessage(rx_header.StdId, rx_data);
    }
}

/* 头文件: bms_core.h ------------------------------------------------------*/
#ifndef __BMS_CORE_H
#define __BMS_CORE_H

#include <stdint.h>
#include <stdbool.h>

/* 系统定义 */
#define CELL_COUNT               12
#define TEMP_SENSOR_COUNT        6
#define ADC_RESOLUTION           4096
#define CURRENT_SCALE_FACTOR     0.1f    /* 电流转换系数 */
#define VOLTAGE_SCALE_FACTOR     0.0001f /* 电压转换系数 */

/* 系统状态 */
typedef enum
{
    BMS_STATE_INIT,
    BMS_STATE_STANDBY,
    BMS_STATE_NORMAL,
    BMS_STATE_CHARGING,
    BMS_STATE_FAULT,
    BMS_STATE_SLEEP
} BMS_State_t;

/* 电池状态 */
typedef enum
{
    BATTERY_IDLE,
    BATTERY_DISCHARGING,
    BATTERY_CHARGING,
    BATTERY_FULL,
    BATTERY_EMPTY,
    BATTERY_FAULT
} Battery_Status_t;

/* 充电状态 */
typedef enum
{
    CHARGE_IDLE,
    CHARGE_PRECHARGE,
    CHARGE_CC,
    CHARGE_CV,
    CHARGE_COMPLETE,
    CHARGE_FAULT
} Charge_State_t;

/* 故障代码 */
typedef enum
{
    FAULT_NONE = 0,
    FAULT_OVERVOLTAGE,
    FAULT_UNDERVOLTAGE,
    FAULT_OVERCURRENT,
    FAULT_OVERTEMPERATURE,
    FAULT_UNDERTEMPERATURE,
    FAULT_SHORT_CIRCUIT,
    FAULT_OPEN_WIRE,
    FAULT_AFE_COMM_ERROR,
    FAULT_CELL_BALANCE_FAIL,
    FAULT_INTERNAL_ERROR
} Fault_Code_t;

/* 事件类型 */
typedef enum
{
    EVENT_SYSTEM_START,
    EVENT_SYSTEM_RESET,
    EVENT_CHARGE_START,
    EVENT_CHARGE_COMPLETE,
    EVENT_DISCHARGE_START,
    EVENT_DISCHARGE_COMPLETE,
    EVENT_FAULT_OCCURRED,
    EVENT_FAULT_CLEARED,
    EVENT_AFE_ERROR,
    EVENT_TEMP_READ_ERROR,
    EVENT_CAN_ERROR
} Event_Type_t;

/* BMS配置结构体 */
typedef struct
{
    uint8_t enable_passive_balance : 1;
    uint8_t enable_active_balance : 1;
    uint8_t enable_cell_protection : 1;
    uint8_t enable_temperature_protection : 1;
    uint8_t enable_current_protection : 1;
    uint8_t reserve : 3;
    
    float cell_voltage_max;          /* 电芯最大电压 */
    float cell_voltage_min;          /* 电芯最小电压 */
    float charge_current_max;        /* 最大充电电流 */
    float discharge_current_max;     /* 最大放电电流 */
    float temperature_max;           /* 最高温度 */
    float temperature_min;           /* 最低温度 */
    float balance_voltage_threshold; /* 均衡启动电压 */
    float soc_balance_threshold;     /* 均衡SOC阈值 */
} BMS_Config_t;

/* BMS系统结构体 */
typedef struct
{
    /* 系统状态 */
    BMS_State_t system_state;
    Battery_Status_t battery_status;
    
    /* 电池参数 */
    float cell_voltages[CELL_COUNT];
    float cell_voltage_max;
    float cell_voltage_min;
    float cell_voltage_avg;
    float pack_voltage;
    
    float temperatures[TEMP_SENSOR_COUNT];
    float temp_max;
    float temp_min;
    float temp_avg;
    
    float pack_current;
    float max_current;
    float min_current;
    float current_avg;
    
    /* SOC/SOH */
    float state_of_charge;
    float state_of_health;
    int32_t coulomb_count;
    uint32_t cycle_count;
    float total_ah_throughput;
    
    /* 保护状态 */
    uint16_t fault_status;
    uint16_t warning_status;
    Fault_Code_t latest_fault;
    uint8_t new_fault_detected;
    
    /* 均衡状态 */
    uint16_t balance_flags;
    
    /* 配置参数 */
    BMS_Config_t config;
    
    /* 统计信息 */
    uint32_t operation_time;
    uint32_t charge_time;
    uint32_t discharge_time;
    uint8_t fault_record_count;
} BMS_System_t;

/* 故障记录结构体 */
typedef struct
{
    uint32_t timestamp;
    Fault_Code_t fault_code;
    float soc_at_fault;
    float voltage_at_fault;
    float current_at_fault;
    float temperature_at_fault;
} Fault_Record_t;

/* 外部变量声明 */
extern BMS_System_t BMS;

/* 函数声明 */
void BMS_System_Init(void);
void BMS_Main_Task(void);
void BMS_Measurement_Task(void);
void BMS_Current_Sampling(void);
void SOC_Estimation_Task(void);
void Balance_Control_Task(void);
void Protection_Strategy_Task(void);
void Charge_Management_Task(void);
void BMS_CAN_Transmit_Task(void);
void BMS_ProcessCANMessage(uint32_t std_id, uint8_t* data);
void BMS_SaveParameters(void);
void BMS_LoadParameters(void);
void BMS_FaultLog_Management(void);
void BMS_LogEvent(Event_Type_t event, uint16_t data);
void BMS_SetFault(Fault_Code_t fault);
void BMS_ClearFault(Fault_Code_t fault);
void BMS_CalculateStatistics(void);

#endif /* __BMS_CORE_H */

关键特性说明

1. 硬件架构

  • STM32F103作为主控制器
  • LTC6811作为AFE芯片(SPI接口)
  • 支持12串锂电池管理
  • CAN总线通信接口
  • EEPROM用于参数存储

2. 核心功能

  • 电压/温度采集:高精度测量,定期校准
  • SOC估算:融合库仑计法和OCV法,使用卡尔曼滤波
  • 均衡控制:支持被动均衡和主动均衡
  • 充电管理:CC/CV充电曲线,多阶段充电控制
  • 多重保护:过压、欠压、过流、过温等保护策略

3. 通信协议

  • SAE J1939标准CAN通信
  • 实时上报电池状态信息
  • 支持远程诊断和控制

4. 数据存储

  • EEPROM存储关键参数
  • 故障记录功能
  • 循环计数和寿命统计

5. 安全特性

  • 看门狗定时器
  • 多重保护策略
  • 故障自恢复机制
  • 系统自检功能

使用说明

  1. 硬件连接

    • 连接LTC6811到STM32的SPI1接口
    • 连接CAN收发器到PA11/PA12
    • 连接电流采样ADC
    • 连接温度传感器
  2. 参数配置

    • 根据电池规格修改bms_core.h中的参数
    • 配置保护阈值
    • 设置通信参数
  3. 系统调试

    • 使用CAN分析仪监控通信
    • 通过调试接口查看实时数据
    • 使用EEPROM读写工具检查参数存储

注意事项

  1. 本代码为示例框架,需要根据实际硬件调整
  2. 生产环境需要添加更多错误处理和冗余设计
  3. 安全相关功能必须经过充分测试
  4. 建议添加电池老化补偿算法
  5. 考虑环境温度对测量精度的影响
相关推荐
@good_good_study2 小时前
FreeRTOS任务调度
stm32
云山工作室2 小时前
基于单片机和LabVIEW的多路数据采集器系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·labview·毕设
辰哥单片机设计2 小时前
STM32项目分享:智能热水器
stm32·单片机·嵌入式硬件
___波子 Pro Max.3 小时前
序列化 vs 反序列化
stm32·单片机·嵌入式硬件
梁洪飞3 小时前
使用rockchip sdk提供的uboot调通网络
linux·网络·arm开发·嵌入式硬件·arm
小渔村的拉线工3 小时前
20.IIC通信上拉电阻的计算
嵌入式硬件·iic·硬件知识·上拉电阻
来生硬件工程师3 小时前
【信号完整性与电源完整性分析】什么是信号完整性?什么是电源完整性?
笔记·stm32·单片机·嵌入式硬件·硬件工程
@good_good_study4 小时前
FreeRTOS信号量
stm32
Zeku4 小时前
借助通用驱动spidev实现SPI全双工通信
stm32·freertos·linux驱动开发·linux应用开发