修改宏定义

This commit is contained in:
起床就犯困 2025-10-11 11:40:39 +08:00
parent f03154b2f7
commit bcaf00ed4f
26 changed files with 1662 additions and 11 deletions

6
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"files.associations": {
"service_error_count.h": "c",
"ptz_header_file.h": "c"
}
}

View File

@ -156,9 +156,10 @@ extern "C" {
#define HYT_ADDRESS "hyt_address="
#define HYT_ADDRESS_DEFAULT "1"
#define ERROR_compensation "compensation_switch="
#ifdef PTZ_BLDC_MOTOR
#define ERROR_compensation_switch "on"//误差补偿开关,直流无刷电机原则上不使用误差补偿,而使用重复定位
#endif
// #ifdef PTZ_BLDC_MOTOR
// #define ERROR_compensation_switch "on"//误差补偿开关,直流无刷电机原则上不使用误差补偿,而使用重复定位
// #endif
#define ERROR_compensation_switch "on"//误差补偿开关,直流无刷电机原则上不使用误差补偿,而使用重复定位
/**/
#define END "[end]"

View File

@ -508,7 +508,70 @@
#endif
//伺服电机
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
///水平电机减速比
#define PTZ_HORI_MOTOR_RATIO 1.0
///水平大齿轮减速比
#define PTZ_HORI_BIG_GEAR_RATIO 60.0
///水平总减速比
#define PTZ_HORI_RATIO 60.0
///转速单位 转/每分
///水平电机最大转速
#define PTZ_HORI_MOTOR_MAX_SPEED 600.0
///水平电机最小转速
#define PTZ_HORI_MOTOR_MIN_SPEED 1.0
///水平云台最大转速
#define PTZ_HORI_MAX_SPEED 10.0
///水平云台最小转速
#define PTZ_HORI_MIN_SPEED 0.02
///水平云台默认最佳速度
#define PTZ_HORI_BEST_SPEED 2.0 //步进电机默认速度不能过大,应为对应扭矩最大值
///快要到达指定位置时的电机刹车转速(单位r/min)
#define PTZ_HORI_BREAK_MOTOR_SPEED 15.0
///快要到达指定位置时的刹车转速(单位°/s)
#define PTZ_HORI_BREAK_SPEED (PTZ_HORI_BREAK_MOTOR_SPEED / PTZ_HORI_RATIO * 6.0)
///水平电机方向 1-正向 0-反向
#define PTZ_HORI_MOTOR_DIRECTION 1
///水平电机加速度时间常数 单位ms (0-->>1000rpm)
#define PTZ_HORI_MOTOR_AccelerationTimeConstant 3000
///水平电机加速度时间常数 单位ms (1000-->>0rpm)
#define PTZ_HORI_MOTOR_DecelerationTimeConstant 2000
/**********************************************************/
///磁编码器和电机之间的减速比
#define PTZ_VERT_MOTOR_RATIO 1.0
///磁编码器与云台轴之间的减速比
#define PTZ_VERT_BIG_GEAR_RATIO 60.0
///垂直总减速比
#define PTZ_VERT_RATIO 60.0
///转速单位 转/每分
///垂直电机最大转速
#define PTZ_VERT_MOTOR_MAX_SPEED 600.0
///垂直电机最小转速
#define PTZ_VERT_MOTOR_MIN_SPEED 1.0
///垂直云台最大转速
#define PTZ_VERT_MAX_SPEED 10.0
///垂直云台最小转速
#define PTZ_VERT_MIN_SPEED 0.02
///垂直云台默认最佳速度
#define PTZ_VERT_BEST_SPEED 2.0//6.0
///快要到达指定位置时的电机刹车转速
#define PTZ_VERT_BREAK_MOTOR_SPEED 15.0
///快要到达指定位置时的刹车转速
#define PTZ_VERT_BREAK_SPEED (PTZ_VERT_BREAK_MOTOR_SPEED / PTZ_VERT_RATIO)
///垂直电机方向 1-正向 0-反向
#define PTZ_VERT_MOTOR_DIRECTION 1
///垂直电机加速度时间常数 单位ms (0-->>1000rpm)
#define PTZ_VERT_MOTOR_AccelerationTimeConstant 3000
///垂直电机加速度时间常数 单位ms (1000-->>0rpm)
#define PTZ_VERT_MOTOR_DecelerationTimeConstant 2000
#endif
#endif

View File

@ -114,4 +114,11 @@ void ptz_return_clear()
#endif
//====伺服电机-24V
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
unsigned char g_program_version_number[50] = "SL_YT";
unsigned char g_ptz_type[60] = "SL_YT";
#endif

View File

@ -27,7 +27,7 @@
#include "service_statusmonitor.h"
#include "as5047d.h"
#include "rotate_step.h"
#include "rotate_servo.h"
#endif

View File

@ -4,12 +4,12 @@
/**********电机类型选择**********/
//使用无刷直流电机
#define PTZ_BLDC_MOTOR 1
// #define PTZ_BLDC_MOTOR 1
//====直流无刷电机驱动器选择====
//#define L6235D 3
//全桥驱动
#define Full_bridge 3
// #define Full_bridge 3
//使用步进电机
@ -18,6 +18,8 @@
//====步进电机驱动器选择====
//#define TMC2160 3
//使用伺服电机
#define PTZ_SERVO_MOTOR 3
/**********云台型号选择**********/
@ -25,7 +27,7 @@
//#define PTZ_HEAVY_WORM_L6235D_AS5047D 7
//====直流无刷-L6235D-蜗轮蜗杆-中型云台-24V
#define PTZ_MEDIUM_WORM_L6235D_AS5047D 8
// #define PTZ_MEDIUM_WORM_L6235D_AS5047D 8
//====直流无刷-L6235D-直齿-轻型云台-24V
//#define PTZ_LIGHT_GEAR_L6235D_AS5047D 9
@ -44,6 +46,8 @@
//====步进电机-TMC2160-涡轮蜗杆-中型云台-24V
//#define PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V 105
//====伺服电机-涡轮蜗杆-轻型云台-24V
#define PTZ_MEDIUM_WORM_SERVO_MOTOR_24V 107
/************其他功能选择***********/

View File

@ -43,6 +43,9 @@
#define PTZ_POWER_DOWN_INC 0.2 //萇揤蔥腴腔講ㄗ睦ㄘ
#endif
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
#define PTZ_POWER_DOWN_INC 0.2 //电压降低的量(伏)
#endif
#define PTZ_MB85RC64_ADD_A 0x0000//裁萇湔揣華硊A
#define PTZ_MB85RC64_ADD_B 0x0400//裁萇湔揣華硊B

View File

@ -10,6 +10,8 @@
#include "ptz_type_select.h"
#include "ptz_global_variable.h"
#include "rotate_servo.h"
///云台角度回复
void ptz_send_angle(char dev,char angle_choice)
@ -173,6 +175,58 @@ static void ptz_vert_ps_delay_ms()
}
#endif
#ifdef PTZ_SERVO_MOTOR
static void ptz_hori_ps_delay_ms()
{
// unsigned int hori_ps_time = 0;
//#ifdef PTZ_PHOTOELECTRIC_SWITCH
// if(g_ptz.hori_speed_actual > 0)
// {
// hori_ps_time = (unsigned int)((PTZ_HORI_MAX_SPEED / g_ptz.hori_speed_actual) * PTZ_HORI_PS_TIEM + 0.5);
// }
// else
// {
// hori_ps_time = (unsigned int)((PTZ_HORI_MAX_SPEED / PTZ_HORI_MIN_SPEED) * PTZ_HORI_PS_TIEM + 0.5);
// }
//
// if(hori_ps_time < PTZ_HORI_PS_TIEM)
// {
// hori_ps_time = PTZ_HORI_PS_TIEM;
// }
//
// OSTimeDlyHMSM(0u, 0u, 0u, hori_ps_time);
//#endif
//
}
static void ptz_vert_ps_delay_ms()
{
// unsigned int vert_ps_time = 0;
//
//#ifdef PTZ_PHOTOELECTRIC_SWITCH
// if(g_ptz.vert_speed_actual > 0)
// {
// vert_ps_time = (unsigned int)((PTZ_VERT_MAX_SPEED / g_ptz.vert_speed_actual) * PTZ_VERT_PS_TIEM + 0.5);
// }
// else
// {
// vert_ps_time = (unsigned int)((PTZ_VERT_MAX_SPEED / PTZ_VERT_MIN_SPEED) * PTZ_VERT_PS_TIEM + 0.5);
// }
//
// if(vert_ps_time < PTZ_VERT_PS_TIEM)
// {
// vert_ps_time = PTZ_VERT_PS_TIEM;
// }
//
// OSTimeDlyHMSM(0u, 0u, 0u, vert_ps_time);
//#endif
}
#endif
/// 计算云台水平角度
#ifdef PTZ_HORI_ANGLE_AS5047D_ANGLE_ASY
static char ptz_hori_get_angle()

View File

@ -515,7 +515,47 @@
#define HORI_MS_SW3_ERROR 25//采用磁开关,实时计算磁开关范围时用的阈值
#endif
//伺服电机
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
//磁编码器角度增大,云台角度减小;磁编码器角度减小,云台角度增大
#define PTZ_HORI_ANGLE_AS5047D_ANGLE_SYN 1//角度变化同步
#define PTZ_VERT_ANGLE_AS5047D_ANGLE_SYN 1//角度变化同步
//#define PTZ_HORI_GET_ANGLE_MANY 1//多次获取角度算平均值
//#define PTZ_VERT_GET_ANGLE_MANY 1//多次获取角度算平均值
#define PTZ_HORI_GET_ANGLE_SINGLE 1//单次获取角度
#define PTZ_VERT_GET_ANGLE_SINGLE 1//单次获取角度
#define PTZ_SW3_LEFT_RISE_UPDATE 1 //打开水平挡片左转上升沿更新水平角度数据
//#define PTZ_SW1_DOWN_FALL_UPDATE 1 //垂直以SW1下俯下降沿更新垂直角度数据
#define PTZ_SW1_UP_RISE_UPDATE 1 //垂直以SW1上仰上升沿更新垂直角度数据
#define PTZ_RIGHT_CYCLE_C (g_ptz.hori_speed_actual * PTZ_HORI_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_HORI_ANGLE_TIME + 5.0)//36.0 //检测转动完一圈是否到达同一个点的距离阈值
#define PTZ_LEFT_CYCLE_C (g_ptz.hori_speed_actual * PTZ_HORI_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_HORI_ANGLE_TIME + 5.0)//36.0 //检测转动完一圈是否到达同一个点的距离阈值
#define PTZ_UP_CYCLE_C (g_ptz.vert_speed_actual * PTZ_VERT_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_VERT_ANGLE_TIME + 5.0)//36.0 //检测转动完一圈是否到达同一个点的距离阈值
#define PTZ_DOWN_CYCLE_C (g_ptz.vert_speed_actual * PTZ_VERT_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_VERT_ANGLE_TIME + 5.0)//36.0 //检测转动完一圈是否到达同一个点的距离阈值
#define PTZ_HORI_ANGLE_READ_NUM 4 //角度连续读取次数
#define PTZ_VERT_ANGLE_READ_NUM 4 //角度连续读取次数
#define PTZ_VERT_AS5047D_ANGLE_WF_A (g_ptz.vert_speed_actual * PTZ_VERT_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_VERT_ANGLE_TIME + 5.0)//36.0//云台垂直磁编码总角度滤波
#define PTZ_HORI_AS5047D_ANGLE_WF_A (g_ptz.hori_speed_actual * PTZ_HORI_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_HORI_ANGLE_TIME + 5.0)//36.0//云台水平磁编码总角度滤波
#define PTZ_HORI_AS5047D_ANGLE_WF_B (g_ptz.hori_as5047d.as5047d_ptz_angle_max - (g_ptz.hori_speed_actual * PTZ_HORI_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_HORI_ANGLE_TIME + 5.0))//云台水平磁编码总角度滤波
#define PTZ_HORI_ANGLE_DIFF_A (g_ptz.hori_speed_actual * PTZ_HORI_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_HORI_ANGLE_TIME + 5.0) //上次采集角度和此次采集角度之间允许的差值
#define PTZ_HORI_ANGLE_DIFF_B (360.0 - PTZ_HORI_ANGLE_DIFF_A) //上次采集角度和此次采集角度之间允许的差值
#define PTZ_VERT_ANGLE_DIFF_A (g_ptz.vert_speed_actual * PTZ_VERT_BIG_GEAR_RATIO * 6.0 / 1000.0 * PTZ_VERT_ANGLE_TIME + 5.0) //上次采集角度和此次采集角度之间允许的差值
#define PTZ_VERT_ANGLE_DIFF_B (360.0 - PTZ_VERT_ANGLE_DIFF_A) //上次采集角度和此次采集角度之间允许的差值
#define HORI_MS_SW3_ERROR 25//采用磁开关,实时计算磁开关范围时用的阈值
#endif
void ptz_send_sw_angle_state(char dev);
void init_angle_module();

View File

@ -0,0 +1,174 @@
#include "rotate_servo.h"
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
static BSP_OS_SEM ptz_hori_stop_mutex;//共享资源锁
static BSP_OS_SEM ptz_vert_stop_mutex;
float ptz_vert_break_angle()
{
//云台水平轴加速度(°/s²)
const float a = 1000.0f * 6.0f
/ ((float)(PTZ_VERT_MOTOR_DecelerationTimeConstant / 1000.0f))
/ PTZ_VERT_RATIO;
const float tmp = a / 2.0f;
//平稳运行角度以最低转速运行1秒
const float s1 = PTZ_VERT_BREAK_SPEED * 1;
//当前云台水平轴转速(°/s)
float Vnow = g_ptz.hori_speed_actual * 6.0f;
return (Vnow - PTZ_VERT_BREAK_SPEED) * (Vnow + PTZ_VERT_BREAK_SPEED) / tmp + s1;
}
float ptz_hori_break_angle()
{
//云台水平轴加速度(°/s²)
const float a = 1000.0f * 6.0f
/ ((float)(PTZ_HORI_MOTOR_DecelerationTimeConstant / 1000.0f))
/ PTZ_HORI_RATIO;
const float tmp = a / 2.0f;
//平稳运行角度以最低转速运行1秒
const float s1 = PTZ_HORI_BREAK_SPEED * 1;
//当前云台水平轴转速(°/s)
float Vnow = g_ptz.hori_speed_actual * 6.0f;
return (Vnow - PTZ_HORI_BREAK_SPEED) * (Vnow + PTZ_HORI_BREAK_SPEED) / tmp + s1;
}
void ptz_sem_post_stop_mutex()
{
BSP_OS_SemPost(&ptz_hori_stop_mutex);
BSP_OS_SemPost(&ptz_vert_stop_mutex);
}
void ptz_hori_start(char direction, float speed)
{
BSP_OS_SemWait(&ptz_hori_stop_mutex, 0u);
BSP_OS_SemPost(&ptz_hori_stop_mutex);
}
void ptz_hori_stop(unsigned short int time)
{
BSP_OS_SemWait(&ptz_hori_stop_mutex, 0u);
BSP_OS_SemPost(&ptz_hori_stop_mutex);
}
void ptz_vert_start(char direction, float speed)
{
BSP_OS_SemWait(&ptz_vert_stop_mutex, 0u);
BSP_OS_SemPost(&ptz_vert_stop_mutex);
}
void ptz_vert_stop(unsigned short int time)
{
BSP_OS_SemWait(&ptz_vert_stop_mutex, 0u);
BSP_OS_SemPost(&ptz_vert_stop_mutex);
}
static void ptz_hori_rotate_monitor_task()
{
}
static void ptz_vert_rotate_monitor_task()
{
}
static void ptz_hori_rotate_task()
{
while(1)
{
ptz_hori_rotate_monitor_task();
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
}
}
static void ptz_vert_rotate_task()
{
while(1)
{
ptz_vert_rotate_monitor_task();
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
}
}
static OS_STK task_hori_rotate_stk[TASK_HORI_ROATE_MONITOR_STK_SIZE];
static void creat_task_hori_rotate(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_hori_rotate_task,
(void *) 0,
(OS_STK *)&task_hori_rotate_stk[TASK_HORI_ROATE_MONITOR_STK_SIZE - 1],
(INT8U ) TASK_HORI_ROATE_MONITOR_PRIO,
(INT16U ) TASK_HORI_ROATE_MONITOR_PRIO,
(OS_STK *)&task_hori_rotate_stk[0],
(INT32U ) TASK_HORI_ROATE_MONITOR_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_HORI_ROATE_MONITOR_PRIO, "ptz_hori_rotate_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_hori_rotate_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_hori_rotate_task failed...\n\r");
}
}
static OS_STK task_vert_rotate_stk[TASK_VERT_ROATE_MONITOR_STK_SIZE];
static void creat_task_vert_rotate(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_vert_rotate_task,
(void *) 0,
(OS_STK *)&task_vert_rotate_stk[TASK_VERT_ROATE_MONITOR_STK_SIZE - 1],
(INT8U ) TASK_VERT_ROATE_MONITOR_PRIO,
(INT16U ) TASK_VERT_ROATE_MONITOR_PRIO,
(OS_STK *)&task_vert_rotate_stk[0],
(INT32U ) TASK_VERT_ROATE_MONITOR_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_VERT_ROATE_MONITOR_PRIO, "ptz_vert_rotate_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_vert_rotate_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_vert_rotate_task failed...\n\r");
}
}
void init_rotate_monitor_module(void)
{
BSP_OS_SemCreate(&ptz_hori_stop_mutex,1u,"ptz_hori_stop_mutex");
BSP_OS_SemCreate(&ptz_vert_stop_mutex,1u,"ptz_vert_stop_mutex");
creat_task_hori_rotate();
creat_task_vert_rotate();
}
#endif

View File

@ -0,0 +1,55 @@
#ifndef __PTZ_ROATE_SERVO_H_
#define __PTZ_ROATE_SERVO_H_
#include "ptz_header_file.h"
#include "ptz_type_select.h"
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
///云台水平右转
#define PTZ_HORI_DIR_RIGHT 3//0
///云台水平左转
#define PTZ_HORI_DIR_LEFT 1
///云台处于停止状态
#define PTZ_HORI_DIR_STOP 2
///云台垂直向上
#define PTZ_VERT_DIR_UP 3//0
///云台垂直向下
#define PTZ_VERT_DIR_DOWN 1
///云台处于停止状态
#define PTZ_VERT_DIR_STOP 2
///距离最近刹车点以最小转速运行的距离
#define PTZ_HORI_BREAK_SPEED_ANGLE ptz_hori_break_angle()
#define PTZ_VERT_BREAK_SPEED_ANGLE ptz_vert_break_angle()
///刹车最近距离
#define PTZ_HORI_STOP_NEAR_DISTANCE 0.01
///刹车最远距离
#define PTZ_HORI_STOP_FAR_DISTANCE 4.0
///刹车最近距离
#define PTZ_VERT_STOP_NEAR_DISTANCE 0.01
///刹车最远距离
#define PTZ_VERT_STOP_FAR_DISTANCE 4.0
///云台定位精度,也可用于判断是不是同一个位置
#define PTZ_HORI_ANGLE_ACCURACY 0.05
///云台定位精度,也可用于判断是不是同一个位置
#define PTZ_VERT_ANGLE_ACCURACY 0.05
float ptz_vert_break_angle();
float ptz_hori_break_angle();
void ptz_sem_post_stop_mutex();
void ptz_hori_start(char direction, float speed);
void ptz_hori_stop(unsigned short int time);
void ptz_vert_start(char direction, float speed);
void ptz_vert_stop(unsigned short int time);
void init_rotate_monitor_module(void);
#endif
#endif

View File

@ -0,0 +1,149 @@
#include "speed_to_servoMotor.h"
#include "ptz_header_file.h"
#include "servoMotor.h"
#ifdef PTZ_SERVO_MOTOR
//发送云台实际转速
void ptz_send_speed(char dev, char speed)
{
unsigned char Speed1[7] = {0xff,0x00,0xd0,0x00,0x00,0x00,0x00};
unsigned char Speed2[7] = {0xff,0x00,0xd0,0x00,0x00,0x00,0x00};
unsigned short int HSpeed = 0;
unsigned short int VSpeed = 0;
Speed1[1] = g_ptz.address;
Speed2[1] = g_ptz.address;
HSpeed = (unsigned short int)(g_ptz.hori_speed_actual * 100 + 0.5);
Speed1[3] = 0X03;//水平电机
Speed1[4] = (unsigned char)(HSpeed >> 8);
Speed1[5] = (unsigned char)(HSpeed & 0x00ff);
Speed1[6] = MotorCalPelcoDSUM(Speed1,sizeof(Speed1));
VSpeed = (unsigned short int)(g_ptz.vert_speed_actual * 100 + 0.5);
Speed2[3] = 0X04;//垂直电机
Speed2[4] = (unsigned char)(VSpeed >> 8);
Speed2[5] = (unsigned char)(VSpeed & 0x00ff);
Speed2[6] = MotorCalPelcoDSUM(Speed2,sizeof(Speed2));
switch(speed)
{
case 1://只查询水平转速
ptz_send_data(dev,Speed1,sizeof(Speed1));
break;
case 2://只查询垂直转速
ptz_send_data(dev,Speed2,sizeof(Speed2));
break;
default://水平转速垂直转速都查询
ptz_send_data(dev,Speed1,sizeof(Speed1));
ptz_send_data(dev,Speed2,sizeof(Speed2));
break;
}
}
static void ptz_hori_step_speed_task()
{
while(1)
{
if(g_ptz.hori_start_stop_set == PTZ_HORI_START)
{
}
if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP)
{
}
OSTimeDlyHMSM(0u, 0u, 0u, 10);
}
}
static void ptz_vert_step_speed_task()
{
while(1)
{
if(g_ptz.vert_start_stop_set == PTZ_VERT_START)
{
}
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)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_hori_step_speed_task,
(void *) 0,
(OS_STK *)&task_hori_step_speed_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],
(INT32U ) TASK_HORI_PID_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_HORI_PID_PRIO, "ptz_hori_step_speed_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_hori_step_speed_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_hori_step_speed_task failed...\n\r");
}
}
static OS_STK task_vert_step_speed_stk[TASK_VERT_PID_STK_SIZE];
static void creat_task_vert_step_speed_task(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_vert_step_speed_task,
(void *) 0,
(OS_STK *)&task_vert_step_speed_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],
(INT32U ) TASK_VERT_PID_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_vert_step_speed_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");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_vert_step_speed_task failed...\n\r");
}
}
void init_speed_module(void)
{
servoMotorInit();
creat_task_hori_step_speed_task();
creat_task_vert_step_speed_task();
}
#endif

View File

@ -0,0 +1,13 @@
#ifndef __DEVICE_SPEED_SERVOMOTOR_H_
#define __DEVICE_SPEED_SERVOMOTOR_H_
#include "ptz_type_select.h"
#ifdef PTZ_SERVO_MOTOR
void ptz_send_speed(char dev, char speed);
void init_speed_module(void);
void init_speed_module(void);
#endif
#endif

View File

@ -8,6 +8,9 @@
#include "gd32f4xx_it.h"
#include "ptz_type_select.h"
#include "get_angle.h"
#include "rotate_servo.h"
/// @brief 外部中断初始化
/// @param[in] usart_periph:EXTI_IRQ_init
/// @return none

View File

@ -3,6 +3,8 @@
#include "enet_to_udp.h"
#include "service_areascan.h"
#include "rotate_servo.h"
static BSP_OS_SEM ptz_area_crc_mutex;
PtzArea g_area[AREA_AMOUNT];

View File

@ -16,6 +16,8 @@
#include "tmc2160.h"
#include "service_error_count.h"
#include "rotate_servo.h"
char error_conut_state;
#define COUNT_STATE 1

View File

@ -20,6 +20,8 @@
#include "tmc2160.h"
#include "service_error_count.h"
#include "rotate_servo.h"
#ifdef PTZ_BLDC_MOTOR
/// 云台全范围自检
static unsigned char ptz_hori_complete_self_check_task()
@ -798,6 +800,387 @@ static unsigned char ptz_vert_simplify_self_check_task()
#endif
#ifdef PTZ_SERVO_MOTOR
/// 云台全范围自检
static unsigned char ptz_hori_complete_self_check_task()
{
switch(g_ptz.hori_self_check)
{
//首先让云台水平向右转动
case PTZ_HORI_SELF_CHECK_COMPLETE_STEP:
if(g_ptz.hori_ps_sw3_state == PS_COVER)//如果水平光电开关被挡住
{
ptz_hori_start(PTZ_HORI_DIR_LEFT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 1;
}
else//没有被挡住
{
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
ptz_hori_start(PTZ_HORI_DIR_RIGHT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 2;
}
break;
case PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 1:
if(g_ptz.hori_ps_sw3_state == PS_NO_COVER)
{
OSTimeDlyHMSM(0u, 0u, 3u, 0u);//延时转动
ptz_hori_stop(PTZ_HORI_STOP_TIME);
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
ptz_hori_start(PTZ_HORI_DIR_RIGHT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 2;
}
break;
//等待第一次水平光电开关下降沿中断
case (PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 2):
if(g_ptz.hori_ps_sw3_right_fall >= PS_FALL_ON)
{
g_ptz.hori_as5047d.as5047d_data_reset = 1;
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_self_check++;
OSTimeDlyHMSM(0u, 0u, 5u, 0u);
g_ptz.hori_ps_sw3_right_fall = 0;
}
break;
//等待第二次水平光电开关下降沿中断
case (PTZ_HORI_SELF_CHECK_COMPLETE_STEP + 3):
if(g_ptz.hori_ps_sw3_right_fall >= PS_FALL_ON)
{
g_ptz.hori_as5047d.as5047d_cycle_num = g_ptz.hori_as5047d.as5047d_cycle_count;
g_ptz.hori_as5047d.as5047d_ptz_angle_max = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
g_ptz.hori_as5047d.as5047d_ptz_angle_K = 360.0 / g_ptz.hori_as5047d.as5047d_ptz_angle_max;
g_ptz.hori_as5047d.as5047d_remain_angle = g_ptz.hori_as5047d.as5047d_ptz_angle_max -
g_ptz.hori_as5047d.as5047d_cycle_num * 360.0;
g_ptz.hori_angleP.angle_allow_max = 360.0;
g_ptz.hori_angleP.angle_allow_min = 0.0;
g_ptz.hori_as5047d.as5047d_state = 1;
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
ptz_hori_stop(PTZ_HORI_STOP_TIME);
g_ptz.hori_angle_state = 1;
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_DATA_SAVE;
}
break;
}
return g_ptz.hori_self_check;
}
/// 云台水平简化自检
static unsigned char ptz_hori_simplify_self_check_task()
{
switch(g_ptz.hori_self_check)
{
case PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP:
if(g_ptz.hori_ps_sw3_state == PS_COVER)//如果水平光电开关被挡住
{
ptz_hori_start(PTZ_HORI_DIR_LEFT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 1;
}
else//没有挡住
{
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
ptz_hori_start(PTZ_HORI_DIR_RIGHT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 2;
}
break;
case PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 1://向左转动,直到光电开关脱离挡片遮挡
if(g_ptz.hori_ps_sw3_state == PS_NO_COVER)
{
OSTimeDlyHMSM(0u, 0u, 3u, 0u);//延时转动
ptz_hori_stop(PTZ_HORI_STOP_TIME);
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
ptz_hori_start(PTZ_HORI_DIR_RIGHT, PTZ_HORI_SELF_CHECK_SPEED);
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 2;
}
break;
case PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 2:
//等待水平光电开关右转下降沿
if(g_ptz.hori_ps_sw3_right_fall >= PS_FALL_ON)
{
g_ptz.hori_as5047d.as5047d_cycle_count = 0;
g_ptz.hori_as5047d.as5047d_ptz_angle_actual = 0;
g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = 0;
g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual;
g_ptz.hori_as5047d.as5047d_state = 1;
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 3;
}
break;
case PTZ_HORI_SELF_CHECK_SIMPLIFY_STEP + 3://转动到0位
OSTimeDlyHMSM(0u, 0u, 1u, 0u);//延时转动
g_ptz.hori_angle_control = 0.0;
g_ptz.hori_speed_control = PTZ_HORI_BEST_SPEED;
ptz_hori_rotate_plan(PTZ_HORI_MIN_DISTANCE);
g_ptz.hori_rotate_monitor_switch = PTZ_HORI_GO_TO_ANGLE_A;
g_ptz.hori_angle_state = 1;
g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_END;
break;
}
return g_ptz.hori_self_check;
}
/// 云台垂直全范围自检
static unsigned char ptz_vert_complete_self_check_task()
{
switch(g_ptz.vert_self_check)
{
///首先读取光电开关的状态,初步判断垂直状态
case PTZ_VERT_SELF_CHECK_COMPLETE_STEP:
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
if(g_ptz.vert_ps_sw1_state == PS_COVER)//云台处于下俯极限位置
{
ptz_vert_start(PTZ_VERT_DIR_UP, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 1;
}
if(g_ptz.vert_ps_sw2_state == PS_COVER)//云台处于上仰极限位置
{
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 2;
}
if(g_ptz.vert_ps_sw1_state == PS_NO_COVER && g_ptz.vert_ps_sw2_state == PS_NO_COVER)
//云台处于中间位置
{
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 2;
}
break;
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 1):
if(g_ptz.vert_ps_sw1_state == PS_NO_COVER)
{
OSTimeDlyHMSM(0u, 0u, 3u, 0u);//延时转动
ptz_vert_stop(PTZ_VERT_STOP_TIME);
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
g_ptz.vert_self_check ++;
}
break;
//开启向下转动,查找下俯极限位置
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 2):
ptz_vert_start(PTZ_VERT_DIR_DOWN, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check ++;
break;
#ifdef PTZ_SW1_DOWN_FALL_UPDATE
//判断是否到达下俯极限位置,然后云台开始向上转动
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 3):
if(g_ptz.vert_ps_sw1_down_fall >= 1 ||
g_ptz.vert_ps_sw1_state == PS_COVER)
{
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_as5047d.as5047d_data_reset = 1;
ptz_vert_stop(PTZ_VERT_STOP_TIME);
ptz_vert_start(PTZ_VERT_DIR_UP, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 10;
}
break;
#endif
#ifdef PTZ_SW1_UP_RISE_UPDATE
//判断是否到达下俯极限位置,然后云台开始向上转动
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 3):
if(g_ptz.vert_ps_sw1_down_fall >= 1 ||
g_ptz.vert_ps_sw1_state == PS_COVER)
{
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
OSTimeDlyHMSM(0u, 0u, 0u, 300u);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
ptz_vert_start(PTZ_VERT_DIR_UP, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check++;
}
break;
//等待上仰上升沿
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 4):
if(g_ptz.vert_ps_sw1_up_rise >= 1 ||
g_ptz.vert_ps_sw1_state == PS_NO_COVER)
{
g_ptz.vert_as5047d.as5047d_data_reset = 1;
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 10;
}
break;
#endif
//等待SW2下降沿,计算垂直转动范围
case (PTZ_VERT_SELF_CHECK_COMPLETE_STEP + 10):
if(g_ptz.vert_ps_sw2_up_fall >= 1 ||
g_ptz.vert_ps_sw2_state == PS_COVER)
{
g_ptz.vert_as5047d.as5047d_cycle_num = g_ptz.vert_as5047d.as5047d_cycle_count;
g_ptz.vert_as5047d.as5047d_ptz_angle_max = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
g_ptz.vert_angleP.angle_range =
g_ptz.vert_as5047d.as5047d_ptz_angle_max / PTZ_VERT_BIG_GEAR_RATIO;
g_ptz.vert_angleP.angle_allow_min = g_ptz.vert_angleP.angle_range / 2.0 * (-1);
g_ptz.vert_angleP.angle_allow_max = g_ptz.vert_angleP.angle_range / 2.0;
g_ptz.vert_as5047d.as5047d_ptz_angle_K = 1 / PTZ_VERT_BIG_GEAR_RATIO;
g_ptz.vert_as5047d.as5047d_remain_angle = g_ptz.vert_as5047d.as5047d_ptz_angle_max -
g_ptz.vert_as5047d.as5047d_cycle_num * 360.0;
g_ptz.vert_as5047d.as5047d_state = 1;
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
ptz_vert_stop(PTZ_VERT_STOP_TIME);
g_ptz.vert_angle_state = 1;
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_DATA_SAVE;
}
break;
}
return g_ptz.vert_self_check;
}
/// 云台垂直简化自检
static unsigned char ptz_vert_simplify_self_check_task()
{
switch(g_ptz.vert_self_check)
{
case PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP:
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
if(g_ptz.vert_ps_sw1_state == PS_COVER)//云台处于下俯极限位置
{
ptz_vert_start(PTZ_VERT_DIR_UP, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 1;
}
if(g_ptz.vert_ps_sw2_state == PS_COVER)//云台处于上仰极限位置
{
ptz_vert_start(PTZ_VERT_DIR_DOWN, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 2;
}
if(g_ptz.vert_ps_sw1_state == PS_NO_COVER && g_ptz.vert_ps_sw2_state == PS_NO_COVER)
//云台处于中间位置
{
ptz_vert_start(PTZ_VERT_DIR_DOWN, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 2;
}
break;
case PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 1:
if(g_ptz.vert_ps_sw1_state == PS_NO_COVER)
{
OSTimeDlyHMSM(0u, 0u, 3u, 0u);//延时转动
ptz_vert_stop(PTZ_VERT_STOP_TIME);
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
ptz_vert_start(PTZ_VERT_DIR_DOWN, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 2;
}
break;
#ifdef PTZ_SW1_DOWN_FALL_UPDATE
case PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 2:
if(g_ptz.vert_ps_sw1_down_fall >= 1 ||
g_ptz.vert_ps_sw1_state == PS_COVER)
{//等待SW1光电开关被遮挡同时更新当前位置
g_ptz.vert_as5047d.as5047d_cycle_count = 0;
g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0;
g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0;
g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual;
g_ptz.vert_as5047d.as5047d_state = 1;
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
ptz_vert_stop(PTZ_VERT_STOP_TIME);
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 10;
}
break;
#endif
#ifdef PTZ_SW1_UP_RISE_UPDATE
//判断是否到达下俯极限位置,然后云台开始向上转动
case (PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 2):
if(g_ptz.vert_ps_sw1_down_fall >= 1 ||
g_ptz.vert_ps_sw1_state == PS_COVER)
{
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
OSTimeDlyHMSM(0u, 0u, 0u, 300u);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
ptz_vert_start(PTZ_VERT_DIR_UP, PTZ_VERT_SELF_CHECK_SPEED);
g_ptz.vert_self_check++;
}
break;
//等待上仰上升沿
case (PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 3):
if(g_ptz.vert_ps_sw1_up_rise >= 1 ||
g_ptz.vert_ps_sw1_state == PS_NO_COVER)
{
//等待SW1光电开关被遮挡同时更新当前位置
g_ptz.vert_as5047d.as5047d_cycle_count = 0;
g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0;
g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0;
g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual;
g_ptz.vert_as5047d.as5047d_state = 1;
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 10;
}
break;
#endif
case PTZ_VERT_SELF_CHECK_SIMPLIFY_STEP + 10:
OSTimeDlyHMSM(0u, 0u, 1u, 0u);
g_ptz.vert_angle_control = 0.0;
g_ptz.vert_speed_control = PTZ_VERT_BEST_SPEED;
ptz_vert_rotate_plan(PTZ_VERT_ANGLE);
g_ptz.vert_rotate_monitor_switch = PTZ_VERT_GO_TO_ANGLE_A;
g_ptz.vert_angle_state = 1;
g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_END;
break;
}
return g_ptz.vert_self_check;
}
#endif
static void ptz_hori_self_check_task()
{

View File

@ -94,6 +94,14 @@
#define PTZ_VERT_SELF_CHECK_SPEED 0.8
#endif
//伺服电机
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
///水平自检最大转速
#define PTZ_HORI_SELF_CHECK_SPEED 1.2
///垂直自检最大转速
#define PTZ_VERT_SELF_CHECK_SPEED 0.8
#endif
///云台自检参数需要保存和读取的部分
typedef struct _PtzSelfCheckData_
{

View File

@ -4,6 +4,8 @@
#include "service_selfcheck.h"
#include "device_adc_collect.h"
#include "rotate_servo.h"
extern void ptz_uart_dev_send(device_handle device, void *data, int len);
static char max_temperature_fault;
@ -11,6 +13,8 @@ static char max_temperature_fault;
//温度、电压、电流故障检测
static char ptz_temp_volt_current_fault_detect_task()
{//只报故障,不做响应
#ifdef PTZ_BLDC_MOTOR
static unsigned short int time_ms;
time_ms ++;
@ -37,7 +41,7 @@ static char ptz_temp_volt_current_fault_detect_task()
{
time_ms = 0;
}
#endif
#ifdef Full_bridge //NTC温度监测暂定温度上限值100摄氏度后续测试修改
if(g_ptz.H_boad_temp >= 100.0)
@ -742,6 +746,251 @@ static char ptz_motor_rotate_fault_detect_task()
#endif
#ifdef PTZ_SERVO_MOTOR
//电机转动卡死故障检测******主要用于检测电机自身故障与驱动电路器件故障
static char ptz_motor_rotate_fault_detect_task()
{
static char hori_rotate_fault_num;
static char vert_rotate_fault_num;
static char hori_rotate_fault_step;
static float hori_angle_a;
static float hori_angle_b;
static char vert_rotate_fault_step;
static float vert_angle_a;
static float vert_angle_b;
static unsigned short int time_ms;
time_ms ++;
//垂直
if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP)
{
vert_rotate_fault_step = 0;//关闭判断
vert_rotate_fault_num = 0;
}
//水平
if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP)
{
hori_rotate_fault_step = 0;//关闭判断
hori_rotate_fault_num = 0;
}
if(time_ms < 50)
{
return 1;
}
else
{
time_ms = 0;
}
//垂直
switch(vert_rotate_fault_step)
{
case 0:
if(g_ptz.vert_start_stop_set == PTZ_VERT_START)
{
vert_rotate_fault_num = 0;
vert_angle_a = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
vert_rotate_fault_step = vert_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
vert_angle_b = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP)
{
//转动正常情况
if(vert_angle_b > vert_angle_a &&
vert_angle_b - vert_angle_a >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.vert_pid.PidUT_float >= PTZ_VERT_VOLTAGE_LEVEL)
{
vert_rotate_fault_num ++;
}
}
}
else//g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN
{
//转动正常情况
if(vert_angle_a > vert_angle_b &&
vert_angle_a - vert_angle_b >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.vert_pid.PidUT_float >= PTZ_VERT_VOLTAGE_LEVEL)
{
vert_rotate_fault_num ++;
}
}
}
if(vert_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
vert_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车PTZ_HORI_STOP_TIME
// ptz_hori_stop(0);
// ptz_vert_stop(0);
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
//电机转动故障
g_ptz.fault_detect.vert_rotate_fault = FAULT;
}
vert_angle_a = vert_angle_b;
break;
}
/*************************************************************/
switch(hori_rotate_fault_step)
{
case 0:
if(g_ptz.hori_start_stop_set == PTZ_HORI_START)
{
hori_rotate_fault_num = 0;
hori_angle_a = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
hori_rotate_fault_step = hori_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
hori_angle_b = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.hori_self_check == PTZ_HORI_SELF_CHECK_END)
{//如果水平自检是完成了的
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if((hori_angle_b > hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_b - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a > hori_angle_b &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if((hori_angle_b < hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_a - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a < hori_angle_b &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
}
else
{//如果水平自检没完成
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if(hori_angle_b > hori_angle_a &&
hori_angle_b - hori_angle_a >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if(hori_angle_a > hori_angle_b &&
hori_angle_a - hori_angle_b >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
}
if(hori_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
hori_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车
// ptz_hori_stop(0);
// ptz_vert_stop(0);
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
//电机转动故障
g_ptz.fault_detect.hori_rotate_fault = FAULT;
}
hori_angle_a = hori_angle_b;
break;
}
return 1;
}
#endif
//故障代码自动回传
static char ptz_fault_return_task()

View File

@ -233,6 +233,20 @@
#define PTZ_CURRENT_DETECT 6.0//5.0
#endif
//伺服电机
#ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
//工作温度阈值
#define PTZ_TEMP_DETECT_MAX 65.0 //70.0
#define PTZ_TEMP_DETECT_MIN -25.0//70.0
//工作电压阈值
#define PTZ_VOLT_DETECT_MAX 30.0//30.0
#define PTZ_VOLT_DETECT_MIN 9.0//30.0
//工作电流阈值
#define PTZ_CURRENT_DETECT 10.0//5.0
#endif
///需要判断能否执行的指令

View File

@ -1,10 +1,14 @@
#include "as5047d.h"
#include <includes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#ifdef AS5047
static BSP_OS_SEM ptz_hori_get_angle_mutex;//¹²Ïí×ÊÔ´Ëø
static BSP_OS_SEM ptz_vert_get_angle_mutex;
static void as5047d_delay_nop(int as5047d_delay_time);
static unsigned int as5047d_Parity_bit_even(unsigned int package);
/// AS5047D¶ÌÑÓʱº¯Êý
@ -959,7 +963,326 @@ float as5047d_vert_get_angle_a()
return -1;
}
#endif
/********************************************************************************/
/********************************************************************************/
/********************************************************************************/
#ifdef TMR3109
//TMR3109 操作码定义
#define TMR3109_OPCODE_WRITE_EEPROM 0x01 //001 写EEPROM
#define TMR3109_OPCODE_WRITE_REGISTER 0x05 //101 写寄存器
#define TMR3109_OPCODE_READ_REGISTER 0x06 //110 读寄存器
#define TMR3109_OPCODE_CHANGE_MODE 0x07 //111 模式切换
#define TMR3109_OPCODE_READ_ANGLE 0x03 //011 读角度
//TMR3109设备结构体
typedef struct{
uint8_t device_id; //设备地址
uint32_t spi_periph; //SPI外设地址
uint32_t cs_pin; //片选引脚
uint32_t cs_gpio_periph; //片选引脚外设地址
}TMR3109_Device;
//角度数据结构体
typedef struct{
uint32_t angle_raw; //23位原始角度值
float angle_degree; //角度值,单位:度
uint8_t crc; //CRC校验码
uint8_t error; //错误码
bool is_valid; //是否有效
}TMR3109_AngleData;
//TMR3109设备定义
TMR3109_Device tmr3109_dev1 = {
.device_id = 1,
.spi_periph = SPI2,
.cs_pin = GPIO_PIN_15,
.cs_gpio_periph = GPIOA,
};
TMR3109_Device tmr3109_dev2 = {
.device_id = 2,
.spi_periph = SPI4,
.cs_pin = GPIO_PIN_11,
.cs_gpio_periph = GPIOE,
};
TMR3109_AngleData hori_angle_data = {0};
TMR3109_AngleData vert_angle_data = {0};
//暂定微秒级延迟函数(基于SysTick)(后期删除,所有延迟函数更换为统一的函数)
void delay_us(uint32_t us)
{
uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do {
now = SysTick->VAL;
delta = start > now? start - now : reload + start - now;
} while (delta < us_tick * us);
}
//TMR3109初始化
void TMR3109_Init(void)
{
//初始化SPI2U33编码器
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_SPI2);
//配置SPI2引脚
gpio_af_set(GPIOC, GPIO_AF_6, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12); //PC10,11,12复用为SPI2
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | /*GPIO_PIN_11 | */GPIO_PIN_12); //注意一下MISO是输入模式这里可能会有问题
//配置CS引脚
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_bit_set(GPIOA, GPIO_PIN_15); //默认CS引脚高电平
//配置SPI2参数不超过8MHz暂定5MHz左右
spi_parameter_struct spi_init_struct;
spi_struct_para_init(&spi_init_struct);
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT; //16位帧长
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE; //时钟极性为低,相位为第二边缘(下降沿)
spi_init_struct.nss = SPI_NSS_SOFT; //软件控制
spi_init_struct.prescale = SPI_PSC_16; //时钟预分频系数为16(5MHz左右)
spi_init_struct.endian = SPI_ENDIAN_MSB; //高位先出
spi_init(SPI2, &spi_init_struct);
spi_enable(SPI2);
//初始化SPI4U32编码器
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_SPI4);
//配置SPI4引脚
gpio_af_set(GPIOE, GPIO_AF_6, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14); //PE12,13,14复用为SPI4
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14); //注意一下MISO是输入模式这里可能会有问题
//配置CS引脚
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
gpio_bit_set(GPIOE, GPIO_PIN_11); //默认CS引脚高电平
//配置SPI4参数不超过8MHz暂定5MHz左右
spi_parameter_struct spi_init_struct2;
spi_struct_para_init(&spi_init_struct2);
spi_init_struct2.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct2.device_mode = SPI_MASTER;
spi_init_struct2.frame_size = SPI_FRAMESIZE_16BIT; //16位帧长
spi_init_struct2.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE; //时钟极性为低,相位为第二边缘(下降沿)
spi_init_struct2.nss = SPI_NSS_SOFT; //软件控制
spi_init_struct2.prescale = SPI_PSC_16; //时钟预分频系数为16(5MHz左右)
spi_init_struct2.endian = SPI_ENDIAN_MSB; //高位先出
spi_init(SPI4, &spi_init_struct2);
spi_enable(SPI4);
//初始化后延迟
}
void as5047d_init()
{
TMR3109_Init();
}
// SPI发送接收32位数据(GD32的SPI只支持8位或16位传输所以需要分两次发送)
static uint32_t spi_transfer_32bit(uint32_t spi_periph, uint32_t data)
{
uint16_t temp_high, temp_low;
uint32_t received_data = 0;
uint32_t start_tick;
const uint32_t timeout_ticks = 10; // 10ms超时
// 提取要发送的32位数据的高16位和低16位
temp_high = (uint16_t)(data >> 16); // 高16位
temp_low = (uint16_t)(data & 0xFFFF); // 低16位
// 1. 先发送高16位并读取高16位响应
start_tick = OSTimeGet();
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE));
{
//超时判断
if (OSTimeGet() - start_tick > timeout_ticks) {
// 根据SPI外设判断使用哪个片选引脚
if (spi_periph == SPI2) {
gpio_bit_set(GPIOA, GPIO_PIN_15); // tmr3109_dev1 CS拉高
} else if (spi_periph == SPI4) {
gpio_bit_set(GPIOE, GPIO_PIN_11); // tmr3109_dev2 CS拉高
}
return 0xFFFFFFFF;
}
}
spi_i2s_data_transmit(spi_periph, temp_high);
start_tick = OSTimeGet();
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE));
{
if (OSTimeGet() - start_tick > timeout_ticks) {
if (spi_periph == SPI2) {
gpio_bit_set(GPIOA, GPIO_PIN_15);
} else if (spi_periph == SPI4) {
gpio_bit_set(GPIOE, GPIO_PIN_11);
}
return 0xFFFFFFFF;
}
}
received_data = (uint32_t)spi_i2s_data_receive(spi_periph) << 16; // 存储到高16位
// 2. 紧接着发送低16位并读取低16位响应
start_tick = OSTimeGet();
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE));
{
if (OSTimeGet() - start_tick > timeout_ticks) {
if (spi_periph == SPI2) {
gpio_bit_set(GPIOA, GPIO_PIN_15);
} else if (spi_periph == SPI4) {
gpio_bit_set(GPIOE, GPIO_PIN_11);
}
return 0xFFFFFFFF;
}
}
spi_i2s_data_transmit(spi_periph, temp_low);
start_tick = OSTimeGet();
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE));
{
if (OSTimeGet() - start_tick > timeout_ticks) {
if (spi_periph == SPI2) {
gpio_bit_set(GPIOA, GPIO_PIN_15);
} else if (spi_periph == SPI4) {
gpio_bit_set(GPIOE, GPIO_PIN_11);
}
return 0xFFFFFFFF;
}
}
received_data |= spi_i2s_data_receive(spi_periph); // 存储到低16位
return received_data;
}
//设置CS引脚
static void set_cs(TMR3109_Device* dev, bool state)
{
if(state)
{
gpio_bit_set(dev->cs_gpio_periph, dev->cs_pin);
}
else
{
gpio_bit_reset(dev->cs_gpio_periph, dev->cs_pin);
}
}
/**
* @brief TMR3109角度数据的CRC4校验码
* @param angle_data 23
* @return 4CRC校验码
*/
uint8_t TMR3109_CalculateCRC(uint32_t angle_data_23bit)
{
// 多项式: x^4 + x^3 + x^2 + 1 = 0b1101 = 0x0D
const uint8_t polynomial = 0x0D;
// 初始值: 0b0011 = 0x3
uint8_t crc = 0x3;
// 构建24位数据: 1位0 + 23位角度值
uint32_t data = angle_data_23bit; // 低23位是角度值
// 最高位已经是0因为angle_data_23bit只有23位
// 处理24位数据从最高位开始
for (int i = 23; i >= 0; i--) {
// 检查CRC最高位
uint8_t crc_msb = (crc >> 3) & 0x1;
// 获取当前数据位
uint8_t data_bit = (data >> i) & 0x1;
// CRC左移1位最低位补0
crc = (crc << 1) & 0x0F;
// 如果CRC最高位与数据位异或结果为1则与多项式异或
if (crc_msb ^ data_bit) {
crc ^= polynomial;
}
}
return crc & 0x0F; // 确保返回4位
}
/**
* @brief TMR3109角度数据的CRC
* @param angle_data_23bit 23
* @param received_crc 4CRC
* @return true表示CRC校验通过
*/
bool TMR3109_CheckCRC(uint32_t angle_data_23bit, uint8_t received_crc)
{
uint8_t calculated_crc = TMR3109_CalculateCRC(angle_data_23bit);
return (calculated_crc == received_crc);
}
//读角度
bool TMR3109_ReadAngle(TMR3109_Device* dev, TMR3109_AngleData* angle_data)
{
if(dev == NULL || angle_data == NULL) return false;
//读角度命令: 操作码3bit+地址8bit+空闲5bit+数据16bit
uint32_t tx_data = (TMR3109_OPCODE_READ_ANGLE << 29)| (0X00 << 21) | (0X00 << 16) | (0X00 << 0) ;
set_cs(dev, false); //使能CS
delay_us(20); //SPI启动时间 优化点
//发送32位数据并接收响应
uint32_t rx_data = spi_transfer_32bit(dev->spi_periph, tx_data);
set_cs(dev, true); //拉高片选
//解析响应数据
//d27~d5: 23位角度数据d4~d1: CRC校验码d0: error位
angle_data->angle_raw = (rx_data >> 5) & 0X7FFFFF; //取23位角度数据
angle_data->crc = (rx_data >> 1) & 0X0F; //取4位CRC校验码
angle_data->error = rx_data & 0X01; //取1位error位
//计算角度值((∑_{i=0}^{23} Angle<i> * 2^i) / 8388608 * 360)
angle_data->angle_degree = (angle_data->angle_raw * 360.0f) / 8388608.0f;
//数据有效性校验(加入CRC校验)
bool crc_valid = TMR3109_CheckCRC(angle_data->angle_raw, angle_data->crc);
// angle_data->is_valid = 0/*(angle_data->error == 0)*/; //注意这里的error位有问题手册没找到error位的具体定义
angle_data->is_valid = crc_valid;
//CRC错误记录逻辑后期添加
// if(!crc_valid) {
// //CRC校验失败记录错误信息
// //...
// }
return angle_data->is_valid;
}
float as5047d_hori_get_angle_a()
{
if (TMR3109_ReadAngle(&tmr3109_dev1, &hori_angle_data)) {
return hori_angle_data.angle_degree;
}
return 0.0f;
}
float as5047d_vert_get_angle_a()
{
if (TMR3109_ReadAngle(&tmr3109_dev2, &vert_angle_data)) {
return vert_angle_data.angle_degree;
}
return 0.0f;
}
#endif

View File

@ -2,6 +2,13 @@
#define __AS5047D_H_
#include "gd32f4xx.h"
#define TMR3109 1
#if !(AS5047) && !(TMR3109)
#define AS5047
#endif
#ifdef AS5047
///水平AS5047D端口
///CSn
///将AS5047D_HORI的CSn引脚置为高电平
@ -163,7 +170,51 @@ float as5047d_vert_get_angle();
unsigned int as5047d_vert_cef_command();
float as5047d_hori_get_angle_a();
float as5047d_vert_get_angle_a();
unsigned int as5047d_vert_read_data_a();
unsigned int as5047d_hori_read_data_a();
#endif
#ifdef TMR3109
// #define AS5047D_DIR_FWD 1 //磁编码器正向转动
// #define AS5047D_DIR_REV 0 //磁编码器反向转动
#define AS5047D_DIR_FWD 0 //磁编码器正向转动
#define AS5047D_DIR_REV 1 //磁编码器反向转动
///用于保存对接收数据的判断结果
///
///用于保存对接收数据的判断结果,并且详细保存出错的具体原因
///_master表示as5047d对接收到的指令判断的结果_slave表示K60对as5047d返回的数据包判断结果
typedef struct _As5047DJudgeReceivePackage_
{
///接收到的数据包
unsigned int package;
///k60对AS5047D回复的数据进行判断
///判断接收的数据包效验码是否正确,1错误0正常
unsigned char parity_error_package;
///AS5047D对接收到的K60指令进行判断,指令有错时的回复结果
///数据Error flagEF
unsigned char error_flag_command;
///校验错误1错误0正常
unsigned char parity_error_command;
///命令无效1错误0正常
unsigned char command_invalid_command;
///帧错误1错误0正常
unsigned char framing_error_command;
///数据操作是否成功0不成功1成功.即判断写入或者读取数据是否成功
unsigned char Operation_Result;
}As5047DJudgeReceivePackage;
void as5047d_init();
float as5047d_hori_get_angle_a();
float as5047d_vert_get_angle_a();
#endif
#endif

View File

@ -0,0 +1,8 @@
#include "servoMotor.h"
void servoMotorInit(void)
{
}

View File

@ -0,0 +1,8 @@
#ifndef _DRIVER_SERVO_MOTOR_H_
#define _DRIVER_SERVO_MOTOR_H_
#include "gd32f4xx.h"
void servoMotorInit(void);
#endif

View File

@ -409,6 +409,7 @@
<state>$PROJ_DIR$\..\BSP\Driver\timer</state>
<state>$PROJ_DIR$\..\BSP\Driver\full_bridge</state>
<state>$PROJ_DIR$\..\APP\Service</state>
<state>$PROJ_DIR$\..\BSP\Driver\servoMotor</state>
</option>
<option>
<name>CCStdIncCheck</name>
@ -2422,6 +2423,12 @@
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_plan.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_servo.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_servo.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_step.c</name>
</file>
@ -2744,6 +2751,9 @@
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_bldc.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_servoMotor.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_step.c</name>
</file>
@ -2912,6 +2922,12 @@
<name>$PROJ_DIR$\..\BSP\Driver\ringqueue\ring_queue.h</name>
</file>
</group>
<group>
<name>servoMotor</name>
<file>
<name>$PROJ_DIR$\..\BSP\Driver\servoMotor\servoMotor.c</name>
</file>
</group>
<group>
<name>timer</name>
<file>

View File

@ -2999,6 +2999,12 @@
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_plan.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_servo.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_servo.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_rotate\rotate_step.c</name>
</file>
@ -3014,6 +3020,9 @@
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_bldc.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_servoMotor.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\APP\Device\Device_speed\speed_to_step.c</name>
</file>
@ -3182,6 +3191,12 @@
<name>$PROJ_DIR$\..\BSP\Driver\ringqueue\ring_queue.h</name>
</file>
</group>
<group>
<name>servoMotor</name>
<file>
<name>$PROJ_DIR$\..\BSP\Driver\servoMotor\servoMotor.c</name>
</file>
</group>
<group>
<name>timer</name>
<file>