Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
+920
View File
@@ -0,0 +1,920 @@
#include "collect_ctrl/collect_task.h"
#include "collect_ctrl/yk_ctrl.h"
#include "collect_ctrl/led_ctrl.h"
#include "sub_comm/sub_comm_task.h"
#include "app_init/app_init.h"
#include "app_init/task_lock.h"
#include "mylog/mylog.h"
#include "publicdata/publicdata.h"
#include "wdt_task/wdt_task.h"
#include <stdio.h>
#include "usart.h"
#include "adc/adc_temp.h"
#include "adc/adc_spi5_batVoltCurr.h"
#include "adc/adc_spi3_insuVolt.h"
// 数据采集任务ID
#define DATACOLL_TASK_ID (TASK_ID_DataColl)
// 获取数据采集任务睡眠时间(毫秒)
#define DATACOLL_SLEEP_TIME_MS() (MY_GET_SLEEP_TIME(DATACOLL_TASK_ID))
// 初始化数据采集任务锁
#define DATACOLL_LOCK_INIT() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_INIT))
// 获取数据采集任务锁
#define DATACOLL_LOCK_TAKE() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_TAKE))
// 释放数据采集任务锁
#define DATACOLL_LOCK_GIVE() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_GIVE))
// 喂狗(数据采集任务)
#define DATACOLL_FEED_DOG() (v_wdt_setFlag(DATACOLL_TASK_ID))
// 数据采集任务日志记录
#define DATACOLL_LOG(fmt, ...) MYLOG_MSG(DATACOLL_TASK_ID, (fmt), ##__VA_ARGS__)
#define TEMP_MAX_NUM (2000) //温度最大值 超过则为0
#if 1 //结构定义及变量声明
typedef struct
{
U8_T u8_gunNo; //枪数量
U8_T u8_gunLockNeg[GUN_MAX_CNT]; //枪锁取反标志
SYS_RT_DATA s_sys_rt_data; //整桩遥信、遥测
GUN_RT_DATA s_gun_rt_data[GUN_MAX_CNT]; //充电枪相关遥信、遥测
} YXYC_DATA; //系统遥信、遥测结构体
typedef struct
{
U8_T flag_set; //设置标志
U8_T flag_read; //读取标志
U8_T gunLink_exit[2]; //枪连接中断
U16_T u16_timer_cnt; //周期计时
float f_adc_data[6]; //4路枪温数据 + 2路温度监测
float f_adc_dc_vol[4]; //直流母线adc电压采集值
float f_adc_bat_vol[2]; //直流外侧adc电压采集值
float f_adc_dc_cur[2]; //直流外侧adc电压采集值
float f_adc_gunLink[2]; //枪连接 adc
} S_ADC_GUN_CTRL;
S_ADC_GUN_CTRL s_adc_gun_ctrl;
YXYC_DATA sys_yxyc_data; //系统遥信、遥测
#endif
#if 1 //外部参数获取函数
/********************************
* 函数说明: 获取枪数量
* *参数说明:
* 输入参数:void
* 输出参数:U8_T u8_ret 枪数量
* 备注:
**********************************/
static U8_T u8_coll_get_gun_num()
{
U8_T u8_ret = 0;
u8_ret = g_t_share_data.t_sys_fix_cfg.u8_gunCnt; //获取充电枪数量,需调用外部参数
return u8_ret;
}
/****************************************************
*功能说明: 获取充电桩对应遥信状态或数据(功能框架)
*参数说明:
* 输入参数: E_YX_SYS sys_yx_type , 要读取的整桩遥信状态或数据
* 输出参数: U8_T 遥信状态或数据(当前默认返回 0,待系统集成对接真实数据来源)
*备注:
****************************************************/
static U8_T u8_coll_get_yx_sys(E_YX_SYS sys_yx_type)
{
U8_T u8_ret = 0;
/*
* 数据来源在此处对接(先给默认值,后续你可以直接改每个 case 的赋值):
* - 例如对接 DIu8_ret = DIxx;
* - 或对接共享数据:u8_ret = g_t_share_data.xxx;
* - 或对接 CAN 状态:u8_ret = xxx_get();
*/
switch (sys_yx_type)
{
case YX_PILE_EMERGENCY: //急停(副板 DI13
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_13);
break;
case YX_PILE_DOOR: //门禁(副板 DI14
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_14);
break;
case YX_PILE_WARTER: //水浸(副板 DI15
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_15);
break;
case YX_PILE_KM: //交流接触器状态(副板 DI16
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_16);
break;
case YX_PILE_SPD: //防雷器状态(副板 DI17
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_17);
break;
case YX_PILE_QF: //交流进线开关状态(副板 DI18)
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_18);
break;
case YX_PILE_BUS_KM: //母联直流接触器状态(副板 DI19)
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_19);
break;
case YX_PILE_SMOKE: //烟感(
u8_ret = 0;
break;
default:
u8_ret = 0;
break;
}
return u8_ret;
}
/****************************************************
*功能说明: 获取充电枪对应遥信状态或数据
*参数说明:
* 输入参数: E_YX_GUN e_yx_gun , 要读取的充电枪状态或数据
U8_T u8_gunNo 枪号
* 输出参数: -1 失败 u8_ret 充电枪对应遥信遥测状态或数据
*备注:
****************************************************/
static U8_T u8_coll_get_yx_gun(E_YX_GUN gun_yx_type, U8_T u8_gunNo)
{
U8_T u8_ret;
switch(gun_yx_type)
{
case YX_GUN_LINK: //枪连接状态
u8_ret = u8_get_gunLink(u8_gunNo);
break;
case YX_GUN_LOCK: //枪电子锁状态
u8_ret = u8_gunNo ? DI7 : DI1;
break;
case YX_GUN_DC_KM: //直流输出接触器状态
u8_ret = u8_gunNo ? DI6 : DI2;
break;
case YX_GUN_RELIF: //泄放继电器状态
u8_ret = u8_gunNo ? DI9 : DI4;;
break;
case YX_GUN_DC_FUSE: //直流熔断器状态
u8_ret = u8_gunNo ? DI8 : DI3;
break;
case YX_GUN_AUXPOWER: //低压辅源状态
u8_ret = u8_gunNo ? AUX_B : AUX_A;
break;
case YX_GUN_HOMING: //充电枪归位
u8_ret = u8_gunNo ? DI10 : DI5;
break;
}
return u8_ret;
}
/****************************************************
*功能说明: 获取充电枪对应遥测状态或数据
*参数说明:
* 输入参数: E_YC_GUN e_yc_gun , 要读取的充电枪状态或数据
U8_T u8_gunNo 枪号
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥信遥测状态或数据
*备注:
****************************************************/
static F32_T f32_coll_get_yc_gun(E_YC_GUN gun_yc_type, U8_T u8_gunNo)
{
F32_T f32_ret;
switch(gun_yc_type)
{
case ADC_GUN_VOLT_PLUS: //直流母线正对地电压
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A1) : f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_B1));
break;
case ADC_GUN_VOLT_MINUS: //直流母线负对地电压
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A2) : f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_B2));
break;
case ADC_GUN_MVI: //直流回路测量电流
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_MVI_A) : f_get_gun_data(E_ADC_TYPE_GUN_MVI_B));
break;
case ADC_GUN_BAT: //接触器外侧电压
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_BAT_VOL_A1) : f_get_gun_data(E_ADC_TYPE_GUN_BAT_VOL_B1));
break;
case ADC_GUN_TEMP_PLUS: //充电枪正极温度
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A1) : f_get_gun_data(E_ADC_TYPE_GUN_TEMP_B1));
break;
case ADC_GUN_TEMP_MINUS: //充电枪负极温度
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A2) : f_get_gun_data(E_ADC_TYPE_GUN_TEMP_B2));
break;
}
return f32_ret;
}
/****************************************************
*功能说明: 获取充电桩对应遥信遥测状态或数据
*参数说明:
* 输入参数: E_YX_SYS sys_yc_type , 要读取的整桩遥测状态或数据
U8_T u8_gunNo 枪号
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥测状态或数据
*备注:
****************************************************/
F32_T f32_coll_get_yc_sys(E_YC_SYS sys_yc_type)
{
F32_T f32_ret;
switch(sys_yc_type)
{
case ADC_PILE_TEMP1: //桩温1
f32_ret = f_get_gun_data(E_ADC_TYPE_FAN_IN_TEMP);
break;
case ADC_PILE_TEMP2: //桩温2
f32_ret = f_get_gun_data(E_ADC_TYPE_FAN_OUT_TEMP);
break;
}
return f32_ret;
}
#endif
#if 1 //整桩遥信/遥测更新
/****************************************************
*功能说明: 更新桩体相关遥信、遥测数据
*参数说明:
* 输入参数: SYS_RT_DATA* p_sys 整桩遥测遥信结构体
* 输出参数: void
*备注:
****************************************************/
static void v_updata_sys_yxyc(SYS_RT_DATA* p_sys)
{
if (p_sys == NULL)
return;
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return;
/* 整桩相关遥信状态更新(数据来源当前默认 0,仅保留功能框架) */
p_sys->yx_sys_data.bit_yx_sys_data.yx_emergency = u8_coll_get_yx_sys(YX_PILE_EMERGENCY);
p_sys->yx_sys_data.bit_yx_sys_data.yx_door = u8_coll_get_yx_sys(YX_PILE_DOOR);
p_sys->yx_sys_data.bit_yx_sys_data.yx_water = u8_coll_get_yx_sys(YX_PILE_WARTER);
p_sys->yx_sys_data.bit_yx_sys_data.yx_smoke = u8_coll_get_yx_sys(YX_PILE_SMOKE);
p_sys->yx_sys_data.bit_yx_sys_data.yx_bus_KM = u8_coll_get_yx_sys(YX_PILE_BUS_KM);
p_sys->yx_sys_data.bit_yx_sys_data.yx_spd = u8_coll_get_yx_sys(YX_PILE_SPD);
p_sys->yx_sys_data.bit_yx_sys_data.yx_KM = u8_coll_get_yx_sys(YX_PILE_KM);
p_sys->yx_sys_data.bit_yx_sys_data.yx_QF = u8_coll_get_yx_sys(YX_PILE_QF);
/* 整桩相关遥测状态更新 */
p_sys->f32_yc_sys_temp1 = f32_coll_get_yc_sys(ADC_PILE_TEMP1);
p_sys->f32_yc_sys_temp2 = f32_coll_get_yc_sys(ADC_PILE_TEMP2);
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
}
#endif
#if 1 //对外接口函数
/****************************************************
*功能说明: 获取遥信遥测数据结构体
*参数说明:
* 输入参数: SYS_RT_DATA *pile_data , 桩数据
GUN_RT_DATA *gun_data , 枪数据
U8_T u8_gunNo 枪号
* 输出参数: U8_T 0 失败 1成功
*最后修改时间: 20230923
****************************************************/
U8_T u8_get_yxyc_data(SYS_RT_DATA *pile_data, GUN_RT_DATA *gun_data, U8_T u8_gunNo)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return 0;
if(pile_data != NULL)
{
memset(pile_data, 0, sizeof(SYS_RT_DATA));
memcpy(pile_data, &sys_yxyc_data.s_sys_rt_data, sizeof(SYS_RT_DATA));
}
if(gun_data != NULL)
{
memset(gun_data, 0, sizeof(GUN_RT_DATA));
memcpy(gun_data, &sys_yxyc_data.s_gun_rt_data[u8_gunNo], sizeof(GUN_RT_DATA));
}
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
return 1;
}
/****************************************************
*功能说明: 获取充电枪对应遥信状态或数据
*参数说明:
* 输入参数: E_YX_GUN gun_yx_type , 要读取的充电枪状态或数据
U8_T u8_gunNo 枪号
* 输出参数: U8_T -1 失败 u8_ret 充电枪对应遥信状态或数据
*备注:
****************************************************/
U8_T u8_get_gun_yx_data(E_YX_GUN gun_yx_type, U8_T u8_gunNo)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return 0xFFU;
GUN_RT_DATA *gun_data = &sys_yxyc_data.s_gun_rt_data[u8_gunNo];
U8_T u8_ret;
switch(gun_yx_type)
{
case YX_GUN_LINK: //枪连接状态
u8_ret = gun_data->u8_gunlink_state;
break;
case YX_GUN_LOCK: //枪电子锁状态
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_lock;
break;
case YX_GUN_DC_KM: //母线直流输出接触器状态
case YX_GUN_DC_KM_NEG:
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_switch;
break;
case YX_GUN_RELIF: //泄放继电器状态
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_relief_swich;
break;
case YX_GUN_DC_FUSE: //直流熔断器状态
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_fuse;
break;
case YX_GUN_AUXPOWER: //低压辅源状态
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_power;
break;
case YX_GUN_HOMING: //充电枪归位
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_homing;
break;
}
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
return u8_ret;
}
/****************************************************
*功能说明: 获取充电枪对应遥测状态或数据
*参数说明:
* 输入参数: E_YC_GUN gun_yc_type , 要读取的充电枪状态或数据
U8_T u8_gunNo 枪号
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥测状态或数据
*备注:
****************************************************/
F32_T f32_get_gun_yc_data(E_YC_GUN gun_yc_type, U8_T u8_gunNo)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return -1;
GUN_RT_DATA *gun_data = &sys_yxyc_data.s_gun_rt_data[u8_gunNo];
F32_T f32_ret;
switch(gun_yc_type)
{
case ADC_GUN_VOLT_PLUS: //直流母线正对地电压
f32_ret = gun_data->f32_yc_gun_vol_pos;
break;
case ADC_GUN_VOLT_MINUS: //直流母线负对地电压
f32_ret = gun_data->f32_yc_gun_vol_neg;
break;
case ADC_GUN_MVI: //直流回路测量电流
f32_ret = gun_data->f32_yc_gun_curr;
break;
case ADC_GUN_BAT: //接触器外侧正对地电压
f32_ret = gun_data->f32_yc_bat_vol_pos;
break;
case ADC_GUN_TEMP_PLUS: //充电枪正极温度
f32_ret = gun_data->f32_yc_gun_temp_pos;
break;
case ADC_GUN_TEMP_MINUS: //充电枪负极温度
f32_ret = gun_data->f32_yc_gun_temp_neg;
break;
}
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
return f32_ret;
}
/****************************************************
*功能说明: 外部使用 yk功能接口,使外部不直接进行遥控动作,便于保存遥控状态且确保遥控执行完成
*参数说明:
* 输入参数: E_YK_CTRL_TYPE e_type 控制数据类型
* E_CMD e_cmd 控制数据内容 CMD_OFF = 0, ST_ON = !CMD_OFF
* 输出参数: void
*备注:
****************************************************/
/****************************************************
*功能说明: 获取充电桩对应遥信状态或数据
*参数说明:
* 输入参数: E_YX_SYS sys_yx_type , 要读取的整桩遥信状态或数据
* 输出参数: U8_T -1 失败 u8_ret 充电桩对应遥信状态或数据
*备注:
****************************************************/
U8_T u8_get_sys_yx_data(E_YX_SYS sys_yx_type)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return 0xFFU;
SYS_RT_DATA *sys_data = &sys_yxyc_data.s_sys_rt_data;
U8_T u8_ret;
switch(sys_yx_type)
{
case YX_PILE_EMERGENCY: //急停
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_emergency;
break;
case YX_PILE_DOOR: //门禁
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_door;
break;
case YX_PILE_WARTER: //水浸
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_water;
break;
case YX_PILE_SPD: //防雷器
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_spd;
break;
case YX_PILE_SMOKE: //烟感
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_smoke;
break;
case YX_PILE_BUS_KM: //母联接触器
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_bus_KM;
break;
case YX_PILE_KM: //交流输入接触器
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_KM;
break;
case YX_PILE_QF: //交流输入断路器
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_QF;
break;
}
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
return u8_ret;
}
/****************************************************
*功能说明: 获取充电桩对应遥测状态或数据
*参数说明:
* 输入参数: E_YC_SYS sys_yc_type , 要读取的整桩遥测状态或数据
* 输出参数: F32_T -1 失败 f32_ret 充电桩对应遥测状态或数据
*备注:
****************************************************/
F32_T f32_get_sys_yc_data(E_YC_SYS sys_yc_type)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return -1;
SYS_RT_DATA *sys_data = &sys_yxyc_data.s_sys_rt_data;
F32_T f32_ret;
switch(sys_yc_type)
{
case ADC_PILE_TEMP1: //桩温1
f32_ret = sys_data->f32_yc_sys_temp1;
break;
case ADC_PILE_TEMP2: //桩温2
f32_ret = sys_data->f32_yc_sys_temp2;
break;
}
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
return f32_ret;
}
#endif
#if 1 //遥信数据更新
/****************************************************
*功能说明: 更新充电枪相关遥信、遥测数据
*参数说明:
* 输入参数: GUN_RT_DATA* p_gun 充电枪遥测遥信结构体
U8_T u8_gunNo 枪号
* 输出参数: void
*备注:
****************************************************/
void v_update_gun_yxyc(GUN_RT_DATA* p_gun, U8_T u8_gunNo)
{
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
return;
U8_T gunlockNeg = sys_yxyc_data.u8_gunLockNeg[u8_gunNo]; //获取充电枪电子锁取反状态
/****充电枪遥信状态更新****/
p_gun->u8_gunlink_state = u8_coll_get_yx_gun(YX_GUN_LINK, u8_gunNo); //充电枪连接状态,需调用外部接口
if(gunlockNeg)
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_lock = (u8_coll_get_yx_gun(YX_GUN_LOCK, u8_gunNo) ? 0 : 1); //电磁锁状态
else
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_lock = u8_coll_get_yx_gun(YX_GUN_LOCK, u8_gunNo); //电磁锁状态,需调用外部接口
p_gun->yx_gun_data.bit_yx_gun_data.yx_switch = u8_coll_get_yx_gun(YX_GUN_DC_KM, u8_gunNo); //直流输出接触器状态,需调用外部接口
p_gun->yx_gun_data.bit_yx_gun_data.yx_relief_swich = u8_coll_get_yx_gun(YX_GUN_RELIF, u8_gunNo); //直流回路泄放继电器状态,需调用外部接口
p_gun->yx_gun_data.bit_yx_gun_data.yx_fuse = u8_coll_get_yx_gun(YX_GUN_DC_FUSE, u8_gunNo); //直流回路熔断器状态,需调用外部接口
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_power = u8_coll_get_yx_gun(YX_GUN_AUXPOWER, u8_gunNo); //充电枪辅助电源状态,需调用外部接口
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_homing = u8_coll_get_yx_gun(YX_GUN_HOMING, u8_gunNo); //充电枪归位状态,需调用外部接口
/****充电枪遥测状态更新****/
p_gun->f32_yc_gun_vol_pos = f32_coll_get_yc_gun(ADC_GUN_VOLT_PLUS, u8_gunNo); //直流母线正对地电压,需调用外部接口
p_gun->f32_yc_gun_vol_neg = f32_coll_get_yc_gun(ADC_GUN_VOLT_MINUS, u8_gunNo); //直流母线负对地电压,需调用外部接口
p_gun->f32_yc_gun_curr = f32_coll_get_yc_gun(ADC_GUN_MVI, u8_gunNo); //直流回路测量电流,需调用外部接口
p_gun->f32_yc_bat_vol_pos = f32_coll_get_yc_gun(ADC_GUN_BAT, u8_gunNo); //接触器外侧正对地电压,需调用外部接口
p_gun->f32_yc_gun_temp_pos = f32_coll_get_yc_gun(ADC_GUN_TEMP_PLUS, u8_gunNo); //充电枪正极温度,需调用外部接口
p_gun->f32_yc_gun_temp_neg = f32_coll_get_yc_gun(ADC_GUN_TEMP_MINUS, u8_gunNo); //充电枪负极温度,需调用外部接口
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
}
#endif
#if 1 //遥测数据更新
//枪温采集是使用一个采集口,通过片选的方式控制
void v_set_adc()
{
//温度采集选通,
/* 选择温度传感器通道的函数
通道0 TEMP5
通道1 VOL
通道2 VOL
通道3 TEMP6
通道4 TEMP1
通道5 TEMP4
通道6 TEMP2
通道7 TEMP3
*/
switch (s_adc_gun_ctrl.flag_set)
{
case 0: //设置采集A枪正极温度值 2
{
select_temp_channel(2);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set ++;
break;
}
case 1: //设置采集A枪负极温度值 1
{
select_temp_channel(1);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set ++;
break;
}
case 2: //设置采集B枪正极温度值
{
select_temp_channel(4);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set ++;
break;
}
case 3: //设置采集B枪负极温度值
{
select_temp_channel(6);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set ++;
break;
}
case 4: //设置出风口温度检测值
{
select_temp_channel(5);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set ++;
break;
}
case 5: //设置进风口温度检测值
{
select_temp_channel(7);
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
s_adc_gun_ctrl.flag_set = 0;
break;
}
default:
{
s_adc_gun_ctrl.flag_set = 0;
break;
}
}
}
/****************************************************
*功能说明: 枪温循环处理函数,用于控制片选信号并获取对应位置的温度
*参数说明:
* 输入参数: U16_T u16_leep_time 执行周期
* 输出参数: void
*备注:
*作者: jiankalka
*日期: 2025-08-07
****************************************************/
void v_gun_temp_loop(U16_T u16_leep_time)
{
if(s_adc_gun_ctrl.u16_timer_cnt % NUM_500 == 0) //100ms
{
// s_adc_gun_ctrl.f_adc_data[s_adc_gun_ctrl.flag_read] = adc_readval(); //获取枪温
// v_set_adc();
}
/* SPI5:CC1 / 外侧电压 / 回路电流,每次调用实时 SPI 采样 */
s_adc_gun_ctrl.f_adc_gunLink[0] = spi5_read_analog_voltage(0); /* A枪 CC1 */
s_adc_gun_ctrl.f_adc_gunLink[1] = spi5_read_analog_voltage(1); /* B枪 CC1 */
s_adc_gun_ctrl.f_adc_bat_vol[0] = spi5_read_analog_voltage(4); /* A枪外侧电压 */
s_adc_gun_ctrl.f_adc_bat_vol[1] = spi5_read_analog_voltage(2); /* B枪外侧电压 */
s_adc_gun_ctrl.f_adc_dc_cur[0] = spi5_read_analog_voltage(7); /* A枪回路电流 */
s_adc_gun_ctrl.f_adc_dc_cur[1] = spi5_read_analog_voltage(6); /* B枪回路电流 */
if((s_adc_gun_ctrl.u16_timer_cnt / u16_leep_time) % NUM_4 == 0) /* 4个周期采一次,10ms 任务约 40ms */
{
s_adc_gun_ctrl.f_adc_dc_vol[0] = spi3_read_analog_voltage(1, 0); //A枪正极adc电压采集值
s_adc_gun_ctrl.f_adc_dc_vol[2] = spi3_read_analog_voltage(2, 0); //B枪正极adc电压采集值
s_adc_gun_ctrl.f_adc_dc_vol[1] = spi3_read_analog_voltage(1, 1); //A枪负极adc电压采集值
s_adc_gun_ctrl.f_adc_dc_vol[3] = spi3_read_analog_voltage(2, 1); //B枪负极adc电压采集值
}
//周期计数
if(s_adc_gun_ctrl.u16_timer_cnt < 0xFF00)
s_adc_gun_ctrl.u16_timer_cnt += u16_leep_time;
else
s_adc_gun_ctrl.u16_timer_cnt = 0;
}
/****************************************************
*功能说明: 枪温处理函数初始化
*参数说明:
* 输入参数: void
* 输出参数: void
*备注:
*作者: jiankalka
*日期: 2025-08-07
****************************************************/
void v_gun_temp_init()
{
memset(&s_adc_gun_ctrl, 0, sizeof(S_ADC_GUN_CTRL));
init_adc();
}
/****************************************************
*功能说明: 充电中( CC1 在 3.2~4.8V )用比较器开关量获取枪连接状态
* PF10/PD3 高表示>4.8V断开,PF9/PA15 低表示<3.2V断开
*返回值: 0未连接 1已连接
****************************************************/
U8_T u8_get_gunLink_cmp(U8_T u8_gunNo)
{
if(u8_gunNo == 0U)
{
if(GUN1_UBAL_READ_H == SET) //A枪CC1检测(高于4.8V,未连接)
return 0U;
if(GUN1_UBAL_READ_L == RESET) //A枪CC1检测(低于3.2V,未连接)
return 0U;
}
else
{
if(GUN2_UBAL_READ_H == SET) //B枪CC1检测(高于4.8V,未连接)
return 0U;
if(GUN2_UBAL_READ_L == RESET) //B枪CC1检测(低于3.2V,未连接)
return 0U;
}
return 1U;
}
/****************************************************
*功能说明: 获取枪连接状态
*参数说明:
* 输入参数: U8_T u8_gunNo 枪号地址 0-1
* 输出参数: U8_T 插枪状态 0未插枪 1插枪
*备注:
*作者: jiankalka
*日期: 2025-08-11
****************************************************/
U8_T u8_get_gunLink(U8_T u8_gunNo)
{
//获取枪连接ADC电压值
float gunLink = s_adc_gun_ctrl.f_adc_gunLink[u8_gunNo];
//根据电压值判断枪连接状态,若在3.2~4.8V范围内
if(gunLink >= GUNLINK_CC1_VOLT_LO && gunLink <= GUNLINK_CC1_VOLT_HI)
return u8_get_gunLink_cmp(u8_gunNo);
return 0U;
}
/****************************************************
*功能说明: 获取枪adc采样值
*参数说明:
* 输入参数: E_ADC_TYPE e_type ADC类型
E_ADC_TYPE_GUN_TEMP_A1, //2 A枪温+
E_ADC_TYPE_GUN_TEMP_A2, //3 A枪温-
E_ADC_TYPE_GUN_TEMP_B1, //4 B枪温正;
E_ADC_TYPE_GUN_TEMP_B2, //5 B枪温-
E_ADC_TYPE_FAN_IN_TEMP, //6 进风口温度
E_ADC_TYPE_FAN_OUT_TEMP, //7 出风口温度
E_ADC_TYPE_GUN_DC_VOL_A1, //8 A枪DC 正极电压采集值
E_ADC_TYPE_GUN_DC_VOL_A2, //9 A枪DC 负极电压采集值
E_ADC_TYPE_GUN_DC_VOL_B1, //10 B枪DC 正极电压采集值
E_ADC_TYPE_GUN_DC_VOL_B2, //11 B枪DC 负极电压采集值
* 输出参数: float ADC采样值
*备注:
****************************************************/
float f_get_gun_data(E_ADC_TYPE e_type)
{
float f_ret = 0;
switch (e_type)
{
case E_ADC_TYPE_GUN_TEMP_A1: //2 A枪温+
f_ret = s_adc_gun_ctrl.f_adc_data[0];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_TEMP_A2: //3 A枪温-
f_ret = s_adc_gun_ctrl.f_adc_data[1];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_TEMP_B1: //4 B枪温正;
f_ret = s_adc_gun_ctrl.f_adc_data[2];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_TEMP_B2: //5 B枪温-
f_ret = s_adc_gun_ctrl.f_adc_data[3];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_FAN_IN_TEMP: //6 进风口温度
f_ret = s_adc_gun_ctrl.f_adc_data[4];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_FAN_OUT_TEMP: //7 出风口温度
f_ret = s_adc_gun_ctrl.f_adc_data[5];
if(f_ret > TEMP_MAX_NUM)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_DC_VOL_A1: //8 A枪DC 正极电压采集值
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[0];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_DC_VOL_A2: //9 A枪DC 负极电压采集值
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[1];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_DC_VOL_B1: //10 B枪DC 正极电压采集值
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[2];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_DC_VOL_B2: //11 B枪DC 负极电压采集值
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[3];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_MVI_A: //12 A枪直流回路测量电流
f_ret = s_adc_gun_ctrl.f_adc_dc_cur[0];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_MVI_B: //13 B枪直流回路测量电流
f_ret = s_adc_gun_ctrl.f_adc_dc_cur[1];
if(f_ret < 0)
f_ret = 0;
break;
case E_ADC_TYPE_GUN_BAT_VOL_A1: //14 A枪接触器外侧电压采集值
f_ret = s_adc_gun_ctrl.f_adc_bat_vol[0];
if (f_ret < 0) {
f_ret = 0;
}
break;
;
case E_ADC_TYPE_GUN_BAT_VOL_B1: //16 B枪接触器外侧电压采集值
f_ret = s_adc_gun_ctrl.f_adc_bat_vol[1];
if (f_ret < 0) {
f_ret = 0;
}
break;
default:
break;
}
return f_ret;
}
#endif
void v_init_collect()
{
v_yk_ctrl_init(); //遥控初始化
v_led_init(); //LED状态缓存初始化
v_gun_temp_init(); //枪温采集初始化
memset(&sys_yxyc_data, 0, sizeof(YXYC_DATA)); //初始化清空数据
// 外部数据初始化,可以减少系统运行时对外部数据的获取
sys_yxyc_data.u8_gunNo = u8_coll_get_gun_num(); //获取系统充电枪数量
}
void v_collect_task(void *arg)
{
uint16_t sleep_time_ms; // 任务睡眠时间(毫秒)
uint32_t last_send_time; // 上次发送时间
uint32_t current_time; // 当前时间
U8_T i;
(void)arg; // 忽略未使用的参数
(void)DATACOLL_LOCK_INIT(); // 初始化数据采集任务锁
sleep_time_ms = DATACOLL_SLEEP_TIME_MS(); // 获取任务睡眠时间
last_send_time = get_current_seconds(); // 获取当前时间作为上次发送时间
v_init_collect(); //初始化
for (;;)
{
DATACOLL_FEED_DOG(); // 任务喂狗
current_time = get_current_seconds(); // 获取当前时间
// 检查是否需要打印任务运行信息
if ((TASK_RUN_PRINT_TIME != 0U) && (u32_safe_seconds_since(last_send_time) >= TASK_RUN_PRINT_TIME))
{
// 尝试获取锁
if (DATACOLL_LOCK_TAKE() == 1U)
{
DATACOLL_LOG("data coll task is runing, sleep time is %ums", sleep_time_ms); // 打印任务运行日志
(void)DATACOLL_LOCK_GIVE(); // 释放锁
}
last_send_time = current_time; // 更新上次发送时间
}
/* 1) 执行遥控缓冲命令(统一在采集任务内下发) */
v_yk_ctrl_cheak();
/* 2) LED状态刷新(供sub_comm读取) */
v_led_ctrl(sleep_time_ms);
/* 3) 采集循环(枪温/环境温度等缓存更新) */
v_gun_temp_loop(sleep_time_ms);
/* 4) 遥信/遥测镜像刷新(按枪循环更新) */
for (i = 0; i < sys_yxyc_data.u8_gunNo; i++)
{
v_update_gun_yxyc(&sys_yxyc_data.s_gun_rt_data[i], i);
}
/* 5) 整桩遥信/遥测刷新 */
v_gun_temp_loop(sleep_time_ms);
v_updata_sys_yxyc(&sys_yxyc_data.s_sys_rt_data);
mSleep(sleep_time_ms); // 睡眠指定时间
}
}