shoot/User/device/GO_M8010_6_Driver.h

120 lines
3.5 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.

#ifndef __GO_M8010_6_H
#define __GO_M8010_6_H
#ifdef __cplusplus
extern "C"{
#endif
#include "main.h"
#include "crc_ccitt.h"
#include "usart.h"
#include "string.h"
#include <math.h>
#define GO_NUM 3
/**
* @brief 电机模式状态信息
*
*/
typedef struct
{
uint8_t id :4; // 电机ID: 0,1...,14 15表示广播模式(暂时无法用)
uint8_t status :3; // 工作模式: 0.停止 1.FOC校准 2.编码器校准 3.运行
uint8_t none :1; // 保留位
} RIS_Mode_t /*__attribute__((packed))*/; // 电机模式 1Byte
/**
* @brief 电机状态控制信息
*
*/
typedef struct
{
int16_t tor_des; // 电机目标力矩 unit: N.m (q8)
int16_t spd_des; // 电机目标速度 unit: rad/s (q7)
int32_t pos_des; // 电机目标位置 unit: rad (q15)
uint16_t k_pos; // 电机位置环系数 unit: 0.0-1.0 (q15)
uint16_t k_spd; // 电机速度环系数 unit: 0.0-1.0 (q15)
} RIS_Comd_t; // 控制命令 12Byte
/**
* @brief 电机控制数据包格式
*
*/
typedef struct
{
uint8_t head[2]; // 包头 2Byte
RIS_Mode_t mode; // 电机工作模式 1Byte
RIS_Comd_t comd; // 电机控制命令 12Byte
uint16_t CRC16; // CRC校验 2Byte
} ControlData_t; // 电机控制数据包 17Byte
/**
* @brief 电机状态信息结构体
*
*/
typedef struct {
unsigned short id; // 电机ID, 0xBB表示广播
unsigned short mode; // 工作模式: 0.停止 5.正转 10.FOC控制
uint16_t correct; // 校正状态: 1.校正完成 0.未校正
int MError; // 电机错误: 0.正常 1.过流 2.过载 3.欠压 4.过温
int Temp; // 温度
float tar_pos; // 目标位置
float tar_w; // 目标速度
float T; // 当前实际力矩
float W; // 当前实际速度 (单位: rad/s)
float Pos; // 当前实际位置
int footForce; // 预留字段, 暂未使用
uint8_t buffer[17]; // 数据发送缓冲区
uint8_t Rec_buffer[16]; // 数据接收缓冲区
ControlData_t motor_send_data; // 电机控制数据结构
} GO_Motorfield;
/**
*@brief 电机初始化
*/
void GO_M8010_init(void);
/**
*@brief go发送控制命令
*@input[in] huart 所用串口指针
*@input[in] id 被控电机id
*@input[in] rev 暂时不知道干啥用的github为回答issue
*@input[in] T 力矩单位N·m
*@input[in] Pos 目标位置单位rad
*@input[in] W 目标速度单位rad/s
*@input[in] K_P 位置环kp
*@input[in] K_W 速度环kp
*@note 控制公式 t = T + (设定位置 - 实际位置)*K_P + (设定速度 - 实际速度)*K_W
*/
void GO_M8010_send_data(UART_HandleTypeDef *huart,int id, int rev,float T,float Pos,float W,float K_P,float K_W);
/**
*@brief 用户自定义挂载发送完成中断回调函数
*/
void uartTxCB(UART_HandleTypeDef *huart);
// 基础力控函数
void basic_ForceControl (UART_HandleTypeDef *huart, int id, float bias, float length, float mass,
float tar_pos, float tar_w, float K_P,float K_W);
/**
*@brief go获取电机指针
*@input[in] id 电机的id
*@revtal 返回电机的指针
*/
GO_Motorfield* getGoPoint(uint8_t id);
#ifdef __cplusplus
}
#endif
#endif /*__GO_M8010_6_H */