8 changed files with 404 additions and 397 deletions
@ -1,89 +0,0 @@ |
|||
/******************************************************************************
|
|||
|
|||
版权所有 (C), 2018-2099, Radkil |
|||
|
|||
****************************************************************************** |
|||
文 件 名 : paint_robot_new.h |
|||
版 本 号 : 初稿 |
|||
作 者 : radkil |
|||
生成日期 : 2026年7月14日 |
|||
最近修改 : |
|||
功能描述 : paint_robot_new.c 的头文件 |
|||
|
|||
修改历史 : |
|||
1.日 期 : 2026年7月14日 |
|||
作 者 : radkil |
|||
修改内容 : 创建文件 |
|||
|
|||
******************************************************************************/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部变量说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 内部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 全局变量 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 模块级变量 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 常量定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 宏定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
#ifndef __PAINT_ROBOT_NEW_H__ |
|||
#define __PAINT_ROBOT_NEW_H__ |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
#if __cplusplus |
|||
extern "C"{ |
|||
#endif |
|||
#endif /* __cplusplus */ |
|||
|
|||
|
|||
/*==============================================*
|
|||
* include header files * |
|||
*----------------------------------------------*/ |
|||
#include <stdint.h> |
|||
|
|||
|
|||
|
|||
/*==============================================*
|
|||
* constants or macros define * |
|||
*----------------------------------------------*/ |
|||
|
|||
|
|||
/*==============================================*
|
|||
* project-wide global variables * |
|||
*----------------------------------------------*/ |
|||
|
|||
|
|||
|
|||
/*==============================================*
|
|||
* routines' or functions' implementations * |
|||
*----------------------------------------------*/ |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
#if __cplusplus |
|||
} |
|||
#endif |
|||
#endif /* __cplusplus */ |
|||
|
|||
|
|||
#endif /* __PAINT_ROBOT_NEW_H__ */ |
|||
@ -0,0 +1,140 @@ |
|||
/******************************************************************************
|
|||
|
|||
版权所有 (C), 2018-2099, Radkil |
|||
|
|||
****************************************************************************** |
|||
文 件 名 : paint_robot_new_MK32.c |
|||
版 本 号 : 初稿 |
|||
作 者 : radkil |
|||
生成日期 : 2026年8月21日 |
|||
最近修改 : |
|||
功能描述 : 新喷涂机器人遥控器逻辑 |
|||
|
|||
修改历史 : |
|||
1.日 期 : 2026年8月21日 |
|||
作 者 : radkil |
|||
修改内容 : 创建文件 |
|||
|
|||
******************************************************************************/ |
|||
#include "BHBF.h" |
|||
#include "Protobuf/PSource/msp_MK32.pb.h" |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部变量说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 内部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 全局变量 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 模块级变量 * |
|||
*----------------------------------------------*/ |
|||
static SP_MSP_MK32_Button RB_MK32; |
|||
|
|||
/*----------------------------------------------*
|
|||
* 常量定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 宏定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
int check_MK32(char *_pBuffer, uint32_t _iSize) |
|||
{ |
|||
if (_iSize < 25) return 0; // 数据不足25字节,不读[24]不误判,等下一包
|
|||
if (_pBuffer[0] != 0x0f) return -1; |
|||
if (_pBuffer[24] != 0x00) return -1; |
|||
return 25; |
|||
} |
|||
|
|||
void decode_MK32(const char *buf, uint32_t _iSize) |
|||
{ |
|||
int32_t CH[16]; |
|||
int Start_byte = 0; |
|||
|
|||
CH[0] = ((buf[Start_byte + 1] | buf[Start_byte + 2] << 8) & 0x07FF); |
|||
CH[1] = ((buf[Start_byte + 2] >> 3 | buf[Start_byte + 3] << 5) & 0x07FF); |
|||
CH[2] = ((buf[Start_byte + 3] >> 6 | buf[Start_byte + 4] << 2 |
|||
| buf[Start_byte + 5] << 10) & 0x07FF); |
|||
CH[3] = ((buf[Start_byte + 5] >> 1 | buf[Start_byte + 6] << 7) & 0x07FF); |
|||
CH[4] = ((buf[Start_byte + 6] >> 4 | buf[Start_byte + 7] << 4) & 0x07FF); |
|||
CH[5] = ((buf[Start_byte + 7] >> 7 | buf[Start_byte + 8] << 1 |
|||
| buf[Start_byte + 9] << 9) & 0x07FF); |
|||
CH[6] = ((buf[Start_byte + 9] >> 2 | buf[Start_byte + 10] << 6) & 0x07FF); |
|||
CH[7] = ((buf[Start_byte + 10] >> 5 | buf[Start_byte + 11] << 3) & 0x07FF); |
|||
CH[8] = ((buf[Start_byte + 12] | buf[Start_byte + 13] << 8) & 0x07FF); |
|||
CH[9] = ((buf[Start_byte + 13] >> 3 | buf[Start_byte + 14] << 5) & 0x07FF); |
|||
CH[10] = ((buf[Start_byte + 14] >> 6 | buf[Start_byte + 15] << 2 |
|||
| buf[Start_byte + 16] << 10) & 0x07FF); |
|||
CH[11] = ((buf[Start_byte + 16] >> 1 | buf[Start_byte + 17] << 7) & 0x07FF); |
|||
CH[12] = ((buf[Start_byte + 17] >> 4 | buf[Start_byte + 18] << 4) & 0x07FF); |
|||
CH[13] = ((buf[Start_byte + 18] >> 7 | buf[Start_byte + 19] << 1 |
|||
| buf[Start_byte + 20] << 9) & 0x07FF); |
|||
CH[14] = ((buf[Start_byte + 20] >> 2 | buf[Start_byte + 21] << 6) & 0x07FF); |
|||
CH[15] = ((buf[Start_byte + 21] >> 5 | buf[Start_byte + 22] << 3) & 0x07FF); |
|||
|
|||
// 按键数值转换:1050为中间值,272-1712
|
|||
for (int i = 0; i < 16; i++) |
|||
{ |
|||
CH[i] = (int32_t)((CH[i] - 992) * 1.388889); |
|||
} |
|||
|
|||
RD_MEMCPY(&(RB_MK32.CH0_RY_H), CH, sizeof(CH)); |
|||
|
|||
if (buf[23] == 0) |
|||
{ |
|||
RB_MK32.IsOnline = 1; |
|||
} |
|||
else |
|||
{ |
|||
RB_MK32.IsOnline = 0; |
|||
} |
|||
RB_MK32.RxIndex++; |
|||
|
|||
int angle; |
|||
angle = atan2(RB_MK32.CH1_RY_V, RB_MK32.CH0_RY_H) * 180 / M_PI; |
|||
|
|||
if(RB_MK32.CH5_SB == 0) |
|||
{ |
|||
// 前进
|
|||
if((angle >= 45) && (angle <= 135)) |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_FORWARD, NULL, 0); |
|||
} |
|||
// 后退
|
|||
else if((angle >= -135) && (angle < -45)) |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_BACKWARD, NULL, 0); |
|||
} |
|||
else |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_STOP_ALL, NULL, 0); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
// 前进
|
|||
if((angle >= 45) && (angle <= 135)) |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_FORWARD, NULL, 0); |
|||
} |
|||
// 后退
|
|||
else if((angle >= -135) && (angle < -45)) |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_BACKWARD, NULL, 0); |
|||
} |
|||
else |
|||
{ |
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_STOP_ALL, NULL, 0); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,243 @@ |
|||
/******************************************************************************
|
|||
|
|||
版权所有 (C), 2018-2099, Radkil |
|||
|
|||
****************************************************************************** |
|||
文 件 名 : paint_robot_new_motors.c |
|||
版 本 号 : 初稿 |
|||
作 者 : radkil |
|||
生成日期 : 2026年8月21日 |
|||
最近修改 : |
|||
功能描述 : 喷涂机器人电机逻辑 |
|||
|
|||
修改历史 : |
|||
1.日 期 : 2026年8月21日 |
|||
作 者 : radkil |
|||
修改内容 : 创建文件 |
|||
|
|||
******************************************************************************/ |
|||
#include "BHBF.h" |
|||
#include "motor_manager.h" |
|||
#include "msp_motor_leisai.h" |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部变量说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 外部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 内部函数原型说明 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 全局变量 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 模块级变量 * |
|||
*----------------------------------------------*/ |
|||
static Motor_Instance_t *g_apstMotors[MOTOR_INSTANCE_MAX] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; |
|||
static uint32_t g_uiMotorModuleID = 0; |
|||
|
|||
/*----------------------------------------------*
|
|||
* 常量定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
/*----------------------------------------------*
|
|||
* 宏定义 * |
|||
*----------------------------------------------*/ |
|||
|
|||
static void Motor_ModuleHandler(const Msg_t *pstMsg) |
|||
{ |
|||
if (NULL == pstMsg) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
switch (pstMsg->m_uiMsgID) |
|||
{ |
|||
case MOTOR_CMD_SET_SPEED: |
|||
{ |
|||
if (pstMsg->m_uiDataLen >= sizeof(Motor_CmdData_t)) |
|||
{ |
|||
Motor_CmdData_t *pstData = (Motor_CmdData_t *)pstMsg->m_aucData; |
|||
if (pstData->m_ucMotorIndex < 2 && g_apstMotors[pstData->m_ucMotorIndex] != NULL) |
|||
{ |
|||
MotorMgr_SetTargetSpeed(g_apstMotors[pstData->m_ucMotorIndex], pstData->m_iValue); |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
case MOTOR_CMD_STOP: |
|||
{ |
|||
for (int i = 0; i < 2; i++) |
|||
{ |
|||
if (g_apstMotors[i] != NULL) |
|||
{ |
|||
MotorMgr_SetTargetSpeed(g_apstMotors[i], 0); |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
case MOTOR_CMD_SET_HOME: |
|||
{ |
|||
if (pstMsg->m_uiDataLen >= sizeof(Motor_CmdData_t)) |
|||
{ |
|||
Motor_CmdData_t *pstData = (Motor_CmdData_t *)pstMsg->m_aucData; |
|||
if (pstData->m_ucMotorIndex < 2 && g_apstMotors[pstData->m_ucMotorIndex] != NULL) |
|||
{ |
|||
MotorMgr_SetHome(g_apstMotors[pstData->m_ucMotorIndex]); |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
case MOTOR_CMD_GET_STATUS: |
|||
{ |
|||
// 回复状态给请求者
|
|||
Motor_StatusData_t stStatus; |
|||
for (int i = 0; i < 2; i++) |
|||
{ |
|||
if (g_apstMotors[i] != NULL) |
|||
{ |
|||
const Motor_Data_t *pstData = MotorMgr_GetData(g_apstMotors[i]); |
|||
if (pstData != NULL) |
|||
{ |
|||
stStatus.m_ucMotorIndex = i; |
|||
stStatus.m_iPosition = pstData->m_iRealPosition; |
|||
stStatus.m_iVelocity = pstData->m_iRealVelocity; |
|||
stStatus.m_uiFaultCode = pstData->m_uiFaultCode; |
|||
|
|||
// 回复给请求者
|
|||
MsgCenter_SendTo(MODULE_NAME_RBCORE, 0x10, &stStatus, sizeof(stStatus)); |
|||
} |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
// 雷赛电机CAN响应检查函数
|
|||
// 雷赛响应ID范围:0x581 - 0x5FF (0x580 + MotorID)
|
|||
static int check_LeiSaiMotor(char *_pBuffer, uint32_t _iSize) |
|||
{ |
|||
if (NULL == _pBuffer || _iSize < 4) |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
// 从buffer中提取CAN ID(前4字节)
|
|||
uint32_t uiFrameID = (uint32_t)(_pBuffer[0] & 0xFF) |
|||
| ((_pBuffer[1] & 0xFF) << 8) |
|||
| ((_pBuffer[2] & 0xFF) << 16) |
|||
| ((_pBuffer[3] & 0xFF) << 24); |
|||
|
|||
// 雷赛响应ID范围:0x581 - 0x5FF
|
|||
if (uiFrameID >= 0x581 && uiFrameID <= 0x5FF) |
|||
{ |
|||
return 8 + 4; // 数据长度8 + CAN ID长度4
|
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
// 雷赛电机CAN响应解码函数
|
|||
static void decode_LeiSaiMotor(const char *_pBuffer, uint32_t _iSize) |
|||
{ |
|||
if (NULL == _pBuffer || _iSize < 12) // 4字节CAN ID + 8字节数据
|
|||
{ |
|||
return; |
|||
} |
|||
|
|||
// 从buffer中提取CAN ID
|
|||
uint32_t uiFrameID = (uint32_t)(_pBuffer[0] & 0xFF) |
|||
| ((_pBuffer[1] & 0xFF) << 8) |
|||
| ((_pBuffer[2] & 0xFF) << 16) |
|||
| ((_pBuffer[3] & 0xFF) << 24); |
|||
|
|||
// 提取电机ID (0x580 + MotorID)
|
|||
uint8_t ucMotorID = (uint8_t)(uiFrameID - 0x580); |
|||
|
|||
// 调用电机管理模块解析响应
|
|||
MotorMgr_ParseResponse(ucMotorID, (const uint8_t *)&_pBuffer[4], 8); |
|||
} |
|||
|
|||
static void MotorInit(void) |
|||
{ |
|||
// 初始化FDCAN1,使用雷赛电机的回调
|
|||
TCANUserData *ptCANUserData = CAN_userdata_init(&hfdcan1, 32, 0); |
|||
g_ptCAN1 = rd_ComCreate(check_LeiSaiMotor, decode_LeiSaiMotor, FDCAN1_Send, CONFIG_UART_BUFFER_SIZE, ptCANUserData); |
|||
CAN_IT_init(g_ptCAN1); |
|||
|
|||
// 初始化电机管理模块
|
|||
MotorMgr_Init(); |
|||
|
|||
// 配置左轮电机
|
|||
Motor_Config_t stLeftMotorConfig = { |
|||
.m_ucMotorID = 1, |
|||
.m_uiPulsePerRound = 10000, |
|||
.m_uiReductionRatio = 70, |
|||
.m_fWheelDiameter = 0.26f |
|||
}; |
|||
g_apstMotors[0] = MotorMgr_Create(&stLeftMotorConfig, g_ptCAN1, LeiSai_GetProtocol(), NULL); |
|||
|
|||
// 配置右轮电机
|
|||
Motor_Config_t stRightMotorConfig = { |
|||
.m_ucMotorID = 2, |
|||
.m_uiPulsePerRound = 10000, |
|||
.m_uiReductionRatio = 70, |
|||
.m_fWheelDiameter = 0.26f |
|||
}; |
|||
g_apstMotors[1] = MotorMgr_Create(&stRightMotorConfig, g_ptCAN1, LeiSai_GetProtocol(), NULL); |
|||
|
|||
g_uiMotorModuleID = MsgCenter_Register(MODULE_NAME_MOTOR, Motor_ModuleHandler); |
|||
} |
|||
|
|||
void MotorTask(void *argument) |
|||
{ |
|||
MotorInit(); |
|||
|
|||
MotorMgr_ResetAll(g_apstMotors[0]); |
|||
Rd_Delay(500); |
|||
MotorMgr_ResetAll(g_apstMotors[1]); |
|||
Rd_Delay(500); |
|||
|
|||
int iCount = 6; |
|||
while(iCount--) |
|||
{ |
|||
MotorMgr_ActivateAll(g_apstMotors[0]); |
|||
Rd_Delay(500); |
|||
MotorMgr_ActivateAll(g_apstMotors[1]); |
|||
Rd_Delay(500); |
|||
} |
|||
|
|||
MotorMgr_SetHome(g_apstMotors[0]); |
|||
MotorMgr_SetHome(g_apstMotors[1]); |
|||
MotorMgr_SpeedModeInit(g_apstMotors[0]); |
|||
MotorMgr_SpeedModeInit(g_apstMotors[1]); |
|||
|
|||
while(1) |
|||
{ |
|||
// 处理消息
|
|||
MsgCenter_ProcessWait(g_uiMotorModuleID, 2); |
|||
|
|||
for (int i = 0; i < MOTOR_INSTANCE_MAX; i++) |
|||
{ |
|||
if (g_apstMotors[i] != NULL) |
|||
{ |
|||
// 读取位置、速度、故障
|
|||
MotorMgr_RequestPosition(g_apstMotors[i]); |
|||
MotorMgr_RequestFault(g_apstMotors[i]); |
|||
MotorMgr_RequestVelocity(g_apstMotors[i]); |
|||
MotorMgr_SetTargetSpeed(g_apstMotors[i], 50000); |
|||
} |
|||
} |
|||
|
|||
Rd_Delay(2); // 2ms周期
|
|||
} |
|||
} |
|||
Loading…
Reference in new issue