修复电量显示问题 zsxfly20250116

This commit is contained in:
zsx 2025-01-16 19:29:02 +08:00
parent 967e983df7
commit d354e097e4
6 changed files with 226 additions and 44 deletions

View File

@ -48,7 +48,7 @@
<InvalidFlash>1</InvalidFlash> <InvalidFlash>1</InvalidFlash>
</TargetStatus> </TargetStatus>
<OutputDirectory>.\output\</OutputDirectory> <OutputDirectory>.\output\</OutputDirectory>
<OutputName>OTA_V2_5</OutputName> <OutputName>OTA_V2_7</OutputName>
<CreateExecutable>1</CreateExecutable> <CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib> <CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile> <CreateHexFile>1</CreateHexFile>

View File

@ -11,7 +11,7 @@
#define DEBUG(format, ...) debug("[TR_ET]" format "\r\n", ##__VA_ARGS__) #define DEBUG(format, ...) debug("[TR_ET]" format "\r\n", ##__VA_ARGS__)
#else #else
#define DEBUG(format, ...) #define DEBUG(format, ...)
#define debugHex(dat, len) //#define debugHex(dat, len)
#endif #endif
static Time_Events_t Time_Events[Time_Event_MAX]; static Time_Events_t Time_Events[Time_Event_MAX];

View File

@ -5,19 +5,142 @@
#include "app_bat.h" #include "app_bat.h"
#include "sys_config.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; tmr_id_t BAT_Message_tmr_id;
BAT_Message_t BAT_Message; 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; 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; // 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) { static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
uint16_t Bat_Voltage = get_bat_voltage() * 10; 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); return (BAT_Message_interval / 10);
} }
*/
void BAT_Message_Init(void) { void BAT_Message_Init(void) {
BAT_Message_tmr_id = sftmr_start(10, BAT_Message_Handle); 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;
} }

View File

@ -1,39 +1,61 @@
#ifndef _APP_BAT_H_ #ifndef _APP_BAT_H_
#define _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 { typedef enum {
Bat_NotCharge_STA=0x01, Bat_Low_STA=(1<<0),
Bat_Charge_STA=0x02, Bat_30_STA=(1<<1),
Bat_Full_STA=0x04, Bat_60_STA=(1<<2),
Bat_Low_STA=0x08, Bat_80_STA=(1<<3),
Bat_30_STA=0x10, Bat_100_STA=(1<<4),
Bat_60_STA=0x20, Bat_NotCharge_STA=(1<<5),
Bat_100_STA=0x40, Bat_Charge_STA=(1<<6),
} BAT_STA_t; } 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{ typedef struct BAT_Message{
uint8_t Bat_STA; 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_Voltage; // 480=48.0V
uint16_t Bat_Percent; // 420=42.0% uint16_t Runing_Time; // 系统运行时间
uint16_t Deep_ACC_Time; // 深踩油门时间
} BAT_Message_t; } BAT_Message_t;
uint8_t pmu_voltage_to_percent(uint32_t volt); // 电压转百分比
void BAT_Message_Init(void); void BAT_Message_Init(void);
#endif #endif

View File

@ -245,7 +245,7 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
break; break;
} }
}else if(CMDCode == 0x06){ }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){ // if(0 == Pmode_Timeout){
// Time_Event_Cancel_DelayOff(Pmode_Timeout_Event); // Time_Event_Cancel_DelayOff(Pmode_Timeout_Event);
// }else{ // }else{
@ -333,16 +333,19 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
} }
} }
{ // 0x0201-0x0203 { // 0x0201-0x0203
case 0x0301: // 电池状态 case 0x0301: // 电池状态及电量信息
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA >> 8; MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA & 0xff; MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent;
MODBUS_Sent_BUF[2] +=2; MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){ if(0 == --reg_val_num){
break; break;
} }
}else if(CMDCode == 0x06){ }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; break;
} }
case 0x0302: // 电池电压 case 0x0302: // 电池电压
@ -357,10 +360,38 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
len_count =0; len_count =0;
break; break;
} }
case 0x0303: // 电池电量 case 0x0303: // 系统运行时间
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent >> 8; MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time >> 8;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent & 0xff; 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; MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){ if(0 == --reg_val_num){
break; break;
@ -369,10 +400,11 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
len_count =0; len_count =0;
break; break;
} }
case 0x0304: // 剩余充电时间 case 0x0306: // 当前油门百分比
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time >> 8; uint16_t in_acc_percent= get_in_acc_percent();
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time & 0xff; MODBUS_Sent_BUF[len_count++] =in_acc_percent >> 8;
MODBUS_Sent_BUF[len_count++] =in_acc_percent & 0xff;
MODBUS_Sent_BUF[2] +=2; MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){ if(0 == --reg_val_num){
break; break;
@ -381,7 +413,7 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
len_count =0; len_count =0;
break; break;
} }
case 0x0305: // 雷达距离信息 case 0x0307: // 雷达距离信息
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =radar_data.distance >> 8; MODBUS_Sent_BUF[len_count++] =radar_data.distance >> 8;
MODBUS_Sent_BUF[len_count++] =radar_data.distance & 0xff; MODBUS_Sent_BUF[len_count++] =radar_data.distance & 0xff;

View File

@ -57,7 +57,7 @@ void conf_init(void);
/**************************系统版本**************************/ /**************************系统版本**************************/
// 软件本号 // 软件本号
#define SW_VERSION (5) #define SW_VERSION (7)
// 硬件本号 // 硬件本号
#define HW_VERSION (2) #define HW_VERSION (2)
// 版本类型00x0400010x20000//不可修改 // 版本类型00x0400010x20000//不可修改