mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-09-14 12:54:33 +08:00
146 lines
3.3 KiB
C
146 lines
3.3 KiB
C
#pragma once
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include "device/device.h"
|
||
#include "device/motor.h"
|
||
#include "bsp/can.h"
|
||
|
||
/* Private define ----------------------------------------------------------- */
|
||
#define wtrcfg_VESC_COMMAND_DUTY_MAX 100
|
||
#define wtrcfg_VESC_COMMAND_CURRENT_MAX 10
|
||
#define wtrcfg_VESC_COMMAND_POS_MAX 360
|
||
#define wtrcfg_VESC_COMMAND_ERPM_MAX 35000
|
||
#define wtrcfg_VESC_UART_TIMEOUT 0xff
|
||
|
||
// VESC数量根据实际情况调整
|
||
#define VESC_MAX_MOTORS 4
|
||
|
||
/* Exported constants ------------------------------------------------------- */
|
||
|
||
/* Exported macro ----------------------------------------------------------- */
|
||
/* Exported types ----------------------------------------------------------- */
|
||
|
||
typedef enum
|
||
{
|
||
VESC_1 = 1,
|
||
VESC_2 = 2,
|
||
VESC_3 = 3,
|
||
VESC_4 = 4,
|
||
CAN_VESC5065_M1_MSG1 = 0x901, // vesc的数据回传使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
|
||
CAN_VESC5065_M2_MSG1 = 0x902,
|
||
CAN_VESC5065_M3_MSG1 = 0x903,
|
||
CAN_VESC5065_M4_MSG1 = 0x904,
|
||
}VESC_ID;
|
||
|
||
typedef enum
|
||
{
|
||
CAN_PACKET_SET_DUTY = 0,
|
||
CAN_PACKET_SET_CURRENT = 1,
|
||
CAN_PACKET_SET_CURRENT_BRAKE = 2,
|
||
CAN_PACKET_SET_RPM = 3,
|
||
CAN_PACKET_SET_POS = 4,
|
||
CAN_PACKET_FILL_RX_BUFFER = 5,
|
||
CAN_PACKET_FILL_RX_BUFFER_LONG = 6,
|
||
CAN_PACKET_PROCESS_RX_BUFFER = 7,
|
||
CAN_PACKET_PROCESS_SHORT_BUFFER = 8,
|
||
CAN_PACKET_STATUS = 9,
|
||
CAN_PACKET_SET_CURRENT_REL = 10,
|
||
CAN_PACKET_SET_CURRENT_BRAKE_REL = 11,
|
||
CAN_PACKET_SET_CURRENT_HANDBRAKE = 12,
|
||
CAN_PACKET_SET_CURRENT_HANDBRAKE_REL = 13
|
||
} CAN_PACKET_ID;
|
||
|
||
// Control Modes
|
||
typedef enum
|
||
{
|
||
DUTY_CONTROL = 0x0,
|
||
RPM_CONTROL = 0x1,
|
||
CURRENT_CONTROL = 0x2,
|
||
POSITION_CONTROL = 0x3
|
||
} Control_Mode;
|
||
|
||
/*每个电机需要的参数*/
|
||
typedef struct
|
||
{
|
||
BSP_CAN_t can;
|
||
uint16_t id;
|
||
uint16_t mode;
|
||
bool reverse;
|
||
} VESC_Param_t;
|
||
|
||
/*电机实例*/
|
||
typedef struct ODrive_t
|
||
{
|
||
VESC_Param_t param;
|
||
MOTOR_t motor;
|
||
} VESC_t;
|
||
|
||
/*CAN管理器,管理一个CAN总线上所有的电机*/
|
||
typedef struct
|
||
{
|
||
BSP_CAN_t can;
|
||
VESC_t *motors[VESC_MAX_MOTORS];
|
||
uint8_t motor_count;
|
||
} VESC_CANManager_t;
|
||
|
||
/* Exported functions prototypes -------------------------------------------- */
|
||
|
||
/**
|
||
* @brief 注册一个vesc电机
|
||
* @param param 电机参数
|
||
* @return
|
||
*/
|
||
int8_t VESC_Register(VESC_Param_t *param);
|
||
|
||
/**
|
||
* @brief 更新指定电机数据
|
||
* @param param 电机参数
|
||
* @return
|
||
*/
|
||
int8_t VESC_Update(VESC_Param_t *param);
|
||
|
||
/**
|
||
* @brief 更新所有电机数据
|
||
* @return
|
||
*/
|
||
int8_t VESC_UpdateAll(void);
|
||
|
||
/**
|
||
* @brief 设置一个电机的输出
|
||
* @param param 电机参数
|
||
* @param value 输出值
|
||
* @return
|
||
*/
|
||
|
||
int8_t VESC_SetOutput(VESC_Param_t *param, float value);
|
||
|
||
/**
|
||
* @brief 获取指定电机的实例指针
|
||
* @param param 电机参数
|
||
* @return
|
||
*/
|
||
|
||
VESC_t* VESC_GetMotor(VESC_Param_t *param);
|
||
|
||
/**
|
||
* @brief 使电机松弛(设置输出为0)
|
||
* @param param
|
||
* @return
|
||
*/
|
||
int8_t VESC_Relax(VESC_Param_t *param);
|
||
/**
|
||
* @brief 使电机离线(设置在线状态为false)
|
||
* @param param
|
||
* @return
|
||
*/
|
||
int8_t VESC_Offine(VESC_Param_t *param);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif |