From c9f6123264a0f2b9e4a8b0cc0fa55a58d998f81c 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: Thu, 24 Jul 2025 14:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=87=8F=E9=80=9F=E8=BF=87?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 12 ++++ APP/Device/Device_rotate/rotate_bldc.c | 96 +++++++++++++++++++++++++- APP/Device/Device_rotate/rotate_bldc.h | 6 +- PROJECT/OS2.ewp | 2 +- 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..61d2f66 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.associations": { + "full_bridge.h": "c", + "ptz_default_value.h": "c", + "ptz_header_file.h": "c", + "gd32f4xx.h": "c", + "ptz_type_select.h": "c", + "l6235d.h": "c", + "service_presetbitscan.h": "c", + "device_adc_collect.h": "c" + } +} \ No newline at end of file diff --git a/APP/Device/Device_rotate/rotate_bldc.c b/APP/Device/Device_rotate/rotate_bldc.c index 737e74a..9ed5b54 100644 --- a/APP/Device/Device_rotate/rotate_bldc.c +++ b/APP/Device/Device_rotate/rotate_bldc.c @@ -14,6 +14,65 @@ static BSP_OS_SEM ptz_vert_stop_mutex; static char ptz_hori_stop_count;//水平停止计数,防止多次停止多次延时 static char ptz_vert_stop_count;//垂直停止计数,防止多次停止多次延时 +/* 水平停止转动,减速阶梯和切换时间 */ +#define hori_stop_step 0.2f +#define hori_stop_time 1 + +/* 水平减速,减速阶梯和切换时间 */ +#define hori_retard_step 0.2f +#define hori_retard_time 2 + + +/** + * 水平减速过程 + * + * +*/ +void ptz_hori_deceleration_process(float step, unsigned char time) +{ + float temp = g_ptz.hori_speed_actual; + for (; ; ) { + temp -= step; + g_ptz.hori_speed_set = temp; + if (temp < PTZ_HORI_MIN_SPEED) { + break; + } + OSTimeDlyHMSM(0u, 0u, 0u, time); + } +} + + +/* 垂直停止转动,减速阶梯和切换时间 */ +#define vert_stop_step 1.0f +#define vert_stop_time 1 + +/* 垂直减速,减速阶梯和切换时间 */ +#define vert_retard_step 0.1f +#define vert_retard_time 100 + +/* 垂直减速,俯仰极限位置 */ +#define vert_utmost_step 20.0f +#define vert_utmost_time 1 + +/** + * 垂直减速过程 + * + * +*/ +void ptz_vert_deceleration_process(float step, unsigned char time) +{ + float temp = g_ptz.vert_speed_actual; + for (; ; ) { + temp -= step; + g_ptz.vert_angle_set = temp; + if (temp < PTZ_HORI_MIN_SPEED) { + break; + } + OSTimeDlyHMSM(0u, 0u, 0u, time); + } +} + + void ptz_sem_post_stop_mutex()//释放云台启停共享资源锁 { BSP_OS_SemPost(&ptz_hori_stop_mutex); @@ -54,6 +113,9 @@ void ptz_hori_start(char direction, float speed) void ptz_hori_stop(unsigned short int time) { BSP_OS_SemWait(&ptz_hori_stop_mutex, 0u); + + ptz_hori_deceleration_process(hori_stop_step, hori_stop_time); + //停止电机 g_ptz.hori_start_stop_set = PTZ_HORI_STOP; g_ptz.hori_start_stop_actual = g_ptz.hori_start_stop_set; @@ -120,6 +182,11 @@ void ptz_vert_start(char direction, float speed) void ptz_vert_stop(unsigned short int time) { BSP_OS_SemWait(&ptz_vert_stop_mutex, 0u); + + if (time != PTZ_VERT_STOP_TIME) { + ptz_vert_deceleration_process(vert_stop_step, vert_stop_time); + } + if(g_ptz.vert_start_stop_set == PTZ_VERT_START) { //停止电机 @@ -273,6 +340,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -281,6 +349,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_rotate_plan.stop_near_angle) + g_ptz.hori_angle_actual) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -292,6 +361,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -300,6 +370,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_angle_actual) + g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -403,7 +474,8 @@ static char ptz_hori_rotate_monitor_task() { if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) - { + { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -412,6 +484,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_rotate_plan.stop_near_angle) + g_ptz.hori_angle_actual) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -423,6 +496,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -431,6 +505,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_angle_actual) + g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -443,6 +518,7 @@ static char ptz_hori_rotate_monitor_task() break; case PTZ_HORI_DEC_BRAKE_A://减速刹车 + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; g_ptz.hori_rotate_monitor_switch = PTZ_HORI_DEC_BRAKE_B; k = 0; @@ -507,6 +583,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -515,6 +592,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_rotate_plan.stop_near_angle) + g_ptz.hori_angle_actual) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -526,6 +604,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -534,6 +613,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_angle_actual) + g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -582,6 +662,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -590,6 +671,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_rotate_plan.stop_near_angle) + g_ptz.hori_angle_actual) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -601,6 +683,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -609,6 +692,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_angle_actual) + g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -656,6 +740,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -664,6 +749,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_rotate_plan.stop_near_angle) + g_ptz.hori_angle_actual) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -675,6 +761,7 @@ static char ptz_hori_rotate_monitor_task() if(fabs(g_ptz.hori_angle_actual - g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -683,6 +770,7 @@ static char ptz_hori_rotate_monitor_task() if((fabs(360.0 - g_ptz.hori_angle_actual) + g_ptz.hori_rotate_plan.stop_near_angle) <= PTZ_HORI_MIN_SPEED_ANGLE) { + ptz_hori_deceleration_process(hori_retard_step, hori_retard_time); g_ptz.hori_speed_set = PTZ_HORI_MIN_SPEED; } } @@ -764,6 +852,7 @@ static char ptz_vert_rotate_monitor_task() if(fabs(g_ptz.vert_angle_actual - g_ptz.vert_rotate_plan.stop_near_angle) <= PTZ_VERT_MIN_SPEED_ANGLE) { + ptz_vert_deceleration_process(vert_retard_step, vert_retard_time); g_ptz.vert_speed_set = PTZ_VERT_MIN_SPEED; } @@ -809,6 +898,7 @@ static char ptz_vert_rotate_monitor_task() if(fabs(g_ptz.vert_angle_actual - g_ptz.vert_rotate_plan.stop_near_angle) <= PTZ_VERT_MIN_SPEED_ANGLE) { + ptz_vert_deceleration_process(vert_retard_step, vert_retard_time); g_ptz.vert_speed_set = PTZ_VERT_MIN_SPEED; } break; @@ -875,6 +965,7 @@ static char ptz_vert_rotate_monitor_task() if(fabs(g_ptz.vert_angle_actual - g_ptz.vert_rotate_plan.stop_near_angle) <= PTZ_VERT_MIN_SPEED_ANGLE) { + ptz_vert_deceleration_process(vert_retard_step, vert_retard_time); g_ptz.vert_speed_set = PTZ_VERT_MIN_SPEED; } @@ -909,6 +1000,7 @@ static char ptz_vert_rotate_monitor_task() if(fabs(g_ptz.vert_angle_actual - g_ptz.vert_rotate_plan.stop_near_angle) <= PTZ_VERT_MIN_SPEED_ANGLE) { + ptz_vert_deceleration_process(vert_retard_step, vert_retard_time); g_ptz.vert_speed_set = PTZ_VERT_MIN_SPEED; } break; @@ -924,6 +1016,7 @@ static char ptz_vert_rotate_monitor_task() g_ptz.vert_arrive_flag = 0; g_ptz.vert_rotate_monitor_switch = 0; + // ptz_vert_deceleration_process(vert_utmost_step, vert_utmost_time); ptz_vert_stop(PTZ_VERT_STOP_TIME);//停止延时为0 OSTimeDlyHMSM(0u, 0u, 0u, 5u); } @@ -936,6 +1029,7 @@ static char ptz_vert_rotate_monitor_task() g_ptz.vert_arrive_flag = 0; g_ptz.vert_rotate_monitor_switch = 0; + // ptz_vert_deceleration_process(vert_utmost_step, vert_utmost_time); ptz_vert_stop(PTZ_VERT_STOP_TIME); OSTimeDlyHMSM(0u, 0u, 0u, 5u); } diff --git a/APP/Device/Device_rotate/rotate_bldc.h b/APP/Device/Device_rotate/rotate_bldc.h index 0884bac..1ed553c 100644 --- a/APP/Device/Device_rotate/rotate_bldc.h +++ b/APP/Device/Device_rotate/rotate_bldc.h @@ -66,8 +66,8 @@ #define PTZ_VERT_DIR_STOP 2 ///距离最近刹车点以最小转速运行的距离 - #define PTZ_HORI_MIN_SPEED_ANGLE 3.0 - #define PTZ_VERT_MIN_SPEED_ANGLE 3.0 + #define PTZ_HORI_MIN_SPEED_ANGLE 12.0 + #define PTZ_VERT_MIN_SPEED_ANGLE 2.0 ///刹车最近距离 #define PTZ_HORI_STOP_NEAR_DISTANCE 0.01 @@ -77,7 +77,7 @@ ///刹车最近距离 #define PTZ_VERT_STOP_NEAR_DISTANCE 0.01 ///刹车最远距离 - #define PTZ_VERT_STOP_FAR_DISTANCE 4.0 + #define PTZ_VERT_STOP_FAR_DISTANCE 3.0 ///云台定位精度,也可用于判断是不是同一个位置 #define PTZ_HORI_ANGLE_ACCURACY 0.1 diff --git a/PROJECT/OS2.ewp b/PROJECT/OS2.ewp index 1498948..7b060ff 100644 --- a/PROJECT/OS2.ewp +++ b/PROJECT/OS2.ewp @@ -825,7 +825,7 @@