/****************************************************************************** 版权所有 (C), 2018-2099, Radkil ****************************************************************************** 文 件 名 : msp_TI5MOTOR.c 版 本 号 : 初稿 作 者 : radkil 生成日期 : 2026年6月8日 最近修改 : 功能描述 : TI5电机 修改历史 : 1.日 期 : 2026年6月8日 作 者 : radkil 修改内容 : 创建文件 ******************************************************************************/ #include "msp_TI5MOTOR.h" #include "BHBF_robot.h" /*----------------------------------------------* * 外部变量说明 * *----------------------------------------------*/ /*----------------------------------------------* * 外部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 内部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ /*----------------------------------------------* * 模块级变量 * *----------------------------------------------*/ static MotorParameters Motor[4]; static int32_t Motor_ID_Errors[7] = { 0 }; static CSP tempCSP; /*----------------------------------------------* * 常量定义 * *----------------------------------------------*/ /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ #define DF_MSP_Ti5Motor_StartID 0 static int CANSendCommand(uint8_t id, uint8_t command, int32_t *content) { int len = (content != NULL) ? 5 : 1; char buf[10] = {0}; buf[0] = id; buf[1] = command; if (content != NULL) { RD_MEMCPY(&buf[2], content, 4); } return rd_ComWrite(g_ptFDCAN1, (char *)buf, len); } static void Motor_ClearFault(uint8_t id) { CANSendCommand(id, 0x0B, NULL); } static void Motor_GetFaultState(uint8_t id) { CANSendCommand(id, 0x0A, NULL); // set motor stop mode } static void GetCSPByCommand(uint8_t id) { CANSendCommand(id, 0x41, NULL); } static void Motor_SetVelocityModeAndTargetVelocity(uint8_t id, int32_t targetSpeed) { CANSendCommand(id, 0x1d, &targetSpeed); //Motor_SetVelocityModeAndTargetVelocity } static int check_TI5MOTOR(char *buffer, uint32_t length) { TCANUserData *ptCANUserData = (TCANUserData *)g_ptFDCAN1->m_pUserData; uint8_t ID_A_T = (uint8_t)ptCANUserData->m_canrx->Identifier; int32_t Function_code = 0; if (ID_A_T >= DF_MSP_Ti5Motor_StartID && ID_A_T < DF_MSP_Ti5Motor_StartID + 7) { (Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).RxIndex++; } switch (Function_code) { case 3: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Run_Mode, &buffer[1], length - 1); break; case 4: //ma memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Current, &buffer[1], length - 1); break; case 5: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Target_Current, &buffer[1], length - 1); break; case 6: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Velcity, &buffer[1], length - 1); break; case 7: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Target_Velcity, &buffer[1], length - 1); break; case 8: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Position, &buffer[1], length - 1); break; case 9: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Target_Position, &buffer[1], length - 1); break; case 10: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).ERROR_Flag, &buffer[1], length - 1); memcpy(&(Motor_ID_Errors[ID_A_T - DF_MSP_Ti5Motor_StartID]), &buffer[1], length - 1); break; case 49: memcpy( &(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Temperature_Motor, &buffer[1], length - 1); break; case 50: memcpy(&(Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Temperature_PCB, &buffer[1], length - 1); break; case 65: case 66: case 67: case 68: //电流 MA // case 65-68 均返回CSP //tempCSP=&buffer[0]; memcpy(&tempCSP, buffer, 8); (Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Current = tempCSP.Current;//单位为mA (Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Velcity = tempCSP.Velocity;//转化为度每秒公式:(返回值/100/减速比)*360 (Motor[ID_A_T - DF_MSP_Ti5Motor_StartID]).Position = tempCSP.Position;//转化为减速机角度公式:(返回值/65536/减速比)*360 return 8; default: return -1; } return 1; } static void decode_TI5MOTOR(const char *_pBuffer, uint32_t _iSize) { return; } void MoveWheel_Init(void) { TCANUserData *ptCANUserData = CAN_userdata_init(&hfdcan1, 8, 0); g_ptFDCAN1 = rd_ComCreate(check_TI5MOTOR, decode_TI5MOTOR, FDCAN1_Send, CONFIG_UART_BUFFER_SIZE, ptCANUserData); CAN_IT_init(g_ptFDCAN1); for (int i = 1; i < 5; i++) { GetCSPByCommand(i); Rd_Delay(4); Motor_ClearFault(i); Rd_Delay(4); } } void MoveWheel_Task(int32_t Target_Velcity[]) { for (int i = 1; i < 5; i++) { Motor_ClearFault(i); Rd_Delay(4); Motor_GetFaultState(i); Rd_Delay(4); GetCSPByCommand(i); Rd_Delay(4); } for (int i = 1; i < 5; i++) { Motor_SetVelocityModeAndTargetVelocity(i, Target_Velcity[i]); Rd_Delay(4); } }