mirror of
				https://github.com/goldenfishs/MRobot.git
				synced 2025-11-04 05:23:10 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.2 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 |