MRobot/assets/User_code/device/motor_rm.h
2025-08-09 03:30:14 +08:00

128 lines
3.2 KiB
C
Raw 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.

#pragma once
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ----------------------------------------------------------------- */
#include "device/device.h"
#include "device/motor.h"
#include "bsp/can.h"
/* Exported constants ------------------------------------------------------- */
#define MOTOR_RM_MAX_MOTORS 11 /* 最大电机数量 */
/* Exported macro ----------------------------------------------------------- */
/* Exported types ----------------------------------------------------------- */
typedef enum {
MOTOR_M2006,
MOTOR_M3508,
MOTOR_GM6020,
} MOTOR_RM_Module_t;
/*一个can最多控制11个电机*/
typedef union {
int16_t output[MOTOR_RM_MAX_MOTORS];
struct {
int16_t m3508_m2006_id201;
int16_t m3508_m2006_id202;
int16_t m3508_m2006_id203;
int16_t m3508_m2006_id204;
int16_t m3508_m2006_gm6020_id205;
int16_t m3508_m2006_gm6020_id206;
int16_t m3508_m2006_gm6020_id207;
int16_t m3508_m2006_gm6020_id208;
int16_t gm6020_id209;
int16_t gm6020_id20A;
int16_t gm6020_id20B;
} named;
} MOTOR_RM_MsgOutput_t;
/*注册电机时候每个电机需要的参数*/
typedef struct {
BSP_CAN_t can;
uint16_t id; // 实际CAN ID如0x201, 0x205等
MOTOR_RM_Module_t module;
bool reverse;
} MOTOR_RM_Param_t;
typedef struct MOTOR_RM_t {
MOTOR_RM_Param_t param;
MOTOR_t motor;
} MOTOR_RM_t;
typedef struct {
BSP_CAN_t can;
MOTOR_RM_MsgOutput_t output_msg;
MOTOR_RM_t *motors[MOTOR_RM_MAX_MOTORS]; // 最多15个电机
uint8_t motor_count;
} MOTOR_RM_CANManager_t;
/* Exported functions prototypes -------------------------------------------- */
/**
* @brief 注册一个RM电机
* @param param 电机参数
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_Register(MOTOR_RM_Param_t *param);
/**
* @brief 更新单个电机数据
* @param can CAN通道
* @param id 电机实际CAN ID
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_Update(BSP_CAN_t can, uint16_t id);
/**
* @brief 更新所有注册了的电机数据
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_UpdateAll(void);
/**
* @brief 设置电机输出值
* @param can CAN通道
* @param id 电机实际CAN ID
* @param value 输出值(归一化,-1.0到1.0
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_SetOutput(BSP_CAN_t can, uint16_t id, float value);
/**
* @brief 发送电机控制命令
* @param can CAN通道
* @param ctrl_id 控制帧ID0x200, 0x1ff, 0x2ff
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_Ctrl(BSP_CAN_t can, uint16_t ctrl_id);
/**
* @brief 获取电机实例
* @param can CAN通道
* @param id 电机实际CAN ID
* @return 电机实例指针失败返回NULL
*/
MOTOR_RM_t* MOTOR_RM_GetMotor(BSP_CAN_t can, uint16_t id);
/**
* @brief 使电机松弛设置输出为0
* @param can CAN通道
* @param id 电机实际CAN ID
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_Relax(BSP_CAN_t can, uint16_t id);
/**
* @brief 使电机离线输出为0并标记为不在线
* @param can CAN通道
* @param id 电机实际CAN ID
* @return 0 成功,其他值失败
*/
int8_t MOTOR_RM_Offine(BSP_CAN_t can, uint16_t id);
#ifdef __cplusplus
}
#endif