diff --git a/Core/Src/usart.c b/Core/Src/usart.c index cee4f04..48ece78 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -102,7 +102,7 @@ void MX_USART6_UART_Init(void) /* USER CODE END USART6_Init 1 */ huart6.Instance = USART6; - huart6.Init.BaudRate = 115200; + huart6.Init.BaudRate = 4000000; huart6.Init.WordLength = UART_WORDLENGTH_8B; huart6.Init.StopBits = UART_STOPBITS_1; huart6.Init.Parity = UART_PARITY_NONE; diff --git a/User/bsp/uart_it.c b/User/bsp/uart_it.c index 8c8916f..abccf21 100644 --- a/User/bsp/uart_it.c +++ b/User/bsp/uart_it.c @@ -31,7 +31,7 @@ UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart) { case BSP_UART_REF: return &huart1; case BSP_UART_AI: - return &huart6; + return &huart1;//NUC使用的是USART1 /* case BSP_UART_XXX: return &huartX; diff --git a/User/device/GO_M8010_6_Driver.c b/User/device/GO_M8010_6_Driver.c index 5d85473..2e9a4d4 100644 --- a/User/device/GO_M8010_6_Driver.c +++ b/User/device/GO_M8010_6_Driver.c @@ -36,7 +36,8 @@ void GO_M8010_init (){ } //暂存接收数据 -static uint8_t Temp_buffer[16]; +//static uint8_t Temp_buffer[16]; + uint8_t Temp_buffer[16]; //dma传输完成后进入此回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { @@ -45,7 +46,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) if ((Temp_buffer[14] != (crc&0xFF)) || (Temp_buffer[15] != ((crc>>8) & 0xFF))) { HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET); //蓝色灯亮 // indicate CRC incorrect - HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET); //红色灯灭 + HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_G_Pin, GPIO_PIN_SET); //红色灯灭 return; } // CRC pass and start converting data to the motor diff --git a/User/device/GO_M8010_6_Driver.h b/User/device/GO_M8010_6_Driver.h index c912293..fbb5b0c 100644 --- a/User/device/GO_M8010_6_Driver.h +++ b/User/device/GO_M8010_6_Driver.h @@ -8,105 +8,109 @@ extern "C"{ #include "usart.h" #include "string.h" #include -#define GO_NUM 2 +#define GO_NUM 3 /** - * @brief ���ģʽ������Ϣ + * @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 + 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 ���״̬������Ϣ + * @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) + 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 +} RIS_Comd_t; // 控制命令 12Byte /** - * @brief �������ݰ���ʽ + * @brief 电机控制数据包格式 * */ typedef struct { - uint8_t head[2]; // ��ͷ 2Byte - RIS_Mode_t mode; // �������ģʽ 1Byte - RIS_Comd_t comd; // ����������� 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; // ������������ 17Byte +} ControlData_t; // 电机控制数据包 17Byte -typedef struct { - unsigned short id; // ���ID��0xBB����ȫ����� why������f�������е���� - unsigned short mode; // 0:����, 5:����ת��, 10:�ջ�FOC���� why������1�ջ���2У׼�� - uint16_t correct; // ���������Ƿ����� ��1 ������0�������� - int MError; // ������ 0.���� 1.���� 2.���� 3.��ѹ 4.���������� - int Temp; // �¶� - float tar_pos; // target position - float tar_w; // target speed - float T; // ��ǰʵ�ʵ��������� - float W; // ��ǰʵ�ʵ���ٶȣ����٣� - float Pos; // ��ǰ���λ�� - 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 �����ʼ�� - */ + * @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 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 �û��Զ��崮�ڷ�������жϻص����� - */ + *@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 ���ص������ָ�� - */ + *@brief go获取电机指针 + *@input[in] id 电机的id + *@revtal 返回电机的指针 + */ GO_Motorfield* getGoPoint(uint8_t id); #ifdef __cplusplus diff --git a/User/module/go.c b/User/module/go.c index 19d4a80..aa971ac 100644 --- a/User/module/go.c +++ b/User/module/go.c @@ -40,8 +40,11 @@ void gimbalFlow(void) { //用485模块发送数据有问题 GO_M8010_send_data(&huart1, 0,0,0,go.angleSetgo[0],1,KP,KD); + //串口6发送数据没有问题 GO_M8010_send_data(&huart6, 0,0,0,go.angleSetgo[0],1,KP,KD); + GO_M8010_send_data(&huart6, 1,0,0,go.angleSetgo[0],1,KP,KD); + GO_M8010_send_data(&huart6, 2,0,0,go.angleSetgo[0],1,KP,KD); osDelay(1); diff --git a/User/task/go_task.c b/User/task/go_task.c index 5137263..2a8cea0 100644 --- a/User/task/go_task.c +++ b/User/task/go_task.c @@ -15,15 +15,16 @@ void Task_Go(void *argument) { #if GOUSE==1 - //HAL_Delay(2000); -// gimbalInit(); - //HAL_GPIO_WritePin(ledGreen_GPIO_Port,ledGreen_Pin,GPIO_PIN_RESET); + HAL_Delay(2000); + gimbalInit(); + HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin,GPIO_PIN_RESET); while(1) { - LED_green(); - // gimbalFlow(); + //LED_green(); + //LED_bule(); + gimbalFlow(); osDelay(1); } #else diff --git a/User/task/led_task.c b/User/task/led_task.c index bc26e8c..58f61ad 100644 --- a/User/task/led_task.c +++ b/User/task/led_task.c @@ -13,8 +13,8 @@ void Task_Led(void *argument) { // LED_red(); // LED_bule(); // see_you_again(); - // LED_green(); + LED_green(); - // osDelay(500); + osDelay(500); } }