Merge branch 'wk' into gary

This commit is contained in:
ahu_gq 2025-03-02 15:56:25 +08:00
commit 61d1af0b1d
26 changed files with 1143736 additions and 427314 deletions

2
.gitignore vendored
View File

@ -5,6 +5,8 @@
*.rpt *.rpt
*.plg *.plg
*.uvgui.* *.uvgui.*
*.uvprojx
*.uv*
*.crf *.crf
*.map *.map
*.hex *.hex

View File

@ -102,8 +102,8 @@ void bmu_config_init(void)
drv_gpio_set_pin_status(kGpioType_SP1_Cs_En2, kGpioStatus_Low); drv_gpio_set_pin_status(kGpioType_SP1_Cs_En2, kGpioStatus_Low);
//drv_gpio_set_pin_status(kGpioType_SP1_Cs_En1, kGpioStatus_Low); //drv_gpio_set_pin_status(kGpioType_SP1_Cs_En1, kGpioStatus_Low);
//bmu_data.bmu_num = get_eeprom_data(kEep_DevAddr_SlaverNum, kEepromDataType_Low); bmu_data.bmu_num = get_eeprom_data(kEep_DevAddr_SlaverNum, kEepromDataType_Low);
bmu_data.bmu_num = 2; //bmu_data.bmu_num = 1;
if (bmu_data.bmu_num > BMU_MAX_NUM || bmu_data.bmu_num == 0) if (bmu_data.bmu_num > BMU_MAX_NUM || bmu_data.bmu_num == 0)
{ {
bmu_data.bmu_num = BMU_MAX_NUM; bmu_data.bmu_num = BMU_MAX_NUM;
@ -112,11 +112,11 @@ void bmu_config_init(void)
bmu_data.bmu_ic_num = get_eeprom_data(kEep_AfeNum_CellNum, kEepromDataType_High); bmu_data.bmu_ic_num = get_eeprom_data(kEep_AfeNum_CellNum, kEepromDataType_High);
bmu_data.total_ic_num = bmu_data.bmu_num * bmu_data.bmu_ic_num; bmu_data.total_ic_num = bmu_data.bmu_num * bmu_data.bmu_ic_num;
bmu_data.ic = bsp_adbms1818_global(); bmu_data.ic = bsp_adbms1818_global();
//bmu_data.total_cell_num = get_eeprom_data(kEep_CellNum, kEepromDataType_Full); bmu_data.total_cell_num = get_eeprom_data(kEep_CellNum, kEepromDataType_Full);
//bmu_data.total_temp_num = get_eeprom_data(kEep_TempNum, kEepromDataType_Full); bmu_data.total_temp_num = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
bmu_data.total_cell_num = 32; //bmu_data.total_cell_num = 16;
bmu_data.total_temp_num = 18; //bmu_data.total_temp_num = 8;
//set num from hmi =>adapt num for furture //set num from hmi =>adapt num for furture
cell_num = bmu_data.total_cell_num / bmu_data.bmu_num; cell_num = bmu_data.total_cell_num / bmu_data.bmu_num;
@ -240,14 +240,21 @@ void bmu_vlot_breakline_check()
} }
static int tempJudge_cnt[26][9] = {0};
//static int tempCellErr_cnt = 0;
//@wkun the here can add temp line break or connect //@wkun the here can add temp line break or connect
void bmu_temp_breakline_check() void bmu_temp_breakline_check(int value, int bmuIdx, int tempIdx)
{ {
//核心逻辑是通过每个bmu中的温度是否大于60000来确定温感排线是否有问题通过for循环然后将故障塞入kFaultCode_TempCable对应的故障中 //核心逻辑是通过每个bmu中的温度是否大于60000来确定温感排线是否有问题通过for循环然后将故障塞入kFaultCode_TempCable对应的故障中
//bms_get_bmu_fault_bit(kBmuFaultBit_TempCable)将这个接口中的数据如果有则置1否则为0 //bms_get_bmu_fault_bit(kBmuFaultBit_TempCable)将这个接口中的数据如果有则置1否则为0
if (value > 6000)
{
tempJudge_cnt[bmuIdx][tempIdx]++;
}
if(tempJudge_cnt[bmuIdx][tempIdx] > 1)
{
//bms_set_bmu_fault_bit(kBmuFaultBit_TempCable, 1);
}
} }
@ -361,7 +368,7 @@ static void bmu_statistic_cell_temp(uint16_t bmuIdx)
void bmu_data_handler(uint32_t base_time) void bmu_data_handler(uint32_t base_time)
{ {
uint8_t bmuIdx = 0,cellIdx = 0,_cellIdx = 0,_bmuIdx = 0,_ntcIdx = 0; uint8_t bmuIdx = 0,cellIdx = 0,_cellIdx = 0,_bmuIdx = 0,_ntcIdx = 0;
uint16_t current = 0,load = 0; uint16_t current = 0,load = 0, tempJudge = 0;
//calc cell volt //calc cell volt
for(bmuIdx = 0;bmuIdx < bmu_data.total_ic_num;bmuIdx++) for(bmuIdx = 0;bmuIdx < bmu_data.total_ic_num;bmuIdx++)
{ {
@ -388,7 +395,9 @@ void bmu_data_handler(uint32_t base_time)
current = 1; current = 1;
} }
load = (bmu_data.ic[bmuIdx].aux.a_codes[_ntcIdx] / 10) * 1000 / current; //修订索引错误 load = (bmu_data.ic[bmuIdx].aux.a_codes[_ntcIdx] / 10) * 1000 / current; //修订索引错误
bmu_data.bmu_unit[bmuIdx].cell_temp_buf[cellIdx] = (bms_get_linear_temp(load, kNtcType_CWFH708_H713) - 500) / 10; tempJudge = (bms_get_linear_temp(load, kNtcType_CWFH708_H713) - 500) / 10;
bmu_data.bmu_unit[bmuIdx].cell_temp_buf[cellIdx] = tempJudge;
bmu_temp_breakline_check(tempJudge, bmuIdx, _ntcIdx);
} }
//统计温度 //统计温度
bmu_statistic_cell_temp(bmuIdx); bmu_statistic_cell_temp(bmuIdx);
@ -396,7 +405,6 @@ void bmu_data_handler(uint32_t base_time)
//alarm monitor //alarm monitor
//bmu_comm_offline_check(base_time); //bmu_comm_offline_check(base_time);
bmu_vlot_breakline_check(); bmu_vlot_breakline_check();
bmu_temp_breakline_check();
} }
@ -437,10 +445,15 @@ void bms_poll_bmu(uint32_t base_time)
run_command(6,bmu_data.bmu_num*bmu_data.bmu_ic_num); run_command(6,bmu_data.bmu_num*bmu_data.bmu_ic_num);
bmu_data_handler(base_time); bmu_data_handler(base_time);
//温感检测是否脱落加上了防抖需要两次大于6000才设置温感排线错误温感排线错误显示的有点慢
//温感的值最开始全是大于6000的第二次才是采集值
memset(tempJudge_cnt, 0, sizeof(tempJudge_cnt));
//2-5 @wangk add this line bcu statistic data is show //2-5 @wangk add this line bcu statistic data is show
bms_poll_statistic(0); bms_poll_statistic(0);
//2-6 @wangk //2-6 @wangk
bms_poll_run_status(base_time); bms_poll_run_status(base_time);
//2-10 @wangk
task_dido_ctrl_handle(1000);
} }

View File

@ -19,6 +19,10 @@ extern "C" {
//2-6 //2-6
#include "statistic_manager.h" #include "statistic_manager.h"
#include "run_status.h" #include "run_status.h"
#include "logic_ctrl.h"
#include "bmu_manager.h"
#include "string.h"
#include "stdio.h"
typedef struct typedef struct
{ {

View File

@ -195,7 +195,8 @@ void bms_force_crtl_do_status(uint8_t idx, DoCtrlStatus status)
if(status < kDoCtrlStatus_None) if(status < kDoCtrlStatus_None)
{ {
do_item.tick[idx] = RELAY_CTRL_NO_DLY; do_item.tick[idx] = RELAY_CTRL_NO_DLY;
do_item.ctrl_status[idx] = (DoStatus)(status + 2); //@wagnk2-17这里原本的status加了2取消了
do_item.ctrl_status[idx] = (DoStatus)(status);
} }
else else
{ {
@ -225,7 +226,7 @@ const GpioStatus relay_status_to_ctrl[kDoStatus_End] ={kGpioStatus_Low, kGpioSta
void bms_poll_di_do(uint32_t base_time) void bms_poll_di_do(uint32_t base_time)
{ {
uint32_t i; uint32_t i,j = 0;
DoStatus rly_st; DoStatus rly_st;
if(do_item.bmsCircuitCtrl != NULL) if(do_item.bmsCircuitCtrl != NULL)
@ -247,6 +248,10 @@ void bms_poll_di_do(uint32_t base_time)
do_item.tick[i] = 0; do_item.tick[i] = 0;
rly_st = do_item.ctrl_status[i]; rly_st = do_item.ctrl_status[i];
do_item.actual_status[i] = rly_st; do_item.actual_status[i] = rly_st;
if((relay_status_to_ctrl[rly_st] == kGpioStatus_Low) && (i == 1))
{
j = 1;
}
drv_gpio_set_pin_status(do_item.relay_start_io + i, relay_status_to_ctrl[rly_st]); drv_gpio_set_pin_status(do_item.relay_start_io + i, relay_status_to_ctrl[rly_st]);
} }
else else

View File

@ -37,9 +37,9 @@ typedef enum
{ {
kDoType_Start = 0, kDoType_Start = 0,
kDoType_Unused = kDoType_Start, kDoType_Unused = kDoType_Start,
kDoType_PreChg,
kDoType_Chg, kDoType_Chg,
kDoType_Dis, kDoType_Dis,//3
kDoType_PreChg, //3
kDoType_Positive, //4 kDoType_Positive, //4
kDoType_Negative,//5 kDoType_Negative,//5
kDoType_Cool, kDoType_Cool,
@ -84,6 +84,8 @@ typedef enum
kDiType_Start = 0, kDiType_Start = 0,
kDiType_Unused= kDiType_Start, kDiType_Unused= kDiType_Start,
kDiType_FireAlarm1, //消防1 kDiType_FireAlarm1, //消防1
kDiType_FireAlarm2,
kDiType_FireAlarm3,
kDiType_EmergStop1, //急停 kDiType_EmergStop1, //急停
kDiType_Do1Feedback, kDiType_Do1Feedback,
kDiType_Do2Feedback, kDiType_Do2Feedback,

View File

@ -14,7 +14,8 @@
#include "drv_ads8688.h" #include "drv_ads8688.h"
#define CUR_FILTER_ENABLE (0u) #define CUR_FILTER_ENABLE (0u)
#define ADCIC_SAMPLE_CNT (4u) #define ADCIC_SAMPLE_CNT (20u)
#define MCP3208_SAMPLE_CNT (10u)
ADS8688_STATIC_INIT(ads8688, kSpiDev_2, kGpioType_ADC_Cs); ADS8688_STATIC_INIT(ads8688, kSpiDev_2, kGpioType_ADC_Cs);
@ -83,7 +84,7 @@ void bms_init_current(void)
cur_item.shunt_volt = get_eeprom_data(kEep_ChgCurDir_ShuntRatedVolt, kEepromDataType_Low); cur_item.shunt_volt = get_eeprom_data(kEep_ChgCurDir_ShuntRatedVolt, kEepromDataType_Low);
cur_item.prop[0].filter = cur_item.prop[1].filter = 0; cur_item.prop[0].filter = cur_item.prop[1].filter = 0;
// 上位机下发时缩小10倍 // 上位机下发时缩小10倍,分流器量程 乘了 10
cur_item.prop[0].scale = get_eeprom_data(kEep_CurSensor2_1Range, kEepromDataType_Low) * 10; cur_item.prop[0].scale = get_eeprom_data(kEep_CurSensor2_1Range, kEepromDataType_Low) * 10;
cur_item.prop[1].scale = get_eeprom_data(kEep_CurSensor2_1Range, kEepromDataType_High) * 10; cur_item.prop[1].scale = get_eeprom_data(kEep_CurSensor2_1Range, kEepromDataType_High) * 10;
@ -195,8 +196,8 @@ int16_t bms_caculate_current(uint32_t base_time)
{ {
case kCurSensor_Shunt: case kCurSensor_Shunt:
// 分流器 cur_hv_item.cur_volt_avg / cur_prop.shunt_volt * cur_prop.cur_scale; // 分流器 cur_hv_item.cur_volt_avg / cur_prop.shunt_volt * cur_prop.cur_scale;
//current = (int32_t)cur_hv_item.value[kAdIc_Cur] * prop->scale / cur_item.shunt_volt; current = (int32_t)cur_hv_item.value[kAdIc_Cur] * prop->scale / cur_item.shunt_volt;
current = HighResCurTrans(cur_hv_item.value[kAdIc_Cur]); //current = HighResCurTrans(cur_hv_item.value[kAdIc_Cur]);
break; break;
case kCurSensor_SigHall: case kCurSensor_SigHall:
// 霍尔电流 // 霍尔电流
@ -229,8 +230,8 @@ int16_t bms_caculate_current(uint32_t base_time)
break; break;
} }
} }
//测试用 SFJ 7.30 //测试用 SFJ 7.30,2-18,注释
current = volval * 100 / 10; //current = volval * 100 / 10;
// 电流方向 // 电流方向
current *= prop->dir; current *= prop->dir;
@ -282,26 +283,70 @@ uint32_t HighVolTrans(uint16_t voldata)
AdjustValue adIc_adjust_value[kAdIc_End]; AdjustValue adIc_adjust_value[kAdIc_End];
uint16_t adIc_reg_map[kAdIc_End] = {MAN_Ch_0, MAN_Ch_1, MAN_Ch_2, MAN_Ch_3, MAN_Ch_4}; uint16_t adIc_reg_map[kAdIc_End] = {MAN_Ch_0, MAN_Ch_1, MAN_Ch_2, MAN_Ch_3, MAN_Ch_4};
uint16_t zero_calc(uint16_t value)
{
if(value > 32700 && value < 32788)
{
return 0;
}
else if(value < 20)
{
return 0;
}
else
{
return value;
}
}
void get_ad_sample(void) void get_ad_sample(void)
{ {
static uint16_t outputdata[16] = {0}; static uint16_t outputdata[16] = {0};
int32_t i =0; int32_t i =0,dir = 1;
uint16_t ad =0; //uint16_t ad =0;
uint16_t ad = 0,value = 0;
#if ADC_AUTO_MODE
//auto scan mode //auto scan mode
drv_enter_auto_rst_mode_Data(outputdata, 6); drv_enter_auto_rst_mode_Data(outputdata, 6);
#else
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_0);
i += 1;
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_1);
i += 1;
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_2);
i += 1;
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_3);
i += 1;
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_4);
i += 1;
outputdata[i] = drv_get_ads8688_ch_data(MAN_Ch_5);
i += 1;
#endif
for (i = 0; i < kAdIc_End; i++) for (i = 0; i < kAdIc_End; i++)
{ {
//ad = drv_get_ads8688_ch_data(adIc_reg_map[i]); //ad = drv_get_ads8688_ch_data(adIc_reg_map[i]);
//0漂处理
if(i == kAdIc_Cur)
{
outputdata[i] = zero_calc(outputdata[i]);
}
cur_hv_item.ad_buf[i][cur_hv_item.ad_buf_pos[i]++] = drv_ads8688_value(outputdata[i]); cur_hv_item.ad_buf[i][cur_hv_item.ad_buf_pos[i]++] = drv_ads8688_value(outputdata[i]);
ad = cur_hv_item.ad_avg[i] = kit_get_int32_avg_filter_max_min(cur_hv_item.ad_buf[i], ADCIC_SAMPLE_CNT); cur_hv_item.ad_avg[i] = kit_get_int32_avg_filter_max_min(cur_hv_item.ad_buf[i], ADCIC_SAMPLE_CNT);
if(cur_hv_item.ad_avg[i] < 0)
{
dir = -1;
}
ad = KIT_ABS(cur_hv_item.ad_avg[i]);
if (i == kAdIc_HvIso) if (i == kAdIc_HvIso)
{ {
//cur_hv_item.value[i] = HighVolTrans2(ad)/100; //cur_hv_item.value[i] = HighVolTrans2(ad)/100;
bms_set_iso_volt_ad(kIsoVolt_Other, ad); bms_set_iso_volt_ad(kIsoVolt_Other, dir * ad);
} }
if(i == kAdIc_HvIsoNagtive) if(i == kAdIc_HvIsoNagtive)
{ {
@ -309,24 +354,26 @@ void get_ad_sample(void)
} }
if (i == kAdIc_HvBat) if (i == kAdIc_HvBat)
{ {
cur_hv_item.value[i] = (ad / 100) * 512 * 10 / (0x01 << 16); //单位是mv cur_hv_item.value[i] = dir * (376 * ad * 512 * 10 / (0x01 << 15)) / 100; //单位是mv
bms_set_iso_volt_ad(kIsoVolt_TotalVolt, cur_hv_item.value[i]); bms_set_iso_volt_ad(kIsoVolt_TotalVolt, cur_hv_item.value[i]);
} }
if(i == kAdIc_Hv1) if(i == kAdIc_Hv1)
{ {
cur_hv_item.value[i] = (ad / 100) * 512 * 10 / (0x01 << 16); //单位是mv cur_hv_item.value[i] = dir * (376 * ad * 512 * 10 / (0x01 << 15)) / 100; //单位是mv
} }
if(i == kAdIc_Cur) if(i == kAdIc_Cur)
{ {
ad = ad - adIc_adjust_value[i].zero; //ad = ad - adIc_adjust_value[i].zero;
ad = (10 * ad / 82000) * 512 * 1000/ (0x01 << 16); //单位是mv
//ad = (ad * 5120 * 10 / (0x01 << 15)) / 82; //单位是mv
ad = (ad * 2560 * 10 * 100 / (0x01 << 15)) / 82; //单位是0.1 mv
// 防止eeprom中没有设置电压校准系数 // 防止eeprom中没有设置电压校准系数
if (get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) <= 900 || get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) >= 1100) if (get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) <= 900 || get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) >= 1100)
{ {
bsp_eeprom_save_data(kEep_Volt1CalFactor, 1000, kEepromDataType_Full); bsp_eeprom_save_data(kEep_Volt1CalFactor, 1000, kEepromDataType_Full);
} }
cur_hv_item.value[i] = ad / 1000 * adIc_adjust_value[i].rate *get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) / 1000;//转为V cur_hv_item.value[i] = ad * dir;/// 1000 * adIc_adjust_value[i].rate *get_eeprom_data(kEep_Volt1CalFactor, kEepromDataType_Full) / 1000;//转为V
} }
if (cur_hv_item.ad_buf_pos[i] >= ADCIC_SAMPLE_CNT) if (cur_hv_item.ad_buf_pos[i] >= ADCIC_SAMPLE_CNT)
@ -432,10 +479,12 @@ const uint32_t adIc_default_rate[kAdIc_End] = {1, 1, 1, 1, 1};
// //
void bms_init_cur_hv(void) void bms_init_cur_hv(void)
{ {
static uint8_t errcnt = 0;
uint32_t i = 0, cnt = 30; uint32_t i = 0, cnt = 30;
#ifdef ADS_8688_EN #ifdef ADS_8688_EN
while(drv_ads8688_Init()) while(drv_ads8688_Init() && errcnt < 30)
{ {
errcnt++;
OSTimeDly(20); OSTimeDly(20);
} }

View File

@ -13,10 +13,8 @@ extern "C" {
typedef enum typedef enum
{ {
kHvType_Iso,
kHvType_Bat,
kHvType_Hv1, kHvType_Hv1,
kHvType_Hv2, kHvType_Bat,
kHvType_End, kHvType_End,
}HvType; }HvType;

View File

@ -17,15 +17,18 @@ DiParamItem di_param_item[kDiType_End];
//辅助触点1 //辅助触点1
//di_signal->di_item.status, di->di_iteml.type
void ord_di_do_feedback_func(uint32_t base_time, DiStatus di_signal, DiType di) void ord_di_do_feedback_func(uint32_t base_time, DiStatus di_signal, DiType di)
{ {
if(di < kDiType_End) if(di < kDiType_End)
{ {
if(bms_get_do_status_by_idx(di - kDiType_Do1Feedback) != di_signal) if(bms_get_do_status_by_idx(di - kDiType_Do1Feedback) != di_signal)
{ {
di_param_item[di].dly += base_time; //I don't know what's the meaning of this line.Whatever I change the 5000 to what , it is always enter the " if " and set the fault level.
//di_param_item[di].dly += base_time;
if(di_param_item[di].dly >= 5000) if(di_param_item[di].dly >= 5000)
{ {
//这里会写进错误--反馈异常,这里的一级代表三级错误
bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_First, kFaultHandle_AlarmIdx); bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_First, kFaultHandle_AlarmIdx);
} }
} }
@ -93,6 +96,7 @@ void ord_di_breaker1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{ {
if((di < kDiType_End) && (di_signal == kDiStatus_Trigger)) if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
{ {
//这里会写进错误--反馈异常,这里的三级代表一级错误
di_param_item[di].dly += base_time; di_param_item[di].dly += base_time;
bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_Third, kFaultHandle_CutNoRelIdx); bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
} }

View File

@ -92,7 +92,7 @@ bool logic_adhesion_check(uint32_t base_time, DoType type)
void logic_open_check(uint32_t base_time) void logic_open_check(uint32_t base_time)
{ {
uint16_t tv, hv, rate; uint16_t tv, hv, rate;
DoErrSrc do_err_src = bms_get_do_err_src(kDoType_Positive); DoErrSrc do_err_src = bms_get_do_err_src(kDoType_Chg);
FaultLevel fault = kFaultLevel_Normal; FaultLevel fault = kFaultLevel_Normal;
static uint16_t dly; static uint16_t dly;
@ -161,8 +161,8 @@ void logic_same_circuit_ctrl(uint32_t base_time)
//kEep_IsSoftReset高低只能清楚一个否则断电下带无法保存0 //kEep_IsSoftReset高低只能清楚一个否则断电下带无法保存0
if(((bms_get_run_status() != kRunStatus_Init) && (bms_get_circuit_cmd_status() == kCircuitStatus_On)) || (dly >= 10000)) if(((bms_get_run_status() != kRunStatus_Init) && (bms_get_circuit_cmd_status() == kCircuitStatus_On)) || (dly >= 10000))
{ {
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); bms_crtl_do_status(kDoType_Chg, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_On, 100);
dly = 0; dly = 0;
status = kDoLogicStatus_On; status = kDoLogicStatus_On;
} }
@ -177,7 +177,7 @@ void logic_same_circuit_ctrl(uint32_t base_time)
//增加init状态防止预充中反复检测粘连 建议增加多次检测 //增加init状态防止预充中反复检测粘连 建议增加多次检测
//Gary 2024-07-25 连续粘连3秒才报粘连故障 //Gary 2024-07-25 连续粘连3秒才报粘连故障
dly += base_time; dly += base_time;
if(logic_adhesion_check(base_time, kDoType_Positive) == true) if(logic_adhesion_check(base_time, kDoType_Chg) == true)
{ {
dly = 0; dly = 0;
status = kDoLogicStatus_Off; status = kDoLogicStatus_Off;
@ -189,22 +189,22 @@ void logic_same_circuit_ctrl(uint32_t base_time)
if (prechg_max_cnt == 0) //读取配置:不预充 if (prechg_max_cnt == 0) //读取配置:不预充
{ {
status = kDoLogicStatus_On; status = kDoLogicStatus_On;
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100); bms_crtl_do_status(kDoType_Chg, kDoCtrlStatus_On, 100);
} }
else //读取配置:预充 else //读取配置:预充
{ {
if (prechg_cnt++ < prechg_max_cnt) //判断预充次数 if (prechg_cnt++ < prechg_max_cnt) //判断预充次数
{ {
status = kDoLogicStatus_Prechg; status = kDoLogicStatus_Prechg;
//bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); //闭合总正继电器 //bms_crtl_do_status(kDoType_Chg, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); //闭合总正继电器
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_On, 100); bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_On, 100);
} }
else else
{ {
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_Off, 100); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_Off, 100);
bms_set_fault_level(kFaultCode_PreChg, kFaultLevel_Third, kFaultHandle_CutNoRelIdx); bms_set_fault_level(kFaultCode_PreChg, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
} }
} }
@ -217,7 +217,7 @@ void logic_same_circuit_ctrl(uint32_t base_time)
prechg_cnt = 0; prechg_cnt = 0;
status = kDoLogicStatus_Off; status = kDoLogicStatus_Off;
bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY); bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_Off, 100); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_Off, 100);
} }
else if (dly >= prechg_time)//预充超时 else if (dly >= prechg_time)//预充超时
{ {
@ -237,7 +237,7 @@ void logic_same_circuit_ctrl(uint32_t base_time)
dly = 0; dly = 0;
prechg_cnt = 0; prechg_cnt = 0;
status = kDoLogicStatus_On; status = kDoLogicStatus_On;
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); //闭合总正继电器 bms_crtl_do_status(kDoType_Chg, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY); //闭合总正继电器
bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_Off, 500); //延时500ms断开预充继电器 bms_crtl_do_status(kDoType_PreChg, kDoCtrlStatus_Off, 500); //延时500ms断开预充继电器
} }
} }
@ -271,8 +271,8 @@ void logic_same_circuit_ctrl(uint32_t base_time)
{ {
dly = 0; dly = 0;
status = kDoLogicStatus_WaitAdhesion; status = kDoLogicStatus_WaitAdhesion;
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY); bms_crtl_do_status(kDoType_Chg, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_Off, 100); bms_crtl_do_status(kDoType_Dis, kDoCtrlStatus_Off, 100);
} }
break; break;
case kDoLogicStatus_WaitAdhesion: case kDoLogicStatus_WaitAdhesion:
@ -296,8 +296,8 @@ void logic_same_circuit_poll(uint32_t base_time, uint8_t idx)
CircuitStatus circuit_st = kCircuitStatus_On; CircuitStatus circuit_st = kCircuitStatus_On;
logic_same_circuit_ctrl(base_time); logic_same_circuit_ctrl(base_time);
pos_rly_st = bms_get_do_status_by_type(kDoType_Positive); pos_rly_st = bms_get_do_status_by_type(kDoType_Chg);
neg_rly_st = (bms_is_do_config(kDoType_Negative) == true) ? bms_get_do_status_by_type(kDoType_Negative) : kDoStatus_On; neg_rly_st = (bms_is_do_config(kDoType_Dis) == true) ? bms_get_do_status_by_type(kDoType_Dis) : kDoStatus_On;
//neg_rly_st = kDoStatus_On; //neg_rly_st = kDoStatus_On;
if(((pos_rly_st != kDoStatus_On) && (pos_rly_st != kDoStatus_ForceOn)) if(((pos_rly_st != kDoStatus_On) && (pos_rly_st != kDoStatus_ForceOn))

View File

@ -146,8 +146,8 @@ uint16_t soh_init(uint16_t cycle, uint32_t dis_cap, uint32_t charge_cap)
{ {
uint16_t soh_loss1 = 0; //充放电次数计算出的SOH损耗百分比 uint16_t soh_loss1 = 0; //充放电次数计算出的SOH损耗百分比
uint16_t soh_loss2 = 0; //累计放电安时计算出的SOH损耗百分比 uint16_t soh_loss2 = 0; //累计放电安时计算出的SOH损耗百分比
uint32_t rated_cap = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full); uint32_t rated_cap = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full); //2800
uint16_t cycle_70 = get_eeprom_data(kEep_SOHSeventyCycle, kEepromDataType_Full); uint16_t cycle_70 = get_eeprom_data(kEep_SOHSeventyCycle, kEepromDataType_Full);//3000
if(cycle <= 10) if(cycle <= 10)
{ {
@ -207,7 +207,7 @@ void cap_data_update(uint16_t base_time)
if (run_status == kRunStatus_Chg) if (run_status == kRunStatus_Chg)
{ {
chg_dly += KIT_SECOND_CONVERT(1); chg_dly += KIT_SECOND_CONVERT(1);
if(chg_dly >= KIT_MINUTE_CONVERT(6)) if(chg_dly >= KIT_MINUTE_CONVERT(6))//
{ {
chg_dly -= KIT_MINUTE_CONVERT(6); chg_dly -= KIT_MINUTE_CONVERT(6);
@ -368,11 +368,11 @@ void soc_exterme_calibrate(int16_t current, uint16_t base_time)
{ {
case kSocAdjustStep_Wait: case kSocAdjustStep_Wait:
avg_volt = bms_get_statistic_data(kStatisticData_AvgVolt); avg_volt = bms_get_statistic_data(kStatisticData_AvgVolt);
total_volt = bms_get_statistic_data(kStatisticData_AccVolt) / 100; total_volt = bms_get_statistic_data(kStatisticData_AccVolt)/ 100;
if (((bms_get_statistic_data(kStatisticData_MinVolt) <= get_eeprom_data(kEep_FullDisVolt, kEepromDataType_Full)) if (((bms_get_statistic_data(kStatisticData_MinVolt) <= get_eeprom_data(kEep_FullDisVolt, kEepromDataType_Full))
&& (avg_volt <= get_eeprom_data(kEep_FullDisAvgVolt, kEepromDataType_Full)) && (avg_volt <= get_eeprom_data(kEep_FullDisAvgVolt, kEepromDataType_Full))
&& (bms_get_ex_data(kExType_CellVolt) == kExStatus_None)) && (bms_get_ex_data(kExType_CellVolt) == kExStatus_None))
|| (total_volt <= get_eeprom_data(kEep_FullDisTotalVolt, kEepromDataType_Full)) || (total_volt <= get_eeprom_data(kEep_FullDisTotalVolt, kEepromDataType_Full)/100)
|| ((sox_item.soc_req_st == kSocStatus_Empty) && (sox_item.is_bsu_adjust == false))) || ((sox_item.soc_req_st == kSocStatus_Empty) && (sox_item.is_bsu_adjust == false)))
{ {
full_dly = 0; full_dly = 0;
@ -469,6 +469,7 @@ void bms_init_soc(void)
//soc = bms_check_pwr_on_ocv(soc); //soc = bms_check_pwr_on_ocv(soc);
sox_item.soc_kEep_99 = true; sox_item.soc_kEep_99 = true;
sox_item.soc_kEep_1 = true; sox_item.soc_kEep_1 = true;
if (soc == 0) if (soc == 0)
{ {
sox_item.soc_kEep_1 = false; sox_item.soc_kEep_1 = false;
@ -504,6 +505,7 @@ void bms_init_soc(void)
sox_item.rated_cap = tmp_64u; sox_item.rated_cap = tmp_64u;
sox_item.soc_1_cap = (SOX_DIS_kEep_SOC * tmp_64u) / SOX_MAX_SOC_VALUE; sox_item.soc_1_cap = (SOX_DIS_kEep_SOC * tmp_64u) / SOX_MAX_SOC_VALUE;
sox_item.soc_99_cap = (SOX_CHG_kEep_SOC * tmp_64u) / SOX_MAX_SOC_VALUE; sox_item.soc_99_cap = (SOX_CHG_kEep_SOC * tmp_64u) / SOX_MAX_SOC_VALUE;
sox_item.calculate_cap = (soc * tmp_64u) / SOX_MAX_SOC_VALUE; sox_item.calculate_cap = (soc * tmp_64u) / SOX_MAX_SOC_VALUE;
sox_item.cycle = get_eeprom_data(kEep_CycleTimes, kEepromDataType_Full); sox_item.cycle = get_eeprom_data(kEep_CycleTimes, kEepromDataType_Full);
@ -559,6 +561,10 @@ void bms_integral_soc(int32_t current, uint16_t base_time)
if(sox_item.adjust_step != kSocAdjustStep_Wait) if(sox_item.adjust_step != kSocAdjustStep_Wait)
return; return;
// /*soc test add 2-19
// current = 168;
// soc_run_calibrate(168, base_time);
// */
tmp_32u = kit_time_get_tick(); tmp_32u = kit_time_get_tick();
integral_time = kit_time_get_interval(sox_item.last_tick, tmp_32u); integral_time = kit_time_get_interval(sox_item.last_tick, tmp_32u);
sox_item.last_tick = tmp_32u; sox_item.last_tick = tmp_32u;
@ -586,13 +592,15 @@ void bms_integral_soc(int32_t current, uint16_t base_time)
{ {
//单位Ams //单位Ams
//公式 (current / 100 * integral_time) * (sox_item.chg_adjust_rate / 100) //公式 (current / 100 * integral_time) * (sox_item.chg_adjust_rate / 100)
tmp_32u = current * integral_time * sox_item.chg_adjust_rate / 10000; //tmp_32u = current * integral_time * sox_item.chg_adjust_rate / 10000;
tmp_32u = current * integral_time * sox_item.chg_adjust_rate / 100;
if (tmp_32u > SOX_MAX_SIGNAL_INTEGRAL) if (tmp_32u > SOX_MAX_SIGNAL_INTEGRAL)
tmp_32u = SOX_MAX_SIGNAL_INTEGRAL; tmp_32u = SOX_MAX_SIGNAL_INTEGRAL;
sox_item.tmp_chg_cap += tmp_32u; sox_item.tmp_chg_cap += tmp_32u;
//单位 kWms //单位 kWms
sox_item.tmp_chg_energy += tmp_32u * total_volt / 10000; //tmp_32少除了100这里应该多除个100--2.20
sox_item.tmp_chg_energy += tmp_32u * total_volt / 1000000;
if(sox_item.calculate_cap < sox_item.rated_cap) if(sox_item.calculate_cap < sox_item.rated_cap)
{ {
@ -632,13 +640,13 @@ void bms_integral_soc(int32_t current, uint16_t base_time)
//放电积分 //放电积分
if(current < 0) if(current < 0)
{ {
tmp_32u = KIT_ABS(current) * integral_time * sox_item.dis_adjust_rate / 10000; tmp_32u = KIT_ABS(current) * integral_time * sox_item.dis_adjust_rate / 100;
if (tmp_32u > SOX_MAX_SIGNAL_INTEGRAL) if (tmp_32u > SOX_MAX_SIGNAL_INTEGRAL)
tmp_32u = SOX_MAX_SIGNAL_INTEGRAL; tmp_32u = SOX_MAX_SIGNAL_INTEGRAL;
sox_item.tmp_dis_cap += tmp_32u; sox_item.tmp_dis_cap += tmp_32u;
//单位 kWms //单位 kWms
sox_item.tmp_dis_energy += tmp_32u * total_volt / 10000; sox_item.tmp_dis_energy += tmp_32u * total_volt / 1000000;
if(sox_item.calculate_cap > 0) if(sox_item.calculate_cap > 0)
{ {

View File

@ -23,26 +23,26 @@ typedef enum
typedef enum typedef enum
{ {
kCumulateData_DayDisTime, kCumulateData_DayDisTime, //0
kCumulateData_DayChgTime, kCumulateData_DayChgTime,
kCumulateData_SigDisTime, kCumulateData_SigDisTime,
kCumulateData_SigDisCap, kCumulateData_SigDisCap,
kCumulateData_SigDisEnergy, kCumulateData_SigDisEnergy,
kCumulateData_SigChgTime, kCumulateData_SigChgTime, //5
kCumulateData_SigChgCap, kCumulateData_SigChgCap,
kCumulateData_SigChgEnergy, kCumulateData_SigChgEnergy,
kCumulateData_DayDisCap, kCumulateData_DayDisCap,
kCumulateData_DayDisEnergy, kCumulateData_DayDisEnergy,
kCumulateData_DayChgCap, kCumulateData_DayChgCap, //10
kCumulateData_DayChgEnergy, kCumulateData_DayChgEnergy,
kCumulateData_AccDisTime, kCumulateData_AccDisTime,
kCumulateData_AccDisCap, kCumulateData_AccDisCap,
kCumulateData_AccDisEnergy, kCumulateData_AccDisEnergy,
kCumulateData_AccChgTime, kCumulateData_AccChgTime,
kCumulateData_AccChgCap, kCumulateData_AccChgCap, //16
kCumulateData_AccChgEnergy, kCumulateData_AccChgEnergy,
kCumulateData_End, kCumulateData_End,
}CumulateData; }CumulateData;

View File

@ -53,7 +53,7 @@ typedef enum
void bms_analyse_chg_sop(uint32_t base_time) void bms_analyse_chg_sop(uint32_t base_time)
{ {
static uint16_t dly = 0; static uint16_t dly = 0;
bool is_forbid_chg; bool is_forbid_chg;// 充电禁止标志
uint16_t fault_cur, end_cur, fault_power, end_power, req_volt, total_volt; uint16_t fault_cur, end_cur, fault_power, end_power, req_volt, total_volt;
uint16_t soc, min_temp, max_temp; uint16_t soc, min_temp, max_temp;
int32_t min_temp_cur, max_temp_cur; int32_t min_temp_cur, max_temp_cur;
@ -61,7 +61,7 @@ void bms_analyse_chg_sop(uint32_t base_time)
soc = bms_get_soc() / 100; soc = bms_get_soc() / 100;
min_temp = (int32_t)bms_get_statistic_data(kStatisticData_MinTemp) /10 - 50; min_temp = (int32_t)bms_get_statistic_data(kStatisticData_MinTemp) /10 - 50;
max_temp = (int32_t)bms_get_statistic_data(kStatisticData_MaxTemp) /10 - 50; max_temp = (int32_t)bms_get_statistic_data(kStatisticData_MaxTemp) /10 - 50;
total_volt = bms_get_statistic_data(kStatisticData_TotalVolt) > 300 ? bms_get_statistic_data(kStatisticData_TotalVolt):300; total_volt = bms_get_statistic_data(kStatisticData_TotalVolt) > 300 ? bms_get_statistic_data(kStatisticData_TotalVolt):300;//534
if(get_eeprom_data(kEep_ChgDisMode_HighVoltStrategy, kEepromDataType_High) == kChgMode_CP) if(get_eeprom_data(kEep_ChgDisMode_HighVoltStrategy, kEepromDataType_High) == kChgMode_CP)
{ {
@ -75,7 +75,7 @@ void bms_analyse_chg_sop(uint32_t base_time)
} }
else else
{ {
end_power = sop_item.rate_data[kSopData_ChgPower]; end_power = sop_item.rate_data[kSopData_ChgPower];//50
end_cur = (uint32_t)sop_item.rate_data[kSopData_ChgPower] * 10000/total_volt; end_cur = (uint32_t)sop_item.rate_data[kSopData_ChgPower] * 10000/total_volt;
} }
} }

View File

@ -59,7 +59,8 @@ void task_100ms_handler(uint32_t base_time)
static uint32_t cout100ms = 0; static uint32_t cout100ms = 0;
cout100ms++; cout100ms++;
bms_poll_iso(base_time); bms_poll_iso(base_time);
//bms_poll_adc(base_time); //bms_poll_adc(); THis was originally commented.
bms_poll_adc(base_time);
bms_poll_statistic(base_time); bms_poll_statistic(base_time);
bms_poll_run_status(base_time); bms_poll_run_status(base_time);
bms_poll_sop(base_time); bms_poll_sop(base_time);
@ -68,7 +69,7 @@ void task_100ms_handler(uint32_t base_time)
} }
GLOBAL_TASK_VARS_CCM(poll_1ms_task, 4, 10, 5000, 400, poll_1ms_task_init, task_1ms_handler, NULL); GLOBAL_TASK_VARS_CCM(poll_1ms_task, 4, 100, 5000, 400, poll_1ms_task_init, task_1ms_handler, NULL);
GLOBAL_TASK_VARS_CCM(poll_100ms_task, 1, 100, 2000, 400, NULL, task_100ms_handler, NULL); GLOBAL_TASK_VARS_CCM(poll_100ms_task, 1, 100, 2000, 400, NULL, task_100ms_handler, NULL);
GLOBAL_TASK_VARS_CCM(poll_10ms_task, 3, 100, 2000, 400, poll_10ms_task_init, task_10ms_handler, NULL); GLOBAL_TASK_VARS_CCM(poll_10ms_task, 3, 100, 2000, 400, poll_10ms_task_init, task_10ms_handler, NULL);
@ -99,35 +100,42 @@ void poll_1ms_task_init(void)
bms_init_gpio(); bms_init_gpio();
bms_init_eeprom(); bms_init_eeprom();
//bms_init_adc(); THis was originally commented.
//bms_init_adc(); //bms_init_adc();
bms_init_tag(); bms_init_tag();
bms_init_run(); bms_init_run();
bms_init_comm(); bms_init_comm();
//2-17 new add
//task_dido_ctrl_handle(1000);
bms_init_di_do(bmsCircuitCtrl, kDoCtrlStrategy_End, doLogicArray); bms_init_di_do(bmsCircuitCtrl, kDoCtrlStrategy_End, doLogicArray);
bsp_create_task(&poll_10ms_task, (uint8_t *)"10ms"); bsp_create_task(&poll_10ms_task, (uint8_t *)"10ms");
KIT_DEBUG_PRINTF("cur_hv init start \r\n"); //KIT_DEBUG_PRINTF("cur_hv init start \r\n");
//debug here is no more run //debug here is no more run
bms_init_cur_hv(); bms_init_cur_hv();
KIT_DEBUG_PRINTF("cur_hv init ok \r\n"); //KIT_DEBUG_PRINTF("cur_hv init ok \r\n");
while(KIT_GET_BIT_32(is_data_ok, BMU_FINISH_BIT) == 0) while(KIT_GET_BIT_32(is_data_ok, BMU_FINISH_BIT) == 0)
{ {
bsp_task_delay_ms(10); bsp_task_delay_ms(10);
} }
//耗时初始化 ≈300ms 确保信号正常 //耗时初始化 ≈300ms 确保信号正常
KIT_DEBUG_PRINTF("signal init start \r\n"); //KIT_DEBUG_PRINTF("signal init start \r\n");
bms_poll_statistic(0); bms_poll_statistic(0);
bms_init_signal(); bms_init_signal();
//刷新信号策略 确保例如常闭等需要立即闭合do输出 //刷新信号策略 确保例如常闭等需要立即闭合do输出
task_dido_ctrl_handle(1000); task_dido_ctrl_handle(1000);
KIT_DEBUG_PRINTF("signal init ok \r\n"); //KIT_DEBUG_PRINTF("signal init ok \r\n");
KIT_SET_BIT_MASK_32(is_data_ok, SIGNAL_FINISH_BIT); KIT_SET_BIT_MASK_32(is_data_ok, SIGNAL_FINISH_BIT);
bsp_create_task(&ord_ctrl_task, (uint8_t *)"ctrl"); bsp_create_task(&ord_ctrl_task, (uint8_t *)"ctrl");
} }
void poll_10ms_task_init(void) void poll_10ms_task_init(void)
@ -146,7 +154,8 @@ void poll_10ms_task_init(void)
drv_misc_cfg_pwr_off_interrupt(APP_CFG_INT_PRIO_PWR_OFF, kPwrOffVolt_2_9, bms_pwr_off_save); drv_misc_cfg_pwr_off_interrupt(APP_CFG_INT_PRIO_PWR_OFF, kPwrOffVolt_2_9, bms_pwr_off_save);
KIT_SET_BIT_MASK_32(is_data_ok, BMU_FINISH_BIT); KIT_SET_BIT_MASK_32(is_data_ok, BMU_FINISH_BIT);
//while(KIT_GET_BIT_32(is_data_ok, SIGNAL_FINISH_BIT) == 0) //next line is originally commented.
while(KIT_GET_BIT_32(is_data_ok, SIGNAL_FINISH_BIT) == 0)
{ {
bsp_task_delay_ms(10); bsp_task_delay_ms(10);
} }
@ -156,7 +165,8 @@ void poll_10ms_task_init(void)
bms_init_sop(); bms_init_sop();
bms_init_iso(); bms_init_iso();
//bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms"); //bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms");,THis was originally commented.
bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms");
bsp_create_task(&bms_poll_bmu_task, (uint8_t *)"100ms"); bsp_create_task(&bms_poll_bmu_task, (uint8_t *)"100ms");
bsp_create_task(&ord_comm_can_task, (uint8_t *)"100ms"); bsp_create_task(&ord_comm_can_task, (uint8_t *)"100ms");
bsp_create_task(&modbus_rtu_task1, (uint8_t *)"inter_modbus"); bsp_create_task(&modbus_rtu_task1, (uint8_t *)"inter_modbus");

File diff suppressed because one or more lines are too long

View File

@ -50,7 +50,7 @@
<InvalidFlash>1</InvalidFlash> <InvalidFlash>1</InvalidFlash>
</TargetStatus> </TargetStatus>
<OutputDirectory>.\Objects\</OutputDirectory> <OutputDirectory>.\Objects\</OutputDirectory>
<OutputName>BCU_APP</OutputName> <OutputName>BCU_APP2</OutputName>
<CreateExecutable>1</CreateExecutable> <CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib> <CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile> <CreateHexFile>1</CreateHexFile>
@ -83,7 +83,7 @@
<AfterMake> <AfterMake>
<RunUserProg1>1</RunUserProg1> <RunUserProg1>1</RunUserProg1>
<RunUserProg2>0</RunUserProg2> <RunUserProg2>0</RunUserProg2>
<UserProg1Name>fromelf --m32combined --output=@L.s19 .\Objects\@L.axf</UserProg1Name> <UserProg1Name>D:\Soft\Setup\Keil\ARM\ARM_Compiler_5.06u7\bin\fromelf.exe --bin -o D:\Code\BMS\BCU\app/BCU_APP2.bin D:\Code\BMS\BCU\app/BCU_APP2.axf"</UserProg1Name>
<UserProg2Name></UserProg2Name> <UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode> <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode> <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
@ -688,6 +688,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\fault_manager.c</FilePath> <FilePath>..\app\fault_manager.c</FilePath>
</File> </File>
<File>
<FileName>ocv_tables.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\ocv_tables.c</FilePath>
</File>
<File> <File>
<FileName>fault_register.c</FileName> <FileName>fault_register.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -733,11 +738,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\logic_same_circuit_ctrl.c</FilePath> <FilePath>..\app\logic_same_circuit_ctrl.c</FilePath>
</File> </File>
<File>
<FileName>ocv_tables.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\ocv_tables.c</FilePath>
</File>
<File> <File>
<FileName>run_status.c</FileName> <FileName>run_status.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -763,16 +763,16 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\statistic_manager.c</FilePath> <FilePath>..\app\statistic_manager.c</FilePath>
</File> </File>
<File>
<FileName>version_manager.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\version_manager.c</FilePath>
</File>
<File> <File>
<FileName>bmu_adbms1818.c</FileName> <FileName>bmu_adbms1818.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\bmu_adbms1818.c</FilePath> <FilePath>..\app\bmu_adbms1818.c</FilePath>
</File> </File>
<File>
<FileName>version_manager.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\version_manager.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -1649,6 +1649,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\fault_manager.c</FilePath> <FilePath>..\app\fault_manager.c</FilePath>
</File> </File>
<File>
<FileName>ocv_tables.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\ocv_tables.c</FilePath>
</File>
<File> <File>
<FileName>fault_register.c</FileName> <FileName>fault_register.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -1694,11 +1699,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\logic_same_circuit_ctrl.c</FilePath> <FilePath>..\app\logic_same_circuit_ctrl.c</FilePath>
</File> </File>
<File>
<FileName>ocv_tables.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\ocv_tables.c</FilePath>
</File>
<File> <File>
<FileName>run_status.c</FileName> <FileName>run_status.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -1724,16 +1724,16 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\statistic_manager.c</FilePath> <FilePath>..\app\statistic_manager.c</FilePath>
</File> </File>
<File>
<FileName>version_manager.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\version_manager.c</FilePath>
</File>
<File> <File>
<FileName>bmu_adbms1818.c</FileName> <FileName>bmu_adbms1818.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\app\bmu_adbms1818.c</FilePath> <FilePath>..\app\bmu_adbms1818.c</FilePath>
</File> </File>
<File>
<FileName>version_manager.c</FileName>
<FileType>1</FileType>
<FilePath>..\app\version_manager.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

File diff suppressed because it is too large Load Diff

View File

@ -106,7 +106,7 @@ uint16_t bcu_total_msg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
//READ_FC03_F04_ITEM(1, test99+=10); //READ_FC03_F04_ITEM(1, test99+=10);
//2 动力电池组总电流 //2 动力电池组总电流
READ_FC03_F04_ITEM(2, bms_get_show_current() + 211); READ_FC03_F04_ITEM(2, bms_get_show_current());
//3 SOC //3 SOC
//READ_FC03_F04_ITEM(3,get_eeprom_data(kEep_SOC,kEepromDataType_Full) / 100); //READ_FC03_F04_ITEM(3,get_eeprom_data(kEep_SOC,kEepromDataType_Full) / 100);
READ_FC03_F04_ITEM(3, bms_get_soc() / 100); READ_FC03_F04_ITEM(3, bms_get_soc() / 100);
@ -117,7 +117,7 @@ uint16_t bcu_total_msg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
//6 额定总压 //6 额定总压
READ_FC03_F04_ITEM(6, get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full)); READ_FC03_F04_ITEM(6, get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full));
//7 额定容量 //7 额定容量
READ_FC03_F04_ITEM(7, get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full)); READ_FC03_F04_ITEM(7, get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full) );
//8 剩余容量 //8 剩余容量
READ_FC03_F04_ITEM(8, (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000); READ_FC03_F04_ITEM(8, (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000);
//9 额定电量 //9 额定电量
@ -714,8 +714,8 @@ uint16_t bcu_total_cfg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
case 3146: // 预充超时时间s case 3146: // 预充超时时间s
data = get_eeprom_data(kEep_PreChgTimeout_Count , (EepromDataType)(1 - (address % 2))); data = get_eeprom_data(kEep_PreChgTimeout_Count , (EepromDataType)(1 - (address % 2)));
break; break;
case 3147: // HV电压比例(% case 3147: // 预充电压比例(%
case 3148: // 预充电压比例(% case 3148: // 预充类型
data = get_eeprom_data(kEep_PreChgVoltType_Rate , (EepromDataType)(1 - (address % 2))); data = get_eeprom_data(kEep_PreChgVoltType_Rate , (EepromDataType)(1 - (address % 2)));
break; break;
case 3149: // 系统时间s case 3149: // 系统时间s
@ -1271,6 +1271,18 @@ BspMdExCode bcu_modbus_485_0x10_fun(uint16_t start_addr, uint16_t reg_num, uint8
bcu_data_set_0x06_msg(start_addr + i, data); bcu_data_set_0x06_msg(start_addr + i, data);
} }
} }
//@wangk , 2-25, add 0x10function(4000~4449)
else if((start_addr >= 4000) && (start_addr <= 4449))
{
uint16_t *reg_data = (uint16_t *)buf;
for (uint16_t i = 0; i < reg_num; i++)
{
uint16_t reg_value = (reg_data[i] >> 8) | (reg_data[i] << 8);
uint16_t offset_addr = start_addr - 4000 + i;
hmi_write_modbus_cfg(offset_addr, reg_value);
}
}
else else
{ {
err = kBspMdEx_InvalidAddr; err = kBspMdEx_InvalidAddr;

View File

@ -10,15 +10,15 @@
<TargetName>stm32f407</TargetName> <TargetName>stm32f407</TargetName>
<ToolsetNumber>0x4</ToolsetNumber> <ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName> <ToolsetName>ARM-ADS</ToolsetName>
<pArmCC>5060960::V5.06 update 7 (build 960)::.\ARMCC</pArmCC> <pArmCC>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pArmCC>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed> <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7</pCCUsed>
<uAC6>0</uAC6> <uAC6>0</uAC6>
<TargetOption> <TargetOption>
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F407ZGTx</Device> <Device>STM32F407ZGTx</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID> <PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu> <Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>
@ -139,7 +139,7 @@
</Flash1> </Flash1>
<bUseTDR>1</bUseTDR> <bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2CM3.DLL</Flash2> <Flash2>BIN\UL2CM3.DLL</Flash2>
<Flash3></Flash3> <Flash3>"" ()</Flash3>
<Flash4></Flash4> <Flash4></Flash4>
<pFcarmOut></pFcarmOut> <pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp> <pFcarmGrp></pFcarmGrp>
@ -187,6 +187,7 @@
<RvdsVP>2</RvdsVP> <RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp> <RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>1</hadIRAM2> <hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>

File diff suppressed because it is too large Load Diff

View File

@ -588,8 +588,8 @@ void SystemInit(void)
/* Configure the System clock source, PLL Multiplier and Divider factors, /* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/ AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock(); //SetSysClock();
//SystemClock_Config(); SystemClock_Config();
/* Configure the Vector Table location add offset address ------------------*/ /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM #ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */

File diff suppressed because one or more lines are too long

View File

@ -573,6 +573,7 @@ void SystemCoreClockUpdate(void)
#endif /* STM32F412xG || STM32F413_423xx || STM32F446xx */ #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx */
/* Get SYSCLK source -------------------------------------------------------*/ /* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS; tmp = RCC->CFGR & RCC_CFGR_SWS;
//tmp = RCC_CFGR_SWS_HSE;
switch (tmp) switch (tmp)
{ {
@ -711,7 +712,7 @@ void SystemClock_Config(void)
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
/* PCLK1 = HCLK / 4 */ /* PCLK1 = HCLK / 4 */
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; RCC->CFGR |= RCC_CFGR_PPRE1_DIV8;
/* Configure the main PLL for 168 MHz using HSI */ /* Configure the main PLL for 168 MHz using HSI */
RCC->PLLCFGR = (16 << 0) // PLL_M = 16 (HSI = 16 MHz input for PLL) RCC->PLLCFGR = (16 << 0) // PLL_M = 16 (HSI = 16 MHz input for PLL)

View File

@ -28,28 +28,42 @@ uint8_t drv_ads8688_spi_send_rev(uint8_t data)
// 返回TURE则说明初始化正常否则错误 // 返回TURE则说明初始化正常否则错误
bool drv_ads8688_Init(void) bool drv_ads8688_Init(void)
{ {
uint8_t i = 0; uint8_t i = 0, value = 0;
drv_spi_init(kSpiDev_2, kSpiFreq_Div256, kSpiMode_C0E1, SpiFrame_MSBFirst, kGpioType_ADC_Clk, kGpioType_ADC_Miso, kGpioType_ADC_Mosi); drv_spi_init(kSpiDev_2, kSpiFreq_Div256, kSpiMode_C0E1, SpiFrame_MSBFirst, kGpioType_ADC_Clk, kGpioType_ADC_Miso, kGpioType_ADC_Mosi);
//drv_ads8688_Reset();// hardware reset
drv_enter_pwrdn_mode();
OSTimeDly(20);
drv_enter_standby_mode();
OSTimeDly(20);
drv_reset_ads8688(); drv_reset_ads8688();
OSTimeDly(20); kit_time_dly_ms(20);
drv_set_ch_range(Channel_0_Input_Range,VREF_25_25);
drv_set_ch_range(Channel_1_Input_Range,VREF_25_25);
drv_set_ch_range(Channel_2_Input_Range,VREF_25_25);
drv_set_ch_range(Channel_3_Input_Range,VREF_25_25);
drv_set_ch_range(Channel_4_Input_Range,VREF_25_25);
drv_set_ch_range(Channel_5_Input_Range,VREF_25_25);
drv_set_ch_pwrdn(Channel_6_Input_Range); drv_enter_standby_mode();
drv_set_ch_pwrdn(Channel_7_Input_Range); kit_time_dly_ms(20);
//drv_enter_pwrdn_mode();
//OSTimeDly(20);
drv_ads8688_write_reg(AUTO_SEQ_EN, 0xFF);
kit_time_dly_ms(10);
drv_ads8688_write_reg(Feature_Select, 0x28);
kit_time_dly_ms(20);
drv_set_ch_range(Channel_0_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_1_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_2_Input_Range,VREF_0625_0625);
drv_set_ch_range(Channel_3_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_4_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_5_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_6_Input_Range,VREF_125_125);
drv_set_ch_range(Channel_7_Input_Range,VREF_125_125);
//value = drv_ads8688_read_reg(Channel_0_Input_Range);
drv_set_ch_pwrdn(0xC0);
//
#if ADC_AUTO_MODE
{
drv_ads8688_write_reg(AUTO_SEQ_EN, 0x3F); drv_ads8688_write_reg(AUTO_SEQ_EN, 0x3F);
i = drv_ads8688_read_reg(AUTO_SEQ_EN); i = drv_ads8688_read_reg(AUTO_SEQ_EN);
if (i != 0x3F) if (i != 0x3F)
@ -62,6 +76,19 @@ bool drv_ads8688_Init(void)
OSTimeDly(20); OSTimeDly(20);
return false; return false;
} }
}
#else
{
drv_manual_chn_mode(MAN_Ch_0);
drv_manual_chn_mode(MAN_Ch_1);
drv_manual_chn_mode(MAN_Ch_2);
drv_manual_chn_mode(MAN_Ch_3);
drv_manual_chn_mode(MAN_Ch_4);
drv_manual_chn_mode(MAN_Ch_5);
return false;
}
#endif
} }
void drv_ads8688_Reset(void) // hardware reset void drv_ads8688_Reset(void) // hardware reset
@ -107,7 +134,8 @@ void drv_reset_ads8688(void) //
// 退出此模式需执行AUTO_RST或者MAN_CH_n命令且需要等待至少20us以保证正常数据的AD转换 // 退出此模式需执行AUTO_RST或者MAN_CH_n命令且需要等待至少20us以保证正常数据的AD转换
void drv_enter_standby_mode(void) void drv_enter_standby_mode(void)
{ {
drv_ads8688_write_cmd_reg(STDBY); //drv_ads8688_write_cmd_reg(STDBY);
drv_ads8688_write_cmd_reg(NO_OP);
} }
// 进入PWR_DN模式且命令发送后CS立刻置高不读数据帧 // 进入PWR_DN模式且命令发送后CS立刻置高不读数据帧
@ -156,7 +184,7 @@ uint16_t drv_manual_chn_mode_Data(void)
datah = drv_ads8688_spi_send_rev(0xFF); datah = drv_ads8688_spi_send_rev(0xFF);
datal = drv_ads8688_spi_send_rev(0xFF); datal = drv_ads8688_spi_send_rev(0xFF);
drv_set_ads8688_cs(kGpioStatus_High); drv_set_ads8688_cs(kGpioStatus_High);
kit_time_dly_ms(10);
return (datah << 8 | datal); return (datah << 8 | datal);
} }
@ -177,17 +205,16 @@ void drv_ads8688_write_reg(uint8_t Addr, uint8_t data)
} }
// Program Register读操作 // Program Register读操作
uint8_t drv_ads8688_read_reg(uint8_t Addr) uint16_t drv_ads8688_read_reg(uint8_t Addr)
{ {
uint8_t data = 0; uint8_t datah = 0,datal = 0;
drv_set_ads8688_cs(kGpioStatus_Low); drv_set_ads8688_cs(kGpioStatus_Low);
drv_ads8688_spi_send_rev(Addr << 1 | READ); drv_ads8688_spi_send_rev(Addr << 1 | READ);
data = drv_ads8688_spi_send_rev(0xFF); datah = drv_ads8688_spi_send_rev(0xFF);
data = drv_ads8688_spi_send_rev(0xFF); datal = drv_ads8688_spi_send_rev(0xFF);
drv_set_ads8688_cs(kGpioStatus_High); drv_set_ads8688_cs(kGpioStatus_High);
return data; return datal + (datah << 8);
} }
void drv_set_auto_scan_sequence(uint8_t seq) // 设置自动扫描序列通道 void drv_set_auto_scan_sequence(uint8_t seq) // 设置自动扫描序列通道
@ -198,11 +225,13 @@ void drv_set_auto_scan_sequence(uint8_t seq) //
void drv_set_ch_pwrdn(uint8_t chn) // 设置通道n为Power Down void drv_set_ch_pwrdn(uint8_t chn) // 设置通道n为Power Down
{ {
drv_ads8688_write_reg(0X02, chn); drv_ads8688_write_reg(0X02, chn);
} }
void drv_set_ch_range(uint8_t ch, uint8_t range) // 设置各个通道的范围 void drv_set_ch_range(uint8_t ch, uint8_t range) // 设置各个通道的范围
{ {
drv_ads8688_write_reg(ch, range); drv_ads8688_write_reg(ch, range);
kit_time_dly_ms(20);
} }
int16_t drv_ads8688_value(uint16_t value) int16_t drv_ads8688_value(uint16_t value)

View File

@ -84,6 +84,7 @@ kGpioType_ADC_Cs
#define VREF_0_25 0X05 #define VREF_0_25 0X05
#define VREF_0_125 0X06 #define VREF_0_125 0X06
#define ADC_AUTO_MODE 0
typedef struct typedef struct
{ {
uint8_t cs; uint8_t cs;
@ -112,7 +113,7 @@ void drv_enter_auto_rst_mode(void);
void drv_enter_auto_rst_mode_Data(uint16_t* outputdata, uint8_t chnum); void drv_enter_auto_rst_mode_Data(uint16_t* outputdata, uint8_t chnum);
void drv_ads8688_write_reg(uint8_t Addr,uint8_t data); void drv_ads8688_write_reg(uint8_t Addr,uint8_t data);
uint8_t drv_ads8688_read_reg(uint8_t Addr); uint16_t drv_ads8688_read_reg(uint8_t Addr);
void drv_set_auto_scan_sequence(uint8_t seq); void drv_set_auto_scan_sequence(uint8_t seq);
void drv_set_ch_pwrdn(uint8_t chn); void drv_set_ch_pwrdn(uint8_t chn);
void drv_set_ch_range(uint8_t ch,uint8_t range); void drv_set_ch_range(uint8_t ch,uint8_t range);