You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

160 lines
5.3 KiB

/******************************************************************************
版权所有 (C), 2018-2099, Radkil
******************************************************************************
文 件 名 : motor_protocol.h
版 本 号 : 初稿
作 者 : radkil
生成日期 : 2026年7月13日
最近修改 :
功能描述 : 电机协议抽象层接口定义
修改历史 :
1.日 期 : 2026年7月13日
作 者 : radkil
修改内容 : 创建文件
******************************************************************************/
#ifndef __MOTOR_PROTOCOL_H__
#define __MOTOR_PROTOCOL_H__
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
/*==============================================*
* include header files *
*----------------------------------------------*/
#include "common.h"
#include "slist.h"
#include "com.h"
/*==============================================*
* constants or macros define *
*----------------------------------------------*/
#define MOTOR_MAX_NAME_LEN 16
/*==============================================*
* data structures *
*----------------------------------------------*/
// 电机状态枚举
typedef enum {
MOTOR_STATE_IDLE = 0, // 空闲
MOTOR_STATE_INIT, // 初始化中
MOTOR_STATE_READY, // 就绪
MOTOR_STATE_RUNNING, // 运行中
MOTOR_STATE_ERROR, // 错误
} Motor_State_e;
// 电机运行数据
typedef struct {
int32_t m_iRealPosition; // 实际位置(脉冲)
int32_t m_iRealVelocity; // 实际速度(脉冲/秒)
int32_t m_iRealTorque; // 实际转矩
uint32_t m_uiFaultCode; // 故障码
double m_dRealDistance; // 实际距离(米)
int32_t m_iStartMeasurePos; // 测量起始位置
int32_t m_iLastPosition; // 上次位置
int32_t m_iRoundCount; // 圈数计数
uint8_t m_ucStartMeasureFlag; // 开始测量标志
} Motor_Data_t;
// 电机物理配置
typedef struct {
uint8_t m_ucMotorID; // 电机节点ID
uint32_t m_uiPulsePerRound; // 每圈脉冲数
uint32_t m_uiReductionRatio; // 减速比
float m_fWheelDiameter; // 轮直径(米)
} Motor_Config_t;
// 前向声明
struct Motor_Instance;
// 协议操作函数表(虚函数表)
typedef struct {
// 协议名称
char m_szName[MOTOR_MAX_NAME_LEN];
// 初始化电机(协议特定的初始化序列)
int (*pfInit)(struct Motor_Instance *pstMotor);
// 复位所有节点
int (*pfResetAll)(struct Motor_Instance *pstMotor);
// 激活所有节点
int (*pfActivateAll)(struct Motor_Instance *pstMotor);
// 设置当前位置为零点
int (*pfSetHome)(struct Motor_Instance *pstMotor);
// 设置看门狗时间
int (*pfSetWatchdog)(struct Motor_Instance *pstMotor, uint32_t uiTimeMs);
// 读取电机位置
int (*pfRequestPosition)(struct Motor_Instance *pstMotor);
// 读取电机速度
int (*pfRequestVelocity)(struct Motor_Instance *pstMotor);
// 读取电机电流/转矩
int (*pfRequestTorque)(struct Motor_Instance *pstMotor);
// 读取故障码
int (*pfRequestFault)(struct Motor_Instance *pstMotor);
// 速度模式初始化
int (*pfSpeedModeInit)(struct Motor_Instance *pstMotor);
// 设置目标速度
int (*pfSetTargetSpeed)(struct Motor_Instance *pstMotor, int32_t iTargetSpeed);
// 位置模式初始化
int (*pfPositionModeInit)(struct Motor_Instance *pstMotor, int32_t iAccel, int32_t iDecel, int32_t iTargetSpeed);
// 设置目标位置(相对运动)
int (*pfSetTargetPosition)(struct Motor_Instance *pstMotor, int32_t iTargetPos);
// 设置数字输出
int (*pfSetDO)(struct Motor_Instance *pstMotor, uint8_t ucDoIndex, uint8_t ucState);
// 解析CAN响应数据
int (*pfParseResponse)(struct Motor_Instance *pstMotor, const uint8_t *pucData, uint32_t uiLen);
// 速度单位转换:用户单位 -> 脉冲/秒
int32_t (*pfSpeedConvert)(struct Motor_Instance *pstMotor, int32_t iSpeedUserUnit);
} Motor_Protocol_t;
// 电机实例结构体
typedef struct Motor_Instance {
rd_slist_t node; // slist链表节点
char m_szName[MOTOR_MAX_NAME_LEN]; // 实例名称
Motor_Config_t m_stConfig; // 配置
Motor_Data_t m_stData; // 运行数据
Motor_State_e m_eState; // 状态
TComCtrl *m_ptCAN; // 绑定的CAN控制器
uint32_t m_uiLastHeartbeat; // 上次心跳时间
const Motor_Protocol_t *m_pstProtocol; // 协议操作函数表
void *m_pstPrivData; // 协议私有数据
} Motor_Instance_t;
/*==============================================*
* project-wide global variables *
*----------------------------------------------*/
/*==============================================*
* routines' or functions' implementations *
*----------------------------------------------*/
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __MOTOR_PROTOCOL_H__ */