@ -8,105 +8,109 @@ extern "C"{
# include "usart.h"
# include "string.h"
# include <math.h>
# define GO_NUM 2
# define GO_NUM 3
/**
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> ģ ʽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
* @ brief 电机 模 式 状 态 信 息
*
*/
typedef struct
{
uint8_t id : 4 ; // <EFBFBD> <EFBFBD> <EFBFBD> ID: 0,1...,14 15<31> <35> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> 㲥<EFBFBD> <E3B2A5> <EFBFBD> <EFBFBD> (<28> <> ʱ<EFBFBD> <EFBFBD> <DEB7> <EFBFBD> )
uint8_t status : 3 ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ : 0.<2E> <> <EFBFBD> <EFBFBD> 1.FOC<4F> ջ<EFBFBD> 2.<2E> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У 3.<2E> <> <EFBFBD> <EFBFBD>
uint8_t none : 1 ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ
} RIS_Mode_t /*__attribute__((packed))*/ ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ 1Byte
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 <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ
* @ brief 电机 状 态 控 制 信 息
*
*/
typedef struct
{
int16_t tor_des ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ؽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ť<EFBFBD> <EFBFBD> unit: N.m (q8)
int16_t spd_des ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ؽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ٶ<EFBFBD> unit: rad/s (q7)
int32_t pos_des ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ؽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <EFBFBD> unit: rad (q15)
uint16_t k_pos ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ؽڸն<EFBFBD> ϵ<EFBFBD> <EFBFBD> unit: 0.0-1.0 (q15)
uint16_t k_spd ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ؽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵ<EFBFBD> <EFBFBD> unit: 0.0-1.0 (q15)
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 ; // <EFBFBD> <EFBFBD> <EFBFBD> Ʋ<EFBFBD> <EFBFBD> <EFBFBD> 12Byte
} RIS_Comd_t ; // 控制命令 12Byte
/**
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݰ <EFBFBD> <EFBFBD> <EFBFBD> ʽ
* @ brief 电机 控 制 数 据 包 格 式
*
*/
typedef struct
{
uint8_t head [ 2 ] ; // <EFBFBD> <EFBFBD> ͷ 2Byte
RIS_Mode_t mode ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ 1Byte
RIS_Comd_t comd ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 12Byte
uint16_t CRC16 ; // CRC 2Byte
uint8_t head [ 2 ] ; // 包头 2Byte
RIS_Mode_t mode ; // 电机工作模式 1Byte
RIS_Comd_t comd ; // 电机控制命令 12Byte
uint16_t CRC16 ; // CRC 校验 2Byte
} ControlData_t ; // <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 17Byte
} ControlData_t ; // 电机控制数据包 17Byte
typedef struct {
unsigned short id ; // <20> <> <EFBFBD> ID<49> <44> 0xBB<42> <42> <EFBFBD> <EFBFBD> ȫ<EFBFBD> <C8AB> <EFBFBD> <EFBFBD> <EFBFBD> why<68> <79> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> f<EFBFBD> <66> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> <EFBFBD>
unsigned short mode ; // 0:<3A> <> <EFBFBD> <EFBFBD> , 5:<3A> <> <EFBFBD> <EFBFBD> ת<EFBFBD> <D7AA> , 10:<3A> ջ<EFBFBD> FOC<4F> <43> <EFBFBD> <EFBFBD> why<68> <79> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 1<EFBFBD> ջ<EFBFBD> <D5BB> <EFBFBD> 2У <D0A3> <D7BC>
uint16_t correct ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> <C7B7> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 1 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
int MError ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0.<2E> <> <EFBFBD> <EFBFBD> 1.<2E> <> <EFBFBD> <EFBFBD> 2.<2E> <> <EFBFBD> <EFBFBD> 3.<2E> <> ѹ 4.<2E> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
int Temp ; // <20> ¶<EFBFBD>
float tar_pos ; // target position
float tar_w ; // target speed
float T ; // <20> <> ǰʵ<C7B0> ʵ<EFBFBD> <CAB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float W ; // <20> <> ǰʵ<C7B0> ʵ<EFBFBD> <CAB5> <EFBFBD> ٶȣ <D9B6> <C8A3> <EFBFBD> <EFBFBD> ٣<EFBFBD>
float Pos ; // <20> <> ǰ<EFBFBD> <C7B0> <EFBFBD> λ<EFBFBD> <CEBB>
int footForce ; // They dont even know what 7 is this so we dont update this
uint8_t buffer [ 17 ] ;
uint8_t Rec_buffer [ 16 ] ;
ControlData_t motor_send_data ;
} GO_Motorfield ;
/**
* @ brief <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD>
*/
* @ 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 <EFBFBD> <EFBFBD> <EFBFBD> Ϳ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ input [ in ] huart <EFBFBD> <EFBFBD> <EFBFBD> ô <EFBFBD> <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD>
* @ input [ in ] id <EFBFBD> <EFBFBD> <EFBFBD> ص <EFBFBD> <EFBFBD> id
* @ input [ in ] rev <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD> ֪ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɶ <EFBFBD> õ ģ <EFBFBD> githubΪ <EFBFBD> ش <EFBFBD> issue
* @ input [ in ] T <EFBFBD> <EFBFBD> <EFBFBD> أ <EFBFBD> <EFBFBD> <EFBFBD> λ N <EFBFBD> <EFBFBD> m
* @ input [ in ] Pos Ŀ <EFBFBD> <EFBFBD> λ <EFBFBD> ã <EFBFBD> <EFBFBD> <EFBFBD> λ rad
* @ input [ in ] W Ŀ <EFBFBD> <EFBFBD> <EFBFBD> ٶ ȣ <EFBFBD> <EFBFBD> <EFBFBD> λ rad / s
* @ input [ in ] K_P λ <EFBFBD> û <EFBFBD> <EFBFBD> <EFBFBD> kp
* @ input [ in ] K_W <EFBFBD> ٶ Ȼ <EFBFBD> kp
* @ note <EFBFBD> <EFBFBD> <EFBFBD> ƹ <EFBFBD> ʽ <EFBFBD> <EFBFBD> t = T + <EFBFBD> <EFBFBD> <EFBFBD> 趨 λ <EFBFBD> <EFBFBD> - ʵ <EFBFBD> <EFBFBD> λ <EFBFBD> ã <EFBFBD> * K_P + <EFBFBD> <EFBFBD> <EFBFBD> 趨 <EFBFBD> ٶ <EFBFBD> - ʵ <EFBFBD> <EFBFBD> <EFBFBD> ٶ ȣ <EFBFBD> * K_W
*/
void GO_M8010_send_data ( UART_HandleTypeDef * huart , int id , int rev , float T , float W , float Pos , float K_P , float K_W ) ;
* @ 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 <EFBFBD> û <EFBFBD> <EFBFBD> Զ <EFBFBD> <EFBFBD> 崮 <EFBFBD> ڷ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ж ϻ ص <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
*/
* @ brief 用 户 自 定 义 挂 载 发 送 完 成 中 断 回 调 函 数
*/
void uartTxCB ( UART_HandleTypeDef * huart ) ;
// <EFBFBD> <EFBFBD> λ<EFBFBD> <EFBFBD> Ͽ<EFBFBD> <EFBFBD> <EFBFBD>
// 基础力控函数
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 <EFBFBD> <EFBFBD> <EFBFBD> Ϳ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* @ input [ in ] id <EFBFBD> <EFBFBD> <EFBFBD> ص <EFBFBD> <EFBFBD> id
* @ revtal <EFBFBD> <EFBFBD> <EFBFBD> ص <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD>
*/
* @ brief go获取电机指针
* @ input [ in ] id 电 机 的 id
* @ revtal 返 回 电 机 的 指 针
*/
GO_Motorfield * getGoPoint ( uint8_t id ) ;
# ifdef __cplusplus