xidipower test

This commit is contained in:
2026-03-09 01:57:43 +08:00
parent 5145d60794
commit 9c58a09eab
4 changed files with 92 additions and 72 deletions

View File

@@ -7,11 +7,11 @@
#include "daemon.h"
static PowerMeterInstance *power_meter_instance = NULL;
static XidiPowerMeterInstance *power_meter_instance = NULL;
/**
* @brief 功率计数据解码函数
* @param instance FDCAN实例指针
* @param _instance FDCAN实例指针
*
* @note 数据格式:
* DATA[0]: 电流数值低8位
@@ -22,13 +22,13 @@ static PowerMeterInstance *power_meter_instance = NULL;
*
* 电压电流数值均为放大100倍后的整数需要除以100.0得到实际值
*/
void PowerMeterDecode(FDCANInstance *instance)
void XidiPowerMeterDecode(FDCANInstance *_instance)
{
if (power_meter_instance == NULL)
return;
uint8_t *rxbuff = instance->rx_buff;
PowerMeter_Measure_s *measure = &power_meter_instance->measure;
uint8_t *rxbuff = _instance->rx_buff;
XidiPowerMeter_Msg_s *measure = &power_meter_instance->powermeter_msg;
// 重载守护进程
// if (power_meter_instance->daemon != NULL)
@@ -60,57 +60,51 @@ void PowerMeterDecode(FDCANInstance *instance)
* @brief 功率计丢失回调函数
* @param power_meter_ptr 功率计实例指针
*/
void PowerMeterLostCallback(void *power_meter_ptr)
void XidiPowerMeterLostCallback(void *power_meter_ptr)
{
PowerMeterInstance *power_meter = (PowerMeterInstance *) power_meter_ptr;
XidiPowerMeterInstance *power_meter = (XidiPowerMeterInstance *) power_meter_ptr;
}
/**
* @brief 功率计初始化
* @param can_handle FDCAN句柄指针
* @return PowerMeterInstance* 功率计实例指针
* @param XidiPowerMeter_config 功率计初始化配置结构体指针 (必须确保其生命周期是全局或静态的)
* @return XidiPowerMeterInstance* 功率计实例指针
*/
PowerMeterInstance *PowerMeterInit(FDCAN_HandleTypeDef *can_handle)
XidiPowerMeterInstance *XidiPowerMeterInit(XidiPowerMeter_Init_Config_s *XidiPowerMeter_config)
{
// 检查是否已经初始化
// 1. 检查是否已经初始化
if (power_meter_instance != NULL)
{
return power_meter_instance;
}
// 分配内存
power_meter_instance = (PowerMeterInstance *) malloc(sizeof(PowerMeterInstance));
// 2. 分配内存并清零
power_meter_instance = (XidiPowerMeterInstance *)malloc(sizeof(XidiPowerMeterInstance));
if (power_meter_instance == NULL)
{
return NULL;
}
memset(power_meter_instance, 0, sizeof(PowerMeterInstance));
memset(power_meter_instance, 0, sizeof(XidiPowerMeterInstance));
// 配置功率计初始化参数
FDCAN_Init_Config_s can_config = {
.can_handle = can_handle,
.rx_id = 0x213, // 功率计反馈标识符
.tx_id = 0x000, // 不需要发送设为0
.can_module_callback = PowerMeterDecode,
.id = power_meter_instance, // 将实例指针作为ID传递
};
// 3. 配置并注册 FDCAN 实例
// (rx_id, tx_id, can_handle 等参数由外部 config 提供,这里只绑定回调和私有指针)
XidiPowerMeter_config->can_config.can_module_callback = XidiPowerMeterDecode;
XidiPowerMeter_config->can_config.id = power_meter_instance;
// 注册FDCAN实例
power_meter_instance->can_instance = CANRegister(&can_config);
if (power_meter_instance->can_instance == NULL)
power_meter_instance->fdcan_ins = CANRegister(&XidiPowerMeter_config->can_config);
if (power_meter_instance->fdcan_ins == NULL)
{
free(power_meter_instance);
power_meter_instance = NULL;
return NULL;
}
//注册守护进程
Daemon_Init_Config_s daemon_config = {
.callback = PowerMeterLostCallback,
.owner_id = power_meter_instance,
.reload_count = 5, // 50ms未收到数据则认为丢失 (1000Hz发送5个周期)
};
power_meter_instance->daemon = DaemonRegister(&daemon_config);
// 4. 配置并注册 守护进程
// (reload_count 等参数由外部 config 提供,这里只绑定回调和私有指针)
XidiPowerMeter_config->daemon_config.callback = XidiPowerMeterLostCallback;
XidiPowerMeter_config->daemon_config.owner_id = power_meter_instance;
power_meter_instance->daemon = DaemonRegister(&XidiPowerMeter_config->daemon_config);
return power_meter_instance;
}
@@ -120,11 +114,11 @@ PowerMeterInstance *PowerMeterInit(FDCAN_HandleTypeDef *can_handle)
* @param power_meter 功率计实例指针
* @return float 电压值 (V)
*/
float PowerMeterGetVoltage(PowerMeterInstance *power_meter)
float XidiPowerMeterGetVoltage(XidiPowerMeterInstance *power_meter)
{
if (power_meter == NULL)
return 0.0f;
return power_meter->measure.voltage;
return power_meter->powermeter_msg.voltage;
}
/**
@@ -132,11 +126,11 @@ float PowerMeterGetVoltage(PowerMeterInstance *power_meter)
* @param power_meter 功率计实例指针
* @return float 电流值 (A)
*/
float PowerMeterGetCurrent(PowerMeterInstance *power_meter)
float XidiPowerMeterGetCurrent(XidiPowerMeterInstance *power_meter)
{
if (power_meter == NULL)
return 0.0f;
return power_meter->measure.current;
return power_meter->powermeter_msg.current;
}
/**
@@ -144,11 +138,11 @@ float PowerMeterGetCurrent(PowerMeterInstance *power_meter)
* @param power_meter 功率计实例指针
* @return float 功率值 (W)
*/
float PowerMeterGetPower(PowerMeterInstance *power_meter)
float XidiPowerMeterGetPower(XidiPowerMeterInstance *power_meter)
{
if (power_meter == NULL)
return 0.0f;
return power_meter->measure.power;
return power_meter->powermeter_msg.power;
}
/**
@@ -156,22 +150,22 @@ float PowerMeterGetPower(PowerMeterInstance *power_meter)
* @param power_meter 功率计实例指针
* @return float 累计能量 (J)
*/
float PowerMeterGetEnergy(PowerMeterInstance *power_meter)
float XidiPowerMeterGetEnergy(XidiPowerMeterInstance *power_meter)
{
if (power_meter == NULL)
return 0.0f;
return power_meter->measure.energy;
return power_meter->powermeter_msg.energy;
}
/**
* @brief 重置累计能量
* @param power_meter 功率计实例指针
*/
void PowerMeterResetEnergy(PowerMeterInstance *power_meter)
void XidiPowerMeterResetEnergy(XidiPowerMeterInstance *power_meter)
{
if (power_meter != NULL)
{
power_meter->measure.energy = 0.0f;
power_meter->powermeter_msg.energy = 0.0f;
}
}
@@ -179,7 +173,7 @@ void PowerMeterResetEnergy(PowerMeterInstance *power_meter)
* @brief 获取功率计实例(用于外部访问)
* @return PowerMeterInstance* 功率计实例指针
*/
PowerMeterInstance *GetPowerMeterInstance(void)
XidiPowerMeterInstance *GetXidiPowerMeterInstance(void)
{
return power_meter_instance;
}

View File

@@ -19,34 +19,40 @@ typedef struct
float energy; // 累计能量 (J)
uint32_t update_cnt; // 更新计数器
float dt; // 更新时间间隔
} PowerMeter_Measure_s;
} XidiPowerMeter_Msg_s;
/* 功率计实例结构 */
typedef struct
{
FDCANInstance *can_instance; // FDCAN实例指针
PowerMeter_Measure_s measure; // 测量数据
FDCANInstance *fdcan_ins; // FDCAN实例指针
XidiPowerMeter_Msg_s powermeter_msg; // 测量数据
Daemon_Instance *daemon; // 守护进程
uint32_t feed_cnt; // 喂狗计数器
} PowerMeterInstance;
} XidiPowerMeterInstance;
/* 功率计初始化配置 */
typedef struct {
FDCAN_Init_Config_s can_config;
Daemon_Init_Config_s daemon_config;
} XidiPowerMeter_Init_Config_s;
/* 函数声明 */
PowerMeterInstance *PowerMeterInit(FDCAN_HandleTypeDef *can_handle);
XidiPowerMeterInstance *XidiPowerMeterInit(XidiPowerMeter_Init_Config_s *XidiPowerMeter_config);
void PowerMeterDecode(FDCANInstance *instance);
void XidiPowerMeterDecode(FDCANInstance *_instance);
void PowerMeterLostCallback(void *power_meter_ptr);
void XidiPowerMeterLostCallback(void *power_meter_ptr);
float PowerMeterGetVoltage(PowerMeterInstance *power_meter);
float XidiPowerMeterGetVoltage(XidiPowerMeterInstance *power_meter);
float PowerMeterGetCurrent(PowerMeterInstance *power_meter);
float XidiPowerMeterGetCurrent(XidiPowerMeterInstance *power_meter);
float PowerMeterGetPower(PowerMeterInstance *power_meter);
float XidiPowerMeterGetPower(XidiPowerMeterInstance *power_meter);
float PowerMeterGetEnergy(PowerMeterInstance *power_meter);
float XidiPowerMeterGetEnergy(XidiPowerMeterInstance *power_meter);
void PowerMeterResetEnergy(PowerMeterInstance *power_meter);
void XidiPowerMeterResetEnergy(XidiPowerMeterInstance *power_meter);
PowerMeterInstance *GetPowerMeterInstance(void);
XidiPowerMeterInstance *GetPowerMeterInstance(void);
#endif //TRONONEH7_SCAFFOLD_XIDIPWMETER_H

View File

@@ -8,7 +8,7 @@
// ==================== 2. 定义局部指针 ====================
static PowerMeterInstance *chassis_power_meter; // 功率计实例指针
static XidiPowerMeterInstance *chassis_power_meter; // 功率计实例指针
// 存放读取到的功率数据(也可以直接放进发给底盘的结构体里)
static float current_power_w = 0.0f;
@@ -16,15 +16,34 @@ static float current_voltage_v = 0.0f;
static float current_energy_j = 0.0f;
// ==================== 3. 在初始化函数中注册 ====================
// 1. 定义为静态变量static确保它的内存空间常驻防止底层指针悬垂
static XidiPowerMeter_Init_Config_s xidi_pm_config = {
.can_config = {
.can_handle = &hfdcan1, // 原来直接传的句柄,现在放进结构体里
.rx_id = 0x213, // 接收 ID
.tx_id = 0x000, // 发送 ID (不发送填0)
},
.daemon_config = {
.reload_count = 5, // 守护进程超时周期 (例如5次没收到算离线)
}
};
// 2. 初始化任务
void RobotCMDInit()
{
chassis_power_meter = PowerMeterInit(&hfdcan1);
// 传入配置结构体的地址,而不是直接传 hfdcan1
chassis_power_meter = XidiPowerMeterInit(&xidi_pm_config);
if (chassis_power_meter == NULL)
{
LOGERROR("[CMD] Power Meter Init Failed!");
}
else
{
// 建议加一句成功日志,方便上机调试时确认
LOGINFO("[CMD] Power Meter Init Success!");
}
}
// ==================== 4. 在控制任务中读取使用 ====================
void CmdTask()
{
@@ -33,9 +52,9 @@ void CmdTask()
{
if (chassis_power_meter != NULL)
{
current_power_w = PowerMeterGetPower(chassis_power_meter);
current_voltage_v = PowerMeterGetVoltage(chassis_power_meter);
current_energy_j = PowerMeterGetEnergy(chassis_power_meter);
current_power_w = XidiPowerMeterGetPower(chassis_power_meter);
current_voltage_v = XidiPowerMeterGetVoltage(chassis_power_meter);
current_energy_j = XidiPowerMeterGetEnergy(chassis_power_meter);
// 你可以将获取到的功率写入要发送给底盘的 cmd 中,例如限制最大速度
// chassis_cmd_send.real_power = current_power_w;