From d354e097e44c386d7db7a430d7418affd69f2f74 Mon Sep 17 00:00:00 2001
From: zsx <1543588107@qq.com>
Date: Thu, 16 Jan 2025 19:29:02 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=B5=E9=87=8F=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98=20zsxfly20250116?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
projects/blezongkong/mdk/zhongkong.uvprojx | 2 +-
projects/blezongkong/src/app_Time_Event.c | 2 +-
projects/blezongkong/src/app_bat.c | 140 ++++++++++++++++++++-
projects/blezongkong/src/app_bat.h | 68 ++++++----
projects/blezongkong/src/app_modbus.c | 56 +++++++--
projects/blezongkong/src/sys_config.h | 2 +-
6 files changed, 226 insertions(+), 44 deletions(-)
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//不可修改