From bd1d26de10c957246aa68d2d0dbf6bfa52dd34eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B7=E5=BA=8A=E5=B0=B1=E7=8A=AF=E5=9B=B0?= <11730503+psx123456@user.noreply.gitee.com> Date: Tue, 14 Oct 2025 10:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8F=91=E9=80=81=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- APP/Appcfg/app_cfg.h | 10 + APP/Device/Device_speed/servoMotor_recv.c | 103 +++++++ APP/Device/Device_speed/servoMotor_recv.h | 15 + APP/Device/Device_speed/speed_to_servoMotor.c | 267 +++++++++++++++--- APP/Device/Device_speed/speed_to_servoMotor.h | 66 ++++- BSP/Driver/servoMotor/motorCommu.c | 2 +- BSP/Driver/servoMotor/servoMotor.c | 1 + PROJECT/OS2.ewp | 3 + PROJECT/OS2.ewt | 3 + 10 files changed, 428 insertions(+), 45 deletions(-) create mode 100644 APP/Device/Device_speed/servoMotor_recv.c create mode 100644 APP/Device/Device_speed/servoMotor_recv.h diff --git a/.vscode/settings.json b/.vscode/settings.json index f378d01..1adce06 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -45,6 +45,7 @@ "angle_poweroffsave.h": "c", "comm_cfginfo.h": "c", "servomotor.h": "c", - "pdebug.h": "c" + "pdebug.h": "c", + "limits": "c" } } \ No newline at end of file diff --git a/APP/Appcfg/app_cfg.h b/APP/Appcfg/app_cfg.h index f931570..5613da8 100644 --- a/APP/Appcfg/app_cfg.h +++ b/APP/Appcfg/app_cfg.h @@ -145,6 +145,16 @@ #define TASK_PTZ_TASK_PRINTF_STK_SIZE 200u +//解析水平电机返回的数据 +#define TASK_RECV_HORI_SERVO_PRIO 56u +#define TASK_RECV_HORI_SERVO_STK_SIZE 200u + +//解析俯仰电机返回的数据 +#define TASK_RECV_VERT_SERVO_PRIO 57u +#define TASK_RECV_VERT_SERVO_STK_SIZE 200u + + + //#define ????????????????????_PRIO 55u //#define ????????????????????_STK_SIZE 150u /*******************************************************************************/ diff --git a/APP/Device/Device_speed/servoMotor_recv.c b/APP/Device/Device_speed/servoMotor_recv.c new file mode 100644 index 0000000..db6dc5a --- /dev/null +++ b/APP/Device/Device_speed/servoMotor_recv.c @@ -0,0 +1,103 @@ +#include "speed_to_servoMotor.h" +#include "ptz_header_file.h" +#include "servoMotor.h" + +#ifdef PTZ_SERVO_MOTOR + +//电机数据解析任务互斥量 +BSP_OS_SEM g_horiMotorMutex; +BSP_OS_SEM g_vertMotorMutex; + +/*! + \brief 水平电机接收任务 + \param[in] none + \param[out] none + \retval none +*/ +static void ptz_recv_hori_servo_task() +{ + CPU_INT08U err; + + while(1) { + OSSemPend(g_horiMotorMutex, 0, &err); + + + + + } +} + +/*! + \brief 俯仰电机接收任务 + \param[in] none + \param[out] none + \retval none +*/ +static void ptz_recv_vert_servo_task() +{ + CPU_INT08U err; + + while(1) { + OSSemPend(g_vertMotorMutex, 0, &err); + + + + } +} + +static OS_STK task_recv_hori_servo_stk[TASK_RECV_HORI_SERVO_STK_SIZE]; +static OS_STK task_recv_vert_servo_stk[TASK_RECV_HORI_SERVO_STK_SIZE]; +static void creat_task_servo_recv_task(void) +{ + CPU_INT08U task_err; + CPU_INT08U name_err; + + task_err = OSTaskCreateExt((void (*)(void *)) ptz_recv_hori_servo_task, + (void *) 0, + (OS_STK *)&task_recv_hori_servo_stk[TASK_RECV_HORI_SERVO_STK_SIZE - 1], + (INT8U ) TASK_RECV_HORI_SERVO_PRIO, + (INT16U ) TASK_RECV_HORI_SERVO_PRIO, + (OS_STK *)&task_recv_hori_servo_stk[0], + (INT32U ) TASK_RECV_HORI_SERVO_STK_SIZE, + (void *) 0, + (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); + #if (OS_TASK_NAME_EN > 0) + OSTaskNameSet(TASK_VERT_PID_PRIO, "ptz_recv_hori_servo_task", &name_err); + #endif + + if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { + pdebug(DEBUG_LEVEL_INFO,"create ptz_recv_hori_servo_task success...\n\r"); + } else { + pdebug(DEBUG_LEVEL_FATAL,"create ptz_recv_hori_servo_task failed...\n\r"); + } + + task_err = OSTaskCreateExt((void (*)(void *)) ptz_recv_vert_servo_task, + (void *) 0, + (OS_STK *)&task_recv_vert_servo_stk[TASK_RECV_HORI_SERVO_STK_SIZE - 1], + (INT8U ) TASK_RECV_VERT_SERVO_PRIO, + (INT16U ) TASK_RECV_VERT_SERVO_PRIO, + (OS_STK *)&task_recv_vert_servo_stk[0], + (INT32U ) task_recv_vert_servo_stk, + (void *) 0, + (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); + #if (OS_TASK_NAME_EN > 0) + OSTaskNameSet(TASK_VERT_PID_PRIO, "ptz_recv_vert_servo_task", &name_err); + #endif + + if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { + pdebug(DEBUG_LEVEL_INFO,"create ptz_recv_vert_servo_task success...\n\r"); + } else { + pdebug(DEBUG_LEVEL_FATAL,"create ptz_recv_vert_servo_task failed...\n\r"); + } +} + + +void Init_ServoMotorRecv(void) +{ + g_horiMotorMutex = OSSemCreate(1); + g_vertMotorMutex = OSSemCreate(1); + + creat_task_servo_recv_task(); +} + +#endif diff --git a/APP/Device/Device_speed/servoMotor_recv.h b/APP/Device/Device_speed/servoMotor_recv.h new file mode 100644 index 0000000..2fdaae3 --- /dev/null +++ b/APP/Device/Device_speed/servoMotor_recv.h @@ -0,0 +1,15 @@ +#ifndef __DEVICE_SPEED_SERVOMOTOR_H_ +#define __DEVICE_SPEED_SERVOMOTOR_H_ +#include "ptz_type_select.h" + + +#ifdef PTZ_SERVO_MOTOR + + + +void Init_ServoMotorRecv(void); + + + +#endif +#endif diff --git a/APP/Device/Device_speed/speed_to_servoMotor.c b/APP/Device/Device_speed/speed_to_servoMotor.c index b1d3b6e..0acf1e4 100644 --- a/APP/Device/Device_speed/speed_to_servoMotor.c +++ b/APP/Device/Device_speed/speed_to_servoMotor.c @@ -1,9 +1,21 @@ #include "speed_to_servoMotor.h" -#include "ptz_header_file.h" -#include "servoMotor.h" #ifdef PTZ_SERVO_MOTOR +//云台伺服电机通信信号量,增加发送的数据信号量+1,发送完成信号量-1 +BSP_OS_SEM g_horiSpeedSem; +BSP_OS_SEM g_vertSpeedSem; +//云台伺服电机能否发生数据互斥量 +BSP_OS_SEM g_horiSpeedMutex; +BSP_OS_SEM g_vertSpeedMutex; + + + +uint16_t memBuffer[linkListNodeLen * sendDataBufNumber * 2] = {0}; +OS_MEM *g_memPtr; + +ptzServoLinkList g_servoMotorLinkList = {0}; + //发送云台实际转速 void ptz_send_speed(char dev, char speed) @@ -44,51 +56,195 @@ void ptz_send_speed(char dev, char speed) } } +/*! + \brief 链表发送完成后用于释放内存 + \param[in] data:储存发送数据的链表 + \param[out] none + \retval none +*/ +void servoLinkListMemPut(linkList *data) +{ + if (data == NULL) { + return; + } + + linkList *ptr; + ptr = data; + data = data->next; + OSMemPut(g_memPtr, (uint8_t *)ptr); +} -static void ptz_hori_step_speed_task() -{ - while(1) - { - if(g_ptz.hori_start_stop_set == PTZ_HORI_START) - { +/*! + \brief 发送函数 + \param[in] motor:电机 + horiMotor 水平电机 + vertMotor 俯仰电机 + \param[in] *data:要发送的数据 + \param[in] dataLen:指向要发送的数据 + \param[in] priority:将要发送的数据填入优先级 + \param[out] none + \retval none +*/ +void servoSendData(uint8_t motor,uint8_t *data, uint8_t dataLen, uint8_t priority) +{ + if ((motor != horiMotorType) && (motor!= vertMotorType)) { + return; + } + if (data == NULL) { + return; + } + if (dataLen > sendDataBufLen) { + return; + } + if ((priority != highPriority) && (priority != lowPriority)) { + return; + } + + linkList *ptr = NULL; + CPU_INT08U err; + + //保存数据到链表节点 + ptr = OSMemGet(g_memPtr, &err); + ptr->length = dataLen; + memcpy(ptr->data, data, dataLen); + + //将节点添加进入链表中 + if (motor == horiMotorType) { + if (g_servoMotorLinkList.horiMotor.linkListNum > sendDataBufNumber) { + OSMemPut(g_memPtr, ptr); + return; + } + + if (priority == highPriority) { + g_servoMotorLinkList.horiMotor.LinkListTail_H = ptr; + if (g_servoMotorLinkList.horiMotor.LinkListHead_H == NULL) { + g_servoMotorLinkList.horiMotor.LinkListHead_H + = g_servoMotorLinkList.horiMotor.LinkListTail_H; + } + } + else { + g_servoMotorLinkList.horiMotor.LinkListTail_L = ptr; + if (g_servoMotorLinkList.horiMotor.LinkListHead_L == NULL) { + g_servoMotorLinkList.horiMotor.LinkListHead_L + = g_servoMotorLinkList.horiMotor.LinkListTail_L; + } + } + + //释放信号量,通知能发送一次 + OSSemPost(g_horiSpeedSem); + } + else { + if (g_servoMotorLinkList.vertMotor.linkListNum > sendDataBufNumber) { + OSMemPut(g_memPtr, ptr); + return; + } + + if (priority == highPriority) { + g_servoMotorLinkList.vertMotor.LinkListTail_H = ptr; + if (g_servoMotorLinkList.vertMotor.LinkListHead_H == NULL) { + g_servoMotorLinkList.vertMotor.LinkListHead_H + = g_servoMotorLinkList.vertMotor.LinkListTail_H; + } + } + else { + g_servoMotorLinkList.vertMotor.LinkListTail_L = ptr; + if (g_servoMotorLinkList.vertMotor.LinkListHead_L == NULL) { + g_servoMotorLinkList.vertMotor.LinkListHead_L + = g_servoMotorLinkList.vertMotor.LinkListTail_L; + } + } + + //释放信号量,通知能发送一次 + OSSemPost(g_vertSpeedSem); + } +} + +static void ptz_hori_servo_task() +{ + CPU_INT08U err; + while(1) { + // if(g_ptz.hori_start_stop_set == PTZ_HORI_START) + // { + // } + + // if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP) + // { + // } + OSSemPend(g_horiSpeedMutex, 0, &err); + OSSemPend(g_horiSpeedSem, 0, &err); + + // 高优先级链表中数据先发送 + if (g_servoMotorLinkList.horiMotor.LinkListHead_H != NULL) { + //发送数据 + + + + g_servoMotorLinkList.horiMotor.linkListNum = highPriority; + continue; } - if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP) - { + // 高优先级链表中无数据时,发送低优先级中的数据 + if (g_servoMotorLinkList.horiMotor.LinkListHead_L != NULL) { + //发送数据 + + + + g_servoMotorLinkList.horiMotor.linkListNum = lowPriority; + } + else { + pdebug(DEBUG_LEVEL_FATAL,"ptz_hori_servo_task no data...\n\r"); } - OSTimeDlyHMSM(0u, 0u, 0u, 10); } } -static void ptz_vert_step_speed_task() +static void ptz_vert_servo_task() { - while(1) - { - if(g_ptz.vert_start_stop_set == PTZ_VERT_START) - { + CPU_INT08U err; + while(1) { + // if(g_ptz.vert_start_stop_set == PTZ_VERT_START) + // { + // } + // if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP) + // { + // } + OSSemPend(g_vertSpeedMutex, 0, &err); + OSSemPend(g_vertSpeedSem, 0, &err); + + // 高优先级链表中数据先发送 + if (g_servoMotorLinkList.vertMotor.LinkListHead_H != NULL) { + g_servoMotorLinkList.vertMotor.linkListNum = highPriority; + + + + continue; + } + + // 高优先级链表中无数据时,发送低优先级中的数据 + if (g_servoMotorLinkList.vertMotor.LinkListHead_L != NULL) { + g_servoMotorLinkList.vertMotor.linkListNum = highPriority; + + + + } + else { + pdebug(DEBUG_LEVEL_FATAL,"ptz_vert_servo_task no data...\n\r"); } - if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP) - { - } - OSTimeDlyHMSM(0u, 0u, 0u, 10); } } - - -static OS_STK task_hori_step_speed_stk[TASK_HORI_PID_STK_SIZE]; -static void creat_task_hori_step_speed_task(void) +static OS_STK task_hori_servo_stk[TASK_HORI_PID_STK_SIZE]; +static void creat_task_hori_servo_task(void) { CPU_INT08U task_err; CPU_INT08U name_err; - task_err = OSTaskCreateExt((void (*)(void *)) ptz_hori_step_speed_task, + task_err = OSTaskCreateExt((void (*)(void *)) ptz_hori_servo_task, (void *) 0, - (OS_STK *)&task_hori_step_speed_stk[TASK_HORI_PID_STK_SIZE - 1], + (OS_STK *)&task_hori_servo_stk[TASK_HORI_PID_STK_SIZE - 1], (INT8U ) TASK_HORI_PID_PRIO, (INT16U ) TASK_HORI_PID_PRIO, - (OS_STK *)&task_hori_step_speed_stk[0], + (OS_STK *)&task_hori_servo_stk[0], (INT32U ) TASK_HORI_PID_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); @@ -104,46 +260,75 @@ static void creat_task_hori_step_speed_task(void) } - -static OS_STK task_vert_step_speed_stk[TASK_VERT_PID_STK_SIZE]; -static void creat_task_vert_step_speed_task(void) +static OS_STK task_vert_servo_stk[TASK_VERT_PID_STK_SIZE]; +static void creat_task_vert_servo_task(void) { CPU_INT08U task_err; CPU_INT08U name_err; - task_err = OSTaskCreateExt((void (*)(void *)) ptz_vert_step_speed_task, + task_err = OSTaskCreateExt((void (*)(void *)) ptz_vert_servo_task, (void *) 0, - (OS_STK *)&task_vert_step_speed_stk[TASK_VERT_PID_STK_SIZE - 1], + (OS_STK *)&task_vert_servo_stk[TASK_VERT_PID_STK_SIZE - 1], (INT8U ) TASK_VERT_PID_PRIO, (INT16U ) TASK_VERT_PID_PRIO, - (OS_STK *)&task_vert_step_speed_stk[0], + (OS_STK *)&task_vert_servo_stk[0], (INT32U ) TASK_VERT_PID_STK_SIZE, (void *) 0, - (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); + (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if (OS_TASK_NAME_EN > 0) - OSTaskNameSet(TASK_VERT_PID_PRIO, "ptz_vert_step_speed_task", &name_err); + OSTaskNameSet(TASK_VERT_PID_PRIO, "ptz_vert_servo_task", &name_err); #endif if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { - pdebug(DEBUG_LEVEL_INFO,"create ptz_vert_step_speed_task success...\n\r"); + pdebug(DEBUG_LEVEL_INFO,"create ptz_vert_servo_task success...\n\r"); } else { - pdebug(DEBUG_LEVEL_FATAL,"create ptz_vert_step_speed_task failed...\n\r"); + pdebug(DEBUG_LEVEL_FATAL,"create ptz_vert_servo_task failed...\n\r"); } } - - void init_speed_module(void) { + g_horiSpeedSem = OSSemCreate(0); + g_vertSpeedSem = OSSemCreate(0); + g_horiSpeedMutex = OSSemCreate(1); + g_vertSpeedMutex = OSSemCreate(1); + + OSSemPost(g_horiSpeedMutex); + OSSemPost(g_vertSpeedMutex); + + CPU_INT08U err; + g_memPtr = OSMemCreate(memBuffer, sendDataBufNumber * 2, linkListNodeLen, &err); + if (err != OS_ERR_NONE) { + pdebug(DEBUG_LEVEL_FATAL, "Failed to create the motor memory pool\n\r"); + } + + //初始化链表头尾 + g_servoMotorLinkList.horiMotor.LinkListHead_H = NULL; + g_servoMotorLinkList.horiMotor.LinkListHead_L = NULL; + g_servoMotorLinkList.horiMotor.LinkListTail_H = NULL; + g_servoMotorLinkList.horiMotor.LinkListTail_L = NULL; + g_servoMotorLinkList.horiMotor.linkListPriority = nonePriority; + g_servoMotorLinkList.horiMotor.linkListNum = 0; + g_servoMotorLinkList.vertMotor.LinkListHead_H = NULL; + g_servoMotorLinkList.vertMotor.LinkListHead_L = NULL; + g_servoMotorLinkList.vertMotor.LinkListTail_H = NULL; + g_servoMotorLinkList.vertMotor.LinkListTail_L = NULL; + g_servoMotorLinkList.vertMotor.linkListPriority = nonePriority; + g_servoMotorLinkList.vertMotor.linkListNum = 0; + + servoMotorInit(); - creat_task_hori_step_speed_task(); - creat_task_vert_step_speed_task(); + Init_ServoMotorRecv(); + + creat_task_hori_servo_task(); + creat_task_vert_servo_task(); } + #endif diff --git a/APP/Device/Device_speed/speed_to_servoMotor.h b/APP/Device/Device_speed/speed_to_servoMotor.h index c873a23..476fd45 100644 --- a/APP/Device/Device_speed/speed_to_servoMotor.h +++ b/APP/Device/Device_speed/speed_to_servoMotor.h @@ -1,13 +1,75 @@ #ifndef __DEVICE_SPEED_SERVOMOTOR_H_ #define __DEVICE_SPEED_SERVOMOTOR_H_ #include "ptz_type_select.h" - +#include "stdint.h" +#include "ptz_header_file.h" +#include "servoMotor.h" +#include "servoMotor_recv.h" #ifdef PTZ_SERVO_MOTOR +enum { + nonePriority = 0, + highPriority, + lowPriority, +}; + +enum { + horiMotorType = 0, + vertMotorType, +}; + +//发送数据缓冲区的个数 +#define sendDataBufNumber 8 +//发送数据缓冲区的长度 +#define sendDataBufLen 25 +//发送链表,当个节点最大大小 +#define linkListNodeLen 50 + + +//发送链表 +typedef struct _linkList { + //发送的数据 + uint8_t data[sendDataBufLen]; + //发送的数据长度 + uint16_t length; + //下一个节点 + struct _linkList *next; +} linkList; + +typedef struct _motorLinkList{ + //发送数据,高优先级链表头 + linkList *LinkListHead_H; + //发送数据,低优先级链表头 + linkList *LinkListHead_L; + //水平电机发送数据,高优先级链表尾 + linkList *LinkListTail_H; + //水平电机发送数据,低优先级链表尾 + linkList *LinkListTail_L; + //当前发送数据的链表优先级 + uint8_t linkListPriority; + //放入的数据个数 + uint8_t linkListNum; +} motorLinkList; + +typedef struct _ptzServoLinkList { + motorLinkList horiMotor; + motorLinkList vertMotor; +} ptzServoLinkList; + +extern BSP_OS_SEM g_horiSpeedSem; +extern BSP_OS_SEM g_vertSpeedSem; +extern BSP_OS_SEM g_horiSpeedMutex; +extern BSP_OS_SEM g_vertSpeedMutex; + +extern ptzServoLinkList g_servoMotorLinkList; + void ptz_send_speed(char dev, char speed); void init_speed_module(void); -void init_speed_module(void); + +void servoLinkListMemPut(linkList *data); +void servoSendData(uint8_t motor,uint8_t *data, uint8_t dataLen, uint8_t priority); + #endif #endif \ No newline at end of file diff --git a/BSP/Driver/servoMotor/motorCommu.c b/BSP/Driver/servoMotor/motorCommu.c index 7ab50f7..2cd5864 100644 --- a/BSP/Driver/servoMotor/motorCommu.c +++ b/BSP/Driver/servoMotor/motorCommu.c @@ -254,7 +254,7 @@ static void CommuStructInit() for(uint8_t i = 0; i < MOTOR_NUM; i++)//i==0ʼˮƽIOi==1ʼֱio { /*ΪԵIJֵ*/ - CommuInfo_t *pCommuDeal = g_commuInfoBuff[i].pCommuInfo; + CommuInfo_t *pCommuDeal = g_commuInfoBuff[i].pCommuInfo; pCommuDeal->dmaOffset = 0; pCommuDeal->dmaTranFlag = DMA_TRANS_IDLE; pCommuDeal->dmaSize = DMA_BUFF_SIZE; diff --git a/BSP/Driver/servoMotor/servoMotor.c b/BSP/Driver/servoMotor/servoMotor.c index 0bcd674..d94c2b3 100644 --- a/BSP/Driver/servoMotor/servoMotor.c +++ b/BSP/Driver/servoMotor/servoMotor.c @@ -61,6 +61,7 @@ void servoMotorInit(void) { MotorSwitchGpioCofig();//ԴĿPE0,1ţطʵˣԲҪ H_MOTOR_OPEN; + OSTimeDlyHMSM(0u, 0u, 0u, 1000u); V_MOTOR_OPEN; CommuDrvInit();//ŷRS485ͨѶʼ diff --git a/PROJECT/OS2.ewp b/PROJECT/OS2.ewp index 25c49d7..3441585 100644 --- a/PROJECT/OS2.ewp +++ b/PROJECT/OS2.ewp @@ -2435,6 +2435,9 @@ $PROJ_DIR$\..\APP\Device\Device_rotate\rotate_step.h + + $PROJ_DIR$\..\APP\Device\Device_speed\servoMotor_recv.c + $PROJ_DIR$\..\APP\Device\Device_speed\speed_to_bldc.c diff --git a/PROJECT/OS2.ewt b/PROJECT/OS2.ewt index 2f74556..49dc040 100644 --- a/PROJECT/OS2.ewt +++ b/PROJECT/OS2.ewt @@ -3011,6 +3011,9 @@ $PROJ_DIR$\..\APP\Device\Device_rotate\rotate_step.h + + $PROJ_DIR$\..\APP\Device\Device_speed\servoMotor_recv.c + $PROJ_DIR$\..\APP\Device\Device_speed\speed_to_bldc.c