diff --git a/projects/blezongkong/mdk/zhongkong.uvprojx b/projects/blezongkong/mdk/zhongkong.uvprojx index bd8997c..21acb58 100644 --- a/projects/blezongkong/mdk/zhongkong.uvprojx +++ b/projects/blezongkong/mdk/zhongkong.uvprojx @@ -48,7 +48,7 @@ 1 .\output\ - OTA_V2_5 + OTA_V2_7 1 0 1 diff --git a/projects/blezongkong/src/app_Time_Event.c b/projects/blezongkong/src/app_Time_Event.c index a269a52..d9d45da 100644 --- a/projects/blezongkong/src/app_Time_Event.c +++ b/projects/blezongkong/src/app_Time_Event.c @@ -11,7 +11,7 @@ #define DEBUG(format, ...) debug("[TR_ET]" format "\r\n", ##__VA_ARGS__) #else #define DEBUG(format, ...) -#define debugHex(dat, len) +//#define debugHex(dat, len) #endif static Time_Events_t Time_Events[Time_Event_MAX]; diff --git a/projects/blezongkong/src/app_bat.c b/projects/blezongkong/src/app_bat.c index 7144fa9..310d753 100644 --- a/projects/blezongkong/src/app_bat.c +++ b/projects/blezongkong/src/app_bat.c @@ -5,19 +5,142 @@ #include "app_bat.h" #include "sys_config.h" -#define BAT_Message_interval 1000 +#define DBG_EN 0 + +#if (DBG_EN) +#include "dbg.h" +#define DEBUG(format, ...) debug("[Bat]" format, ##__VA_ARGS__) +#else +#define DEBUG(format, ...) +//#define debugHex(dat, len) +#endif + +#define BAT_Message_interval 100 tmr_id_t BAT_Message_tmr_id; BAT_Message_t BAT_Message; -uint16_t Bat_Voltage_Last; -uint16_t Voltage_lag_count; - -uint8_t Bat_STA_Last; // 门锁状态更新标志 bool GRB_Door_lock_updata=0; +uint8_t Bat_STA_Last; +uint16_t Voltage_lag_count; +uint16_t Voltage_update_count; +float temp_bat_voltage=0; +// uint16_t Bat_Voltage_Last; + // uint8_t bat_str[50]={0,0},bat_str_len=0; + +const uint16_t coulomp_voltage_table[11] = { + BAT_LEVEL_0PERCENT_VOLT, + BAT_LEVEL_10PERCENT_VOLT, + BAT_LEVEL_20PERCENT_VOLT, + BAT_LEVEL_30PERCENT_VOLT, + BAT_LEVEL_40PERCENT_VOLT, + BAT_LEVEL_50PERCENT_VOLT, + BAT_LEVEL_60PERCENT_VOLT, + BAT_LEVEL_70PERCENT_VOLT, + BAT_LEVEL_80PERCENT_VOLT, + BAT_LEVEL_90PERCENT_VOLT, + BAT_LEVEL_100PERCENT_VOLT, +}; + +uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比 + uint8_t i, percent; + float step, base; + if((volt < coulomp_voltage_table[0])){ + return 0; + } + if((volt >= coulomp_voltage_table[10])){ + return 100; + } + + for (i = 0; i < 10; i++) { + if((volt < coulomp_voltage_table[i+1]) && (volt >= coulomp_voltage_table[i])){ + step = (coulomp_voltage_table[i+1] - coulomp_voltage_table[i]) / 10.0; + base = coulomp_voltage_table[i]; + percent = (10 * i) + (volt - base) / step; + DEBUG("\n\ni:%d,volt:%d,step:%02.2f,base:%02.2f,percent:%d\n\n",i,volt,step,base,percent); + return (uint8_t)percent; + } + } + return 0; +} + + +static tmr_tk_t BAT_Message_Handle(tmr_id_t id) { + uint16_t in_acc_percent= get_in_acc_percent(); + + if(BAT_Message.Runing_Time < 0xFFFF){ + BAT_Message.Runing_Time++; + } + + temp_bat_voltage += get_bat_voltage() * 10; + + Voltage_update_count++; + if(Voltage_update_count >= (1000/BAT_Message_interval)){//1s + BAT_Message.Bat_Voltage = temp_bat_voltage / Voltage_update_count; + Voltage_update_count=0; + temp_bat_voltage = 0; + } + // in_acc_percent =80; + if(in_acc_percent >= 80){ // 油门大于80%时, + if(BAT_Message.Deep_ACC_Time < 0xFFFF){ + BAT_Message.Deep_ACC_Time++; + } + Voltage_lag_count++; + if(Voltage_lag_count >= (2000/BAT_Message_interval)){//2s + Voltage_lag_count=0; + BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage); + } + if(BAT_Message.Bat_Percent < 12){ + BAT_Message.Bat_Low_Volt_count++; + } + }else{ + Voltage_lag_count=0; + } + + + if(BAT_Message.Bat_Percent < 7){ + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_Low_STA; + WS2812_GRBs.GRBs=GRB_RED; + }else if(BAT_Message.Bat_Percent < 30){ // 7~30% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_30_STA; + WS2812_GRBs.GRBs=GRB_RED; + }else if(BAT_Message.Bat_Percent < 60){ // 30~60% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_60_STA; + WS2812_GRBs.GRBs=GRB_BLUE; + }else if(BAT_Message.Bat_Percent < 80){ // 60~80% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_80_STA; + WS2812_GRBs.GRBs=GRB_WHITE; + }else{ + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_100_STA; + WS2812_GRBs.GRBs=GRB_WHITE; + } + + if((Bat_STA_Last != BAT_Message.Bat_STA) || GRB_Door_lock_updata != Get_Status(OUT_Door_lock)){ + GRB_Door_lock_updata=Get_Status(OUT_Door_lock); + + Bat_STA_Last =BAT_Message.Bat_STA; + if( Get_Status(OUT_Door_lock)){ + if(BAT_Message.Bat_STA & Bat_Charge_STA){ + Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL); + }else{ + if(BAT_Message.Bat_STA & Bat_Low_STA){ + Time_Event_Blink(GRB_WS2812_Event,200,200,0xffff,NULL); + }else{ + Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL); + } + } + }else{ + Time_Event_Off(GRB_WS2812_Event,NULL); + } + } + DEBUG("\n\nSTA:0x%#X,V:%d,%d %%,Run:%d,D_A:%d\n\n",BAT_Message.Bat_STA,BAT_Message.Bat_Voltage,BAT_Message.Bat_Percent,BAT_Message.Runing_Time,BAT_Message.Deep_ACC_Time); + return (BAT_Message_interval / 10); +} + +/* static tmr_tk_t BAT_Message_Handle(tmr_id_t id) { uint16_t Bat_Voltage = get_bat_voltage() * 10; @@ -90,8 +213,13 @@ static tmr_tk_t BAT_Message_Handle(tmr_id_t id) { return (BAT_Message_interval / 10); } +*/ void BAT_Message_Init(void) { BAT_Message_tmr_id = sftmr_start(10, BAT_Message_Handle); - Bat_Voltage_Last =get_bat_voltage() * 10; + BAT_Message.Bat_Voltage = get_bat_voltage() * 10; + BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage); + BAT_Message.Runing_Time = 0; + BAT_Message.Deep_ACC_Time = 0; + BAT_Message.Bat_STA = 0; } diff --git a/projects/blezongkong/src/app_bat.h b/projects/blezongkong/src/app_bat.h index 910439c..e5fb043 100644 --- a/projects/blezongkong/src/app_bat.h +++ b/projects/blezongkong/src/app_bat.h @@ -1,39 +1,61 @@ #ifndef _APP_BAT_H_ #define _APP_BAT_H_ + +#define BAT_SxP1 4 // 电池四串一并 +#define BAT_VOLT(_Volt) (_Volt * BAT_SxP1) //电压单位转换 +#define BAT_Low_VOLT BAT_VOLT(105) //10.5V x 4 = 42V +#define BAT_Full_VOLT BAT_VOLT(144) //14.4V x 4 = 57.6V + +// #define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%:(105~110]=(42.0V~44.0V] +// #define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(113) // 10%:(110~113]=(44.0V~45.2V] +// #define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(116) // 20%:(113~116]=(45.2V~46.4V] +// #define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(119) // 30%:(116~119]=(46.4V~47.6V] +// #define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(122) // 40%:(119~122]=(47.6V~48.8V] +// #define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(125) // 50%:(122~125]=(48.8V~50.0V] +// #define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(128) // 60%:(125~128]=(50.0V~51.2V] +// #define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(131) // 70%:(128~131]=(51.2V~52.4V] +// #define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(134) // 80%:(131~134]=(52.4V~53.6V] +// #define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(137) // 90%:(134~137]=(53.6V~54.8V] +// #define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100%:(137~144]=(54.8V~57.6V] + +// 内阻 20mΩ * 4 =80mΩ // 线损 10A 0.1V + +#define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0% +#define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(107) // 10% +#define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(109) // 20% +#define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(111) // 30% +#define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(113) // 40% +#define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(115) // 50% +#define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(117) // 60% +#define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(119) // 70% +#define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(121) // 80% +#define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(123) // 90% +#define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100% + + // 充电状态 typedef enum { - Bat_NotCharge_STA=0x01, - Bat_Charge_STA=0x02, - Bat_Full_STA=0x04, - Bat_Low_STA=0x08, - Bat_30_STA=0x10, - Bat_60_STA=0x20, - Bat_100_STA=0x40, + Bat_Low_STA=(1<<0), + Bat_30_STA=(1<<1), + Bat_60_STA=(1<<2), + Bat_80_STA=(1<<3), + Bat_100_STA=(1<<4), + Bat_NotCharge_STA=(1<<5), + Bat_Charge_STA=(1<<6), } BAT_STA_t; -typedef enum { - Bat_Percent_Low =420, - Bat_Percent_30 =454, - Bat_Percent_60 =489, - Bat_Percent_100 =535, -} BAT_Percent_t; - -// typedef enum { -// Bat_Percent_Low =240, -// Bat_Percent_30 =260, -// Bat_Percent_60 =300, -// Bat_Percent_100 =350, -// } BAT_Percent_t; typedef struct BAT_Message{ uint8_t Bat_STA; - uint8_t Bat_Remain_Time; // 剩余充电时间 + uint8_t Bat_Percent; // 42=42% + uint8_t Bat_Low_Volt_count; // 低压计数 uint16_t Bat_Voltage; // 480=48.0V - uint16_t Bat_Percent; // 420=42.0% + uint16_t Runing_Time; // 系统运行时间 + uint16_t Deep_ACC_Time; // 深踩油门时间 } BAT_Message_t; - +uint8_t pmu_voltage_to_percent(uint32_t volt); // 电压转百分比 void BAT_Message_Init(void); #endif diff --git a/projects/blezongkong/src/app_modbus.c b/projects/blezongkong/src/app_modbus.c index 8d5580c..0c02407 100644 --- a/projects/blezongkong/src/app_modbus.c +++ b/projects/blezongkong/src/app_modbus.c @@ -245,7 +245,7 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_ break; } }else if(CMDCode == 0x06){ - uint8_t Pmode_Timeout =((reg_val_num >> 8) & 0xff); + // uint8_t Pmode_Timeout =((reg_val_num >> 8) & 0xff); // if(0 == Pmode_Timeout){ // Time_Event_Cancel_DelayOff(Pmode_Timeout_Event); // }else{ @@ -333,16 +333,19 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_ } } { // 0x0201-0x0203 - case 0x0301: // 电池状态 + case 0x0301: // 电池状态及电量信息 if(CMDCode == 0x03){ - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA >> 8; - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA & 0xff; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent; MODBUS_Sent_BUF[2] +=2; if(0 == --reg_val_num){ break; } }else if(CMDCode == 0x06){ - len_count =0; + BAT_Message.Bat_Voltage = get_bat_voltage() * 10; + BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage); + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent; break; } case 0x0302: // 电池电压 @@ -357,10 +360,38 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_ len_count =0; break; } - case 0x0303: // 电池电量 + case 0x0303: // 系统运行时间 if(CMDCode == 0x03){ - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent >> 8; - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent & 0xff; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time >> 8; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time & 0xff; + MODBUS_Sent_BUF[2] +=2; + if(0 == --reg_val_num){ + break; + } + }else if(CMDCode == 0x06){ + BAT_Message.Runing_Time =0; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time >> 8; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time & 0xff; + break; + } + case 0x0304: // 深踩油门时间 + if(CMDCode == 0x03){ + MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time >> 8; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time & 0xff; + MODBUS_Sent_BUF[2] +=2; + if(0 == --reg_val_num){ + break; + } + }else if(CMDCode == 0x06){ + BAT_Message.Deep_ACC_Time =0; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time >> 8; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time & 0xff; + break; + } + case 0x0305: // 低压计数 + if(CMDCode == 0x03){ + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Low_Volt_count >> 8; + MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Low_Volt_count & 0xff; MODBUS_Sent_BUF[2] +=2; if(0 == --reg_val_num){ break; @@ -369,10 +400,11 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_ len_count =0; break; } - case 0x0304: // 剩余充电时间 + case 0x0306: // 当前油门百分比 if(CMDCode == 0x03){ - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time >> 8; - MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time & 0xff; + uint16_t in_acc_percent= get_in_acc_percent(); + MODBUS_Sent_BUF[len_count++] =in_acc_percent >> 8; + MODBUS_Sent_BUF[len_count++] =in_acc_percent & 0xff; MODBUS_Sent_BUF[2] +=2; if(0 == --reg_val_num){ break; @@ -381,7 +413,7 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_ len_count =0; break; } - case 0x0305: // 雷达距离信息 + case 0x0307: // 雷达距离信息 if(CMDCode == 0x03){ MODBUS_Sent_BUF[len_count++] =radar_data.distance >> 8; MODBUS_Sent_BUF[len_count++] =radar_data.distance & 0xff; diff --git a/projects/blezongkong/src/sys_config.h b/projects/blezongkong/src/sys_config.h index 0e47042..1f251ff 100644 --- a/projects/blezongkong/src/sys_config.h +++ b/projects/blezongkong/src/sys_config.h @@ -57,7 +57,7 @@ void conf_init(void); /**************************系统版本**************************/ // 软件本号 -#define SW_VERSION (5) +#define SW_VERSION (7) // 硬件本号 #define HW_VERSION (2) // 版本类型:0:0x04000;1:0x20000//不可修改