151 lines
4.2 KiB
C
151 lines
4.2 KiB
C
#ifndef ODRIVE_CAN_H
|
||
#define ODRIVE_CAN_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"{
|
||
#endif
|
||
|
||
#include "struct_typedef.h"
|
||
#include "device.h"
|
||
|
||
/**
|
||
请在此处更改你设置的节点id,六位,最大0x3f
|
||
*/
|
||
typedef enum
|
||
{
|
||
AXIS0_NODE = 0x010,
|
||
AXIS1_NODE = 0x20
|
||
}node_id_e;
|
||
|
||
|
||
/**
|
||
*下面的内容中**为CANopen内容,odrive不用
|
||
*若标为***,可发送至任意地址
|
||
*若标为*,则为客户端服务器模型,发送时使用RTR,然后接收相同id的信息,对应CANopen SDO
|
||
*若什么都没有标,则为生产者消费者模型,只需发送,对应CANopen PDO
|
||
*大部分cmd_id仅仅是列出,推荐使用odrivetool和gui更改,更加方便快速
|
||
*/
|
||
typedef enum
|
||
{
|
||
//**//NMT消息
|
||
ODRIVE_NMT = 0x000,
|
||
//心跳消息,前四位错误信息,后四位当前状态
|
||
ODRIVE_HEART = 0x001,
|
||
//急停消息
|
||
ODRIVE_STOP = 0x002,
|
||
//*//获取电机错误,前四位为错误信息
|
||
ODRIVE_ERROR_MOTOR = 0x003,
|
||
//*//获取编码器错误,前四位为错误信息
|
||
ODRIVE_ERROR_ENCODER = 0x004,
|
||
//*//获取无传感器错误,前四位为错误信息
|
||
ODRIVE_SENSORLESS_ERROR = 0x005,
|
||
//设置节点id,前四位
|
||
ODRIVE_AXIS_NODE = 0x006,
|
||
//设置请求状态,前四位
|
||
ODRIVE_STATUS = 0x007,
|
||
//设置启动配置
|
||
ODRIVE_AXIS_START = 0x008,
|
||
//*//获取编码器估算值,前四位位置,后四位速度
|
||
ODRIVE_ENCODER_VALUE = 0x009,
|
||
//*//编码器计数值,前四位为shadow,后四位为cpr值
|
||
ODRIVE_ENCODER_COUNT = 0x00A,
|
||
//设置控制模式,前四位控制模式,后四位输入模式
|
||
ODRIVE_CONTROL_MODE = 0x00B,
|
||
//设置目标位置,前四位位置,中两位vel ff,后两位Torque FF,速度限制和力矩限制,若上位机配好了可以给0
|
||
ODRIVE_POS_SET = 0x00C,
|
||
//设置目标速度,前四位速度,后四位torque ff
|
||
ODRIVE_SPEED_SET = 0x00D,
|
||
//设置力矩,前四位力矩
|
||
ODRIVE_TORQUE = 0x00E,
|
||
//设置极限速度,前四位速度
|
||
ODRIVE_SPEED_LIM = 0x00F,
|
||
//开启防嵌齿
|
||
ODRIVE_PREVENT = 0x010,
|
||
//设置梯形模式速度极限,前四位速度
|
||
ODRIVE_TRAJ_SPEED_LIM = 0x011,
|
||
//设置梯形模式加减速极限,前四位加速,后四位减速
|
||
ODRIVE_TRAJ_ACC_LIM = 0x012,
|
||
//设置梯形模式惯性,前四位
|
||
ODRIVE_TRAJ_INERTIA = 0x013,
|
||
//*//获取iq信号
|
||
ODRIVE_IQ = 0x014,
|
||
//*//无传感器估算值,前四位位置,后四位速度
|
||
ODRIVE_SENSORLESS_VALUE = 0x015,
|
||
//***//重启
|
||
ODRIVE_RESATRT = 0x016,
|
||
//***//获取vbus电压
|
||
ODRIVE_VOL = 0x017,
|
||
//清除错误信息
|
||
ODRIVE_CLEARN_ERROR = 0x018
|
||
|
||
}odrive_cmd_e;
|
||
|
||
typedef struct
|
||
{
|
||
fp32 pos;
|
||
fp32 speed;
|
||
}odrive_msg_t;
|
||
|
||
|
||
/**
|
||
* @brief 获取编码器估算值
|
||
* @param node_id 节点id,AXIS0_NODE或者AXIS0_NODE
|
||
* @return device_status_e,若值为0,则为成功
|
||
*/
|
||
device_status_e odrive_get_encode(node_id_e node_id);
|
||
|
||
/**
|
||
* @brief odrive初始化
|
||
* @param none
|
||
* @return device_status_e,若值为0,则为成功
|
||
*/
|
||
device_status_e Odrive_Can_Init(void);
|
||
|
||
/**
|
||
* @brief 速度模式控制电机
|
||
* @param node_id 节点id,AXIS0_NODE或者AXIS0_NODE
|
||
* @param speed 目标速度
|
||
* @return device_status_e,若值为0,则为成功
|
||
*/
|
||
device_status_e odrive_speed_cmd(node_id_e node_id, fp32 speed);
|
||
|
||
/**
|
||
* @brief 位置模式控制电机
|
||
* @param node_id 节点id,AXIS0_NODE或者AXIS1_NODE
|
||
* @param pos 目标位置
|
||
* @param accel 加速度限制
|
||
* @param decel 减速度限制
|
||
* @return device_status_e,若值为0,则为成功
|
||
*/
|
||
device_status_e odrive_accel_cmd(node_id_e node_id, fp32 accel , fp32 decel);
|
||
|
||
/**
|
||
* @brief 位置模式控制电机
|
||
* @param node_id 节点id,AXIS0_NODE或者AXIS1_NODE
|
||
* @param pos 目标位置
|
||
* @param accel 加速度限制
|
||
* @param decel 减速度限制
|
||
* @return device_status_e,若值为0,则为成功
|
||
*/
|
||
device_status_e odrive_pos_cmd(node_id_e node_id, fp32 pos);
|
||
|
||
/**
|
||
* @brief 获取odrive结构体指针
|
||
* @param none
|
||
* @return 信息结构体指针
|
||
*/
|
||
odrive_msg_t* Get_Odrive_Point(void);
|
||
|
||
void odrive_CB(void);
|
||
|
||
void User_Odrive_Can1_CB(void);
|
||
void User_Odrive_Can2_CB(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|