#ifndef __GO_M8010_6_H #define __GO_M8010_6_H #include "struct_typedef.h" #pragma pack(1) /** * @brief 电机模式控制信息 * */ typedef struct { uint8_t id : 4; // 电机ID: 0,1...,13,14 15表示向所有电机广播数据(此时无返回) uint8_t status : 3; // 工作模式: 0.锁定 1.FOC闭环 2.编码器校准 3.保留 uint8_t reserve : 1; // 保留位 } RIS_Mode_t; // 控制模式 1Byte /** * @brief 电机状态控制信息 * */ typedef struct { int16_t tor_des; // 期望关节输出扭矩 unit: N.m (q8) int16_t spd_des; // 期望关节输出速度 unit: rad/s (q8) int32_t pos_des; // 期望关节输出位置 unit: rad (q15) int16_t k_pos; // 期望关节刚度系数 unit: -1.0-1.0 (q15) int16_t k_spd; // 期望关节阻尼系数 unit: -1.0-1.0 (q15) } RIS_Comd_t; // 控制参数 12Byte /** * @brief 电机状态反馈信息 * */ typedef struct { int16_t torque; // 实际关节输出扭矩 unit: N.m (q8) int16_t speed; // 实际关节输出速度 unit: rad/s (q8) int32_t pos; // 实际关节输出位置 unit: rad (q15) int8_t temp; // 电机温度: -128~127°C uint8_t MError : 3; // 电机错误标识: 0.正常 1.过热 2.过流 3.过压 4.编码器故障 5-7.保留 uint16_t force : 12; // 足端气压传感器数据 12bit (0-4095) uint8_t none : 1; // 保留位 } RIS_Fbk_t; // 状态数据 11Byte /** * @brief 控制数据包格式 * */ typedef struct { uint8_t head[2]; // 包头 2Byte RIS_Mode_t mode; // 电机控制模式 1Byte RIS_Comd_t comd; // 电机期望数据 12Byte uint16_t CRC16; // CRC 2Byte } RIS_ControlData_t; // 主机控制命令 17Byte /** * @brief 电机反馈数据包格式 * */ typedef struct { uint8_t head[2]; // 包头 2Byte RIS_Mode_t mode; // 电机控制模式 1Byte RIS_Fbk_t fbk; // 电机反馈数据 11Byte uint16_t CRC16; // CRC 2Byte } RIS_MotorData_t; // 电机返回数据 16Byte #pragma pack() /// @brief 电机指令结构体 typedef struct { unsigned short id; // 电机ID,15代表广播数据包 unsigned short mode; // 0:空闲 1:FOC控制 2:电机标定 float T; // 期望关节的输出力矩(电机本身的力矩)(Nm) float W; // 期望关节速度(电机本身的速度)(rad/s) float Pos; // 期望关节位置(rad) float K_P; // 关节刚度系数(0-25.599) float K_W; // 关节速度系数(0-25.599) } GO_MotorCmd_t; /// @brief 电机反馈结构体 typedef struct { unsigned char motor_id; // 电机ID unsigned char mode; // 0:空闲 1:FOC控制 2:电机标定 int Temp; // 温度 int MError; // 错误码 float T; // 当前实际电机输出力矩(电机本身的力矩)(Nm) float W; // 当前实际电机速度(电机本身的速度)(rad/s) float Pos; // 当前电机位置(rad) int correct; // 接收数据是否完整(1完整,0不完整) int footForce; // 足端力传感器原始数值 uint16_t calc_crc; uint32_t timeout; // 通讯超时 数量 uint32_t bad_msg; // CRC校验错误 数量 RIS_MotorData_t motor_recv_data; // 电机接收数据结构体 } GO_MotorData_t; void modify_data(GO_MotorCmd_t *motor_s); void extract_data(GO_MotorData_t *motor_r); const GO_MotorData_t *get_GO_measure_point(void); void GO_M8010_send_data( GO_MotorCmd_t *cmd); void USART6_RxCompleteCallback(void ); #endif /*__GO_M8010_6_H */