Files

921 lines
32 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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); // 睡眠指定时间
}
}