forked from gary/BCU
2
0
Fork 0

高压堆叠产品单独程序,支持最多8个pack包

This commit is contained in:
Carl 2025-04-26 14:57:50 +08:00
parent 1be9fc25f7
commit ea635ee7b6
12 changed files with 7201 additions and 10486 deletions

View File

@ -445,7 +445,7 @@ void bms_poll_bmu(uint32_t base_time)
//温感检测是否脱落加上了防抖需要两次大于6000才设置温感排线错误温感排线错误显示的有点慢
//温感的值最开始全是大于6000的第二次才是采集值
memset(tempJudge_cnt, 0, sizeof(tempJudge_cnt));
//memset(tempJudge_cnt, 0, sizeof(tempJudge_cnt));
//2-5 @wangk add this line bcu statistic data is show
// bms_poll_statistic(0);
// //2-6 @wangk

View File

@ -58,6 +58,22 @@ uint8_t bms_get_bmu_num(void)
return bmu_data.bmu_num;
}
void bms_set_bmu_num(uint8_t number)
{
bmu_data.bmu_num = number;
bmu_data.total_ic_num = number;
}
void bms_set_bmu_volt_num(uint8_t number)
{
bmu_data.total_cell_num = number * 16;
}
void bms_set_bmu_temp_num(uint8_t number)
{
bmu_data.total_temp_num = number * 4;
}
uint8_t bms_get_bmu_online_num(void)
{
return bmu_data.bmu_online_num;

View File

@ -78,7 +78,11 @@ uint16_t bms_get_pole_temp_by_bmu(uint8_t bmu_idx, uint16_t idx);
uint16_t bms_get_balance_temp_by_bmu(uint8_t bmu_idx, uint16_t idx);
uint32_t bms_get_balance_status(uint8_t bmu_idx, uint8_t idx);
void bms_set_bmu_fault_bit(BmuFaultBit idx,uint8_t value);
void bms_set_bmu_num(uint8_t number);
void bms_set_bmu_num(uint8_t number);
void bms_set_bmu_volt_num(uint8_t number);
void bms_set_bmu_temp_num(uint8_t number);
#ifdef __cplusplus
}

View File

@ -384,6 +384,7 @@ const FaultLevel alarm_level_map[8] =
kFaultLevel_Normal, kFaultLevel_First, kFaultLevel_Second, kFaultLevel_Second,
kFaultLevel_Third, kFaultLevel_Third, kFaultLevel_Third, kFaultLevel_Third,
};
void bms_analyse_fault(RunStatus status, FaultArray *fault_array)
{
uint32_t i, j;
@ -412,15 +413,29 @@ void bms_analyse_fault(RunStatus status, FaultArray *fault_array)
handler = get_eeprom_data(FAULT_ALARM_HANDLER_ADDR(tmp), kEepromDataType_Full);
alarm_handle = handler & 0x0003;
cur_rate[j + kFaultLevel_End - level] = handler >> 8;
if(alarm_handle == kFaultHandle_ForbidIdx)//禁用
{
continue;
}
if(alarm_handle == kFaultHandle_ForbidIdx)//禁用
{
continue;
}
else if(alarm_handle != kFaultHandle_ForbidIdx)
{
data = fault_item.fault_data[prop_array[i].data_idx];
threshold[kCondType_Alarm] = get_eeprom_data(FAULT_ARARM_THRESHOLD_ADDR(tmp), kEepromDataType_Full);
threshold[kCondType_Release] = get_eeprom_data(FAULT_RELEASE_THRESHOLD_ADDR(tmp), kEepromDataType_Full);
if (i == 10 || i == 11)
{
uint16_t cell_threshold_idx = (i == 10) ? prop_array[12].threshold_idx : prop_array[13].threshold_idx;
uint16_t cell_threshold = get_eeprom_data(FAULT_ARARM_THRESHOLD_ADDR(cell_threshold_idx + j * 5), kEepromDataType_Full);
threshold[kCondType_Alarm] = (cell_threshold * bms_get_cell_num()) / 100;
cell_threshold = get_eeprom_data(FAULT_RELEASE_THRESHOLD_ADDR(cell_threshold_idx + j * 5), kEepromDataType_Full);
threshold[kCondType_Release] = (cell_threshold * bms_get_cell_num()) / 100;
}
else
{
threshold[kCondType_Alarm] = get_eeprom_data(FAULT_ARARM_THRESHOLD_ADDR(tmp), kEepromDataType_Full);
threshold[kCondType_Release] = get_eeprom_data(FAULT_RELEASE_THRESHOLD_ADDR(tmp), kEepromDataType_Full);
}
if(prop_array[i].other_cond == NULL) //如果没有其他故障判断策略,默认模版策略
{
check_type = prop_array[i].check_type & 0x03;

View File

@ -48,10 +48,10 @@ const FaultProp dis_fault_array[] =
{kFaultCode_MSComm, 1, kFaultData_MScomm, kEep_MSCommAlarm1, kCheckType_MoreThan | FAULT_RELAY_BOTH_OFF, NULL},
{kFaultCode_CmdTimeout, 1, kFaultData_CmdHeart, kEep_CmdTimeoutAlarm, kCheckType_MoreThan | FAULT_RELAY_BOTH_OFF, NULL},
{kFaultCode_LowTotalVolt, 3, kFaultData_TotalVolt, kEep_DisLTVoltHTAlarm1, kCheckType_LessThan, bms_dis_low_volt_ht_call},
{kFaultCode_LowTotalVolt, 3, kFaultData_TotalVolt, kEep_DisLTVoltLTAlarm1, kCheckType_LessThan, bms_dis_low_volt_lt_call},
{kFaultCode_LowCellVolt, 3, kFaultData_MinVolt, kEep_DisLCVoltHTAlarm1, kCheckType_LessThan, bms_dis_low_volt_ht_call},
{kFaultCode_LowCellVolt, 3, kFaultData_MinVolt, kEep_DisLCVoltLTAlarm1, kCheckType_LessThan, bms_dis_low_volt_lt_call},
{kFaultCode_LowTotalVolt, 3, kFaultData_TotalVolt, kEep_DisLTVoltHTAlarm1, kCheckType_LessThan, bms_dis_low_volt_ht_call}, //10
{kFaultCode_LowTotalVolt, 3, kFaultData_TotalVolt, kEep_DisLTVoltLTAlarm1, kCheckType_LessThan, bms_dis_low_volt_lt_call}, //11
{kFaultCode_LowCellVolt, 3, kFaultData_MinVolt, kEep_DisLCVoltHTAlarm1, kCheckType_LessThan, bms_dis_low_volt_ht_call}, //12
{kFaultCode_LowCellVolt, 3, kFaultData_MinVolt, kEep_DisLCVoltLTAlarm1, kCheckType_LessThan, bms_dis_low_volt_lt_call}, //13
{kFaultCode_HighCellVolt, 3, kFaultData_MaxVolt, kEep_DisHCVoltAlarm1, kCheckType_MoreThan, NULL},
{kFaultCode_HighCur, 3, kFaultData_Current, kEep_DisOverCurAlarm1, kCheckType_MoreThan, bms_dis_high_cur_call},
{kFaultCode_HighCellTemp, 3, kFaultData_MaxTemp, kEep_DisHighTempAlarm1, kCheckType_MoreThan, NULL},
@ -104,10 +104,10 @@ const FaultProp chg_fault_array[] =
{kFaultCode_MSComm, 1, kFaultData_MScomm, kEep_MSCommAlarm1, kCheckType_MoreThan | FAULT_RELAY_BOTH_OFF, NULL},
{kFaultCode_CmdTimeout, 1, kFaultData_CmdHeart, kEep_CmdTimeoutAlarm, kCheckType_MoreThan | FAULT_RELAY_BOTH_OFF, NULL},
{kFaultCode_HighTotalVolt, 3, kFaultData_TotalVolt, kEep_ChgHTVoltHTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_ht_call},
{kFaultCode_HighTotalVolt, 3, kFaultData_TotalVolt, kEep_ChgHTVoltLTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_lt_call},
{kFaultCode_HighCellVolt, 3, kFaultData_MaxVolt, kEep_ChgHCVoltHTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_ht_call},
{kFaultCode_HighCellVolt, 3, kFaultData_MaxVolt, kEep_ChgHCVoltLTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_lt_call},
{kFaultCode_HighTotalVolt, 3, kFaultData_TotalVolt, kEep_ChgHTVoltHTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_ht_call}, //10
{kFaultCode_HighTotalVolt, 3, kFaultData_TotalVolt, kEep_ChgHTVoltLTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_lt_call}, //11
{kFaultCode_HighCellVolt, 3, kFaultData_MaxVolt, kEep_ChgHCVoltHTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_ht_call}, //12
{kFaultCode_HighCellVolt, 3, kFaultData_MaxVolt, kEep_ChgHCVoltLTAlarm1, kCheckType_MoreThan, bms_chg_high_volt_lt_call}, //13
{kFaultCode_LowCellVolt, 3, kFaultData_MinVolt, kEep_ChgLCVoltAlarm1, kCheckType_LessThan, NULL},
{kFaultCode_HighCur, 3, kFaultData_Current, kEep_ChgOverCurAlarm1, kCheckType_MoreThan, bms_chg_high_cur_call},
{kFaultCode_HighCellTemp, 3, kFaultData_MaxTemp, kEep_ChgHighTempAlarm1, kCheckType_MoreThan, NULL},

View File

@ -5,9 +5,27 @@
#include "statistic_manager.h"
#include "table_comm.h"
#include "kit_time.h"
#include "hv_adc_manager.h"
uint32_t statistic_data[kStatisticData_End];
typedef struct {
uint8_t bmu_num;
uint16_t min_voltage;
uint16_t max_voltage;
} voltage_range_t;
// 高压堆叠范围对照表所有电压值已×10
const voltage_range_t voltage_ranges[] = {
{1, 490, 550},
{2, 980, 1100},
{3, 1470, 1650},
{4, 1960, 2200},
{5, 2450, 2750},
{6, 2940, 3300},
{7, 3430, 3850},
{8, 3920, 4400}
};
uint32_t bms_get_statistic_data(StatisticData idx)
{
@ -220,10 +238,34 @@ static void bms_statistic_cell_temp(void)
kit_time_dly_ms(2);
}
void update_bmu_number()
{
if (bms_get_bmu_num() <= 8)
{
uint16_t acc_volt = bms_get_high_volt(kHvType_Bat);
for (uint8_t i = 0; i < sizeof(voltage_ranges)/sizeof(voltage_ranges[0]); i++)
{
if (acc_volt >= voltage_ranges[i].min_voltage && acc_volt <= voltage_ranges[i].max_voltage)
{
if (bms_get_bmu_num() != voltage_ranges[i].bmu_num)
{
bms_set_bmu_num(voltage_ranges[i].bmu_num);
bms_set_bmu_volt_num(voltage_ranges[i].bmu_num);
bms_set_bmu_temp_num(voltage_ranges[i].bmu_num);
break;
}
}
}
}
}
void bms_poll_statistic(uint32_t base_time)
{
bms_statistic_cell_volt();
bms_statistic_cell_temp();
update_bmu_number();
}

View File

@ -10,15 +10,15 @@
<TargetName>stm32f407</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pArmCC>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pArmCC>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pCCUsed>
<pArmCC>5050106::V5.05 update 1 (build 106)::ARMCC</pArmCC>
<pCCUsed>5050106::V5.05 update 1 (build 106)::ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F407ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -1145,8 +1145,8 @@
<TargetCommonOption>
<Device>STM32F407VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>

File diff suppressed because it is too large Load Diff

View File

@ -127,11 +127,13 @@ uint16_t bcu_total_msg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
//12 在线从机总数
READ_FC03_F04_ITEM(12, bms_get_bmu_online_num());
//13 电池总数
READ_FC03_F04_ITEM(13, get_eeprom_data(kEep_CellNum, kEepromDataType_Full));
//READ_FC03_F04_ITEM(13, get_eeprom_data(kEep_CellNum, kEepromDataType_Full));
READ_FC03_F04_ITEM(13, bms_get_cell_num());
//14 在线电池总数
READ_FC03_F04_ITEM(14, bms_get_statistic_data(kStatisticData_OnlineCellNum));
//15 温感总数
READ_FC03_F04_ITEM(15, get_eeprom_data(kEep_TempNum, kEepromDataType_Full));
//READ_FC03_F04_ITEM(15, get_eeprom_data(kEep_TempNum, kEepromDataType_Full));
READ_FC03_F04_ITEM(15, bms_get_temp_num());
//16 在线温感总数
READ_FC03_F04_ITEM(16, bms_get_statistic_data(kStatisticData_OnlineTempNum));
//17 最大允许放电电流

View File

@ -10,15 +10,15 @@
<TargetName>stm32f407</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pArmCC>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pArmCC>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pCCUsed>
<pArmCC>5050106::V5.05 update 1 (build 106)::ARMCC</pArmCC>
<pCCUsed>5050106::V5.05 update 1 (build 106)::ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F407ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -81,7 +81,7 @@
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>1</RunUserProg1>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name>fromelf --m32combined --output=BxE1C_BOOT.s19 .\Objects\BxE1C_BOOT.axf</UserProg1Name>
<UserProg2Name></UserProg2Name>

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +1,45 @@
[BREAKPOINTS]
ForceImpTypeAny = 0
FForceImpTypeAny = 0
ShowInfoWin = 1
EnableFlashBP = 2
BPDuringExecution = 0
orceImpTypeAny = 0
[CFI]
CFISize = 0x00
CCFISize = 0x00
CFIAddr = 0x00
FISize = 0x00
[CPU]
MonModeVTableAddr = 0xFFFFFFFF
MOverrideMemMap = 0
AllowSimulation = 1
ScriptFile=""
onModeVTableAddr = 0xFFFFFFFF
MonModeDebug = 0
MaxNumAPs = 0
LowPowerHandlingMode = 0
OverrideMemMap = 0
AllowSimulation = 1
ScriptFile=""
[FLASH]
CacheExcludeSize = 0x00
CCacheExcludeSize = 0x00
CacheExcludeAddr = 0x00
MinNumBytesFlashDL = 0
SkipProgOnCRCMatch = 1
VerifyDownload = 1
AllowCaching = 1
EnableFlashDL = 2
Override = 0
Device="ARM7"
Override = 1
Device="Unspecified"
acheExcludeSize = 0x00
[GENERAL]
WorkRAMSize = 0x00
WWorkRAMSize = 0x00
WorkRAMAddr = 0x00
RAMUsageLimit = 0x00
orkRAMSize = 0x00
[SWO]
SWOLogFile=""
SSWOLogFile=""
WOLogFile=""
[MEM]
RdOverrideOrMask = 0x00
RRdOverrideOrMask = 0x00
RdOverrideAndMask = 0xFFFFFFFF
RdOverrideAddr = 0xFFFFFFFF
WrOverrideOrMask = 0x00
WrOverrideAndMask = 0xFFFFFFFF
WrOverrideAddr = 0xFFFFFFFF
dOverrideOrMask = 0x00