#ifndef __PTZ_STRUCT_H_ #define __PTZ_STRUCT_H_ #include "sock_utils.h" #include "ptz_type_select.h" #include "tmc2160.h" #include "rotate_electricstable.h" ///注: ///_set表示实际设定的参数,_actual表示实际参数,_state表示状态 ///_last表示保存上一次的参数,_plan表示规划参数,_num表示计数,_count表示计数 ///_control表示控制值 typedef struct _PtzRotatePlan_ { float max_speed;//最大转速 float start_angle;//起始点 float stop_angle;//结束点 float stop_near_angle;//刹车最近点 float stop_far_angle; //刹车最远点 float stop_angle_range;//刹车范围,即stop_near_angle和stop_far_angle之间的绝对距离 float accelerate_end_angle;//加速结束点 float decelerate_start_angle;//减速起始点 char direction;//方向 float accelerate_angle_range;//起始点和加速结束点之间的距离绝对值 float decelerate_angle_range;//减速点和停止位置之间的距离绝对值 float uniform_angle_range; //匀速运动的距离绝对值 float total_rotate_range; //需要转动的总的距离 char rotate_switch; //转动开关,1需要转动,0不需要转动 }PtzRotatePlan; ///云台角度参数 typedef struct _PtzAngleParameter_ { float angle_min;//云台角度最小值 float angle_max;//云台角度最大值 float angle_allow_min;//云台可用角度最小值 float angle_allow_max;//云台可用角度最大值 float angle_range;//云台角度范围 }PtzAngleParameter; typedef struct _CameraLens_ { unsigned char foucs_state; //状态 unsigned char zoom_state; //状态 float focus_v;//聚焦反馈电压 float focus_v_bit;//聚焦反馈电压预置位控制 unsigned char focus_g; //聚焦速度等级 unsigned char focus_pwm_on;//PWM开启时间ms unsigned char focus_pwm_off;//PWM关闭时间ms float zoom_v;//变倍反馈电压 float zoom_v_bit;//变倍反馈电压预置位控制 unsigned char zoom_g;//变倍速度等级 unsigned char zoom_pwm_on;//PWM开启时间ms unsigned char zoom_pwm_off;//PWM关闭时间ms }CameraLens; #define CAMERA_LES_FOCUS_OFF 0//聚焦关 #define CAMERA_LES_FOCUS_INC 1//聚焦加 #define CAMERA_LES_FOCUS_RED 2//聚焦减 #define CAMERA_LES_FOCUS_BIT 3//聚焦预置位控制 #define CAMERA_LES_FOCUS_STOP 4//聚焦停 #define CAMERA_LES_ZOOM_OFF 0//变倍关 #define CAMERA_LES_ZOOM_INC 1//变倍加 #define CAMERA_LES_ZOOM_RED 2//变倍减 #define CAMERA_LES_ZOOM_BIT 3//变倍预置位控制 #define CAMERA_LES_ZOOM_STOP 4//变倍停 #define CAMERA_LES_FOCUS_FV_MAX 3.3 //反馈电压最大值V #define CAMERA_LES_FOCUS_FV_MIN 0 //反馈电压最小值V #define CAMERA_LES_FOCUS_FV_BIT 0.06 //预置位目标电压和实际电压允许最小差值 #define CAMERA_LES_ZOOM_FV_MAX 3.3 //反馈电压最大值V #define CAMERA_LES_ZOOM_FV_MIN 0 //反馈电压最小值V #define CAMERA_LES_ZOOM_FV_BIT 0.06 //预置位目标电压和实际电压允许最小差值 #define CAMERA_LES_FOCUS_T 20 //PWM调速的最大周期ms #define CAMERA_LES_ZOOM_T 20 //PWM调速的最大周期ms #define CAMERA_LES_V_NUM 5 //反馈电压采集次数 typedef struct _PtzAs5047D_ { ///as5047d云台基准位置初始角度值 float as5047d_ptz_init_angle; ///as5047d角度相对于云台角度最大值 float as5047d_ptz_angle_max; ///磁编码器角度换算成云台角度对应的一次函数斜率K float as5047d_ptz_angle_K; ///as5047d相对于云台的角度的滤波角度当前值 float as5047d_ptz_angle_wf_actual; ///as5047d相对于云台的角度的滤波角度上一次的值 float as5047d_ptz_angle_wf_last; ///as5047d相对于云台的角度当前实际值 float as5047d_ptz_angle_actual; ///as5047d相对于云台的角度上一次值 float as5047d_ptz_angle_last; ///云台转动范围对应的磁编码应当转动的总角度: ///as5047d_ptz_angle_max = as5047d_cycle_num * 360 + as5047d_remain_angle ///as5047d除开转动的整圈数外,多出的不满足整圈的度数 float as5047d_remain_angle; ///as5047d转动的整圈数的数值 int as5047d_cycle_num; ///as5047d转动的整圈数计数,转动一圈加减1 int as5047d_cycle_count; int as5047d_cycle_count_last; //int as5047d_cycle_count_last_last; ///as5047d采集到的实时角度值 float as5047d_angle_actual; ///as5047d的转向 char as5047d_dir; ///as5047d的数据读错次数 //unsigned int as5047d_read_error_count; ///as5047d采集到的上一次实时角度值 float as5047d_angle_last; ///as5047d采集到的实时角度值与上一次实时角度值的差值 float as5047d_angle_difference; ///as5047d的状态,0处于自检初始化,1 数据能够正常使用, 0xff故障 char as5047d_state; ///as5047d的数据是否全部清除,0 不需要清除, 1清除数据 char as5047d_data_reset; ///磁编码器测转速 ///as5047d磁编码器转速 float as5047d_speed_actual; ///测试as5047d磁编码器转速起始角度a float as5047d_speed_angle_a; ///测试as5047d磁编码器转速结束角度b float as5047d_speed_angle_b; ///测试as5047d磁编码器转速起始角度a、结束角度b之间的差值 float as5047d_speed_angle_c; ///测试as5047d磁编码器转速起始角度a、结束角度b之间的上一次差值 float as5047d_speed_angle_c_last; unsigned int time_now; unsigned int time_end; unsigned int time; }PtzAs5047D; //typedef struct _PtzJy02a_ //{ // ///jy02a电机驱动芯片返回的脉冲数,主要是计算电机转速 // unsigned int jy02a_fg_num_actual; // unsigned int jy02a_fg_num_last; //}PtzJy02a; //电机驱动芯片L6235D typedef struct _PtzL6235d_ { char l6235d_hall_state_actual;//当前的霍尔状态,即当前收到的是哪个霍尔脉冲 char l6235d_hall_state_last;//上一次霍尔状态 unsigned int l6235d_hall_h1_count;//霍尔计数 unsigned int l6235d_hall_h2_count; unsigned int l6235d_hall_h3_count; unsigned int l6235d_hall_h123_count;//霍尔总数 //unsigned int l6235d_satae_save_count;//霍尔存储总数计数 //char l6235d_hall_state_save[L6235D_HALL_SAVE_NUM];//霍尔状态保存 char l6235d_motor_dir_actual;//通过霍尔判断的电机实际转向 }PtzL6235d; ///PID调速所有参数 typedef struct _PtzPidValue_ { char mode;//调速方式选择,0默认VREF调速(pid调速);1采用向刹车输入PWM波,改变反向力矩大小调速(刹车调速) //通过VREF调速,PID调速 float SumError;//累计误差 double KP;//比例常数 double TI;//积分常数 double TD;//微分常数 float LastError;//上一次输入偏差 float PrevError;//上上次输入偏差 float LastUT_float;//上一次PID的输出值 float T;//采样周期 double A;//三个简化参数A,B,C double B; double C; float PidUT_float;//pid调速当前输出值,浮点数 unsigned int PidUT_uint;//pid调速当前输出值,整数 //通过方向输入PWM波,改变反向力矩大小调速,director调速 unsigned int director_speed_vref;//输入模拟电压等级 char director_speed_direction;//反向力矩调速的方向 unsigned short int director_speed_start_t; //刹车解除周期 unsigned short int director_speed_stop_t;//刹车周期 unsigned short int director_speed_t;//总周期 unsigned char director_speed_state;//反向力矩调速的过程 unsigned int hall_h1_count;//霍尔计数 unsigned int hall_h2_count; unsigned int hall_h3_count; unsigned int hall_h123_count;//霍尔总数 unsigned int hall_h1_count_last;//上次霍尔计数 unsigned int hall_h2_count_last; unsigned int hall_h3_count_last; unsigned int hall_h123_count_last; unsigned int hall_h1_count_time;//霍尔计时总时间 unsigned int hall_h2_count_time; unsigned int hall_h3_count_time; unsigned int hall_h123_count_time; unsigned int hall_h1_count_time_s;//霍尔计时起始时间 unsigned int hall_h2_count_time_s; unsigned int hall_h3_count_time_s; unsigned int hall_h123_count_time_s; unsigned int hall_h1_count_time_e;//霍尔计时结束时间 unsigned int hall_h2_count_time_e; unsigned int hall_h3_count_time_e; unsigned int hall_h123_count_time_e; char hall_h1_start_flag;//霍尔计时,起始时间标记 char hall_h2_start_flag;//0还没收到第一个霍尔脉冲,1已经收到第一个霍尔脉冲 char hall_h3_start_flag; char hall_h123_start_flag; float hall_h1_motor_speed;//霍尔h1传感器测出的电机转速 float hall_h2_motor_speed;//霍尔h2传感器测出的电机转速 float hall_h3_motor_speed;//霍尔h3传感器测出的电机转速 float hall_h123_motor_speed;//霍尔h3传感器测出的电机转速 char roll_start; //电机开始转动的标志,0电机还没有开始转动,1电机开始转动。 //char srm;//调速方法:0,直线调速;1,PID调速。 }PtzPidValue; ///云台故障,1故障,0无故障 typedef struct _FaultDetect_ { char vert_sw1_fault;//垂直SW1开关故障 char vert_sw2_fault;//垂直SW2开关故障 char hori_rotate_fault;//水平转动故障 char vert_rotate_fault;//垂直转动故障 char hori_hall_fault;//水平电机霍尔故障 char vert_hall_fault;//垂直电机霍尔故障 char temperature_fault;//温度异常 char h_ntc_temp_fault;//温度异常 char v_ntc_temp_fault;//温度异常 char voltage_fault;//电压异常 char electric_current_fault;//电流异常 char Phase_curr_V;//水平电机相电流 char Phase_curr_H;//垂直电机相电流 char fault;//故障总标志,只要有故障就置为1 }FaultDetect; ///相机电源、护罩电源、辅助开关电源 typedef struct _AuxSwitchPower_ { char aux_switch_1; char aux_switch_2; char aux_switch_3; char aux_switch_4; }AuxSwitchPower; ///云台0位偏移角度 typedef struct _PtzZeroOffsetAngle_ { float offset_anle;//矫正偏移量 float hori_zero_offset_angle;//云台水平偏移角度 float vert_zero_offset_angle;//云台水平偏移角度 char hori_offset_switch;//水平偏移开关,1打开偏移,0关闭,2偏移数据存储正确并打开偏移开关 char vert_offset_switch;//垂直偏移开关,1打开偏移,0关闭,2偏移数据存储正确并打开偏移开关 unsigned int crc;//效验码 }PtzZeroOffsetAngle; ///云台调试端口,保存收到的UDP包的源IP地址、源MAC址,用于向保存的指定的端口和IP发送消息 typedef struct _PtzDebug_ { char open_switch;//是否打开发送 struct sockaddr_in data_from;//IP和端口 socklen_t data_fromlen;//长度 }PtzDebug; ///上位机窗口打印 typedef struct _Ptzprintf_ { char net_udp_printf_switch;//是否打开,1打开,0关闭 char uart_422_printf_switch;//是否打开,1打开,0关闭 char uart_485_printf_switch;//是否打开,1打开,0关闭 struct sockaddr_in printf_from;//IP和端口 socklen_t printf_fromlen;//长度 }Ptzprintf; ///云台角度定位回传 typedef struct _PtzAngleLocation_ { char net_udp_location_switch;//是否打开,1打开,0关闭 char uart_422_location_switch;//是否打开,1打开,0关闭 char uart_485_location_switch;//是否打开,1打开,0关闭 struct sockaddr_in hori_cmd_from;//IP和端口 socklen_t hori_cmd_fromlen;//长度 char hori_cmd;//1收到水平角度控制指令,0未收到水平角度控制指令 unsigned char hori_angle[7];//存储收到的水平角度指令 struct sockaddr_in vert_cmd_from;//IP和端口 socklen_t vert_cmd_fromlen;//长度 char vert_cmd;//1收到垂直角度控制指令,0未收到垂直角度控制指令 unsigned char vert_angle[7];//存储收到的垂直角度指令 }PtzAngleLocation; ///云台区域扫描,扫描一个区域结束后回传,单步扫描到位回传 typedef struct _PtzAreaScanEnd_ { char area_scan_end_udp_switch;//是否打开,1打开,0关闭 char area_scan_end_uart_422_switch;//是否打开,1打开,0关闭 char area_scan_end_uart_485_switch;//是否打开,1打开,0关闭 //char area_scan_cmd;//是否收到区域扫描启动指令 char area_step_scan_location_udp_switch;//单步扫描到位回传 char area_step_scan_location_uart_422_switch;//单步扫描到位回传 char area_step_scan_location_uart_485_switch;//单步扫描到位回传 struct sockaddr_in area_scan_end_from;//IP和端口 socklen_t area_scan_end_fromlen;//长度 struct sockaddr_in area_step_scan_location_from;//IP和端口 socklen_t area_step_scan_location_fromlen;//长度 }PtzAreaScanEnd; ///云台预置位到位回传 typedef struct _PtzPresetBit_ { //预置位扫描结束 char preset_bit_scan_end_udp_switch;//是否打开,1打开,0关闭 char preset_bit_scan_end_uart_422_switch;//是否打开,1打开,0关闭 char preset_bit_scan_end_uart_485_switch;//是否打开,1打开,0关闭 //预置位扫描到达预置位 char preset_bit_scan_location_udp_switch;//是否打开,1打开,0关闭 char preset_bit_scan_location_uart_422_switch;//是否打开,1打开,0关闭 char preset_bit_scan_location_uart_485_switch;//是否打开,1打开,0关闭 //普通预置位调用 char preset_bit_location_udp_switch;//是否打开,1打开,0关闭 char preset_bit_location_uart_422_switch;//是否打开,1打开,0关闭 char preset_bit_location_uart_485_switch;//是否打开,1打开,0关闭 char preset_bit_location_num;//定位的预置位编号 char preset_bit_location_cmd;//1收到调用预置位指令,2到达预置位水平位置或垂直位置,3预置位水平位置和垂直位置都到达,0没有收到预置位指令 char preset_bit_location_cmd_source;//指令来源 struct sockaddr_in preset_bit_scan_end_from;//IP和端口 socklen_t preset_bit_scan_end_fromlen;//长度 struct sockaddr_in preset_bit_scan_location_from;//IP和端口 socklen_t preset_bit_scan_location_fromlen;//长度 struct sockaddr_in preset_bit_location_from;//IP和端口 socklen_t preset_bit_location_fromlen;//长度 }PtzPresetBit; //保存指令来源 typedef struct _PtzCmdSave_ { unsigned char cmd_data[7]; struct sockaddr_in cmd_from;//IP和端口 socklen_t cmd_fromlen;//长度 char cmd_data_flag; //指令保存标志,1表示接收过数据,0表示从没有接收过数据 char cmd_data_udp_flag;//UDP指令保存标志,1表示接收过UDP数据,0表示从没有接收过UDP数据 char cmd_dev;//指令来源通道号 }PtzCmdSave; ///用于存储云台当前的工作状态 /// ///用于存储云台当前的工作状态 typedef struct _PtzState_ { ///云台地址 unsigned char address; ///云台串口波特率 int uart_422_baud; int uart_485_baud; /**********************电机及驱动器类型********************/ #ifdef PTZ_BLDC_MOTOR ///电机驱动芯片l6235d PtzL6235d hori_l6235d; PtzL6235d vert_l6235d; #endif #ifdef PTZ_STEP_MOTOR #ifdef DRV8711 Drv8711Control hori_drv8711; Drv8711Control vert_drv8711; #endif #ifdef TMC2160 TMC2160Control hori_tmc2160; TMC2160Control vert_tmc2160; #endif char hori_dec_mode;//水平电机减速模式,0为按照设定的最大减速时间减速,1按照默认时间减速 char vert_dec_mode;//垂直电机减速模式,0为按照设定的最大减速时间减速,1按照默认时间减速 #endif /*************************水平转动变量***********************/ ///云台转动控制开关,不同的值表示不同的控制模式,为0时表示关闭 ///1 向有转动 ,2 向左转动, 3角度定位(转到指定角度),4 停止转动 char hori_rotate_monitor_switch; ///云台水平角度 float hori_angle_set; float hori_angle_actual; float hori_angle_actual_a;//实际角度 float hori_angle_last; float hori_angle_control; float hori_angle_right_inc_control;//向右转动,角度增量 float hori_angle_left_inc_control;//向左转动,角度增量 ///云台水平电机启停 char hori_start_stop_set; char hori_start_stop_actual; ///云台水平转动方向 char hori_direction_set; char hori_direction_actual; char hori_direction_last; char hori_direction_control; ///云台水平转速 float hori_speed_set; float hori_speed_actual; float hori_speed_control; float hori_speed_as5047d_actual;//根据磁编码器算出的云台转速 float hori_speed_jy02a_actual;//根据电机驱动芯片算出的云台转速 float hori_speed_hall_actual;//根据电机霍尔传感器算出的云台转速 ///云台水平电机转速 float hori_motor_speed_set; float hori_motor_speed_actual; float hori_motor_speed_as5047d_actual;//根据磁编码器算出的电机转速 float hori_motor_speed_jy02a_actual;//根据电机驱动芯片算出的电机转速 float hori_motor_speed_hall_actual;//根据电机霍尔传感器算出的电机转速 /*************************垂直转动变量***********************/ ///云台转动控制开关 char vert_rotate_monitor_switch; ///云台垂直角度 float vert_angle_set; float vert_angle_actual;//实际角度 float vert_angle_actual_a;//实际角度 float vert_angle_last; float vert_angle_control; ///云台垂直电机启停 char vert_start_stop_set; char vert_start_stop_actual; ///云台垂直转动方向 char vert_direction_set; char vert_direction_actual; char vert_direction_last; char vert_direction_control; ///云台垂直转速 float vert_speed_set; float vert_speed_actual; float vert_speed_control; float vert_speed_as5047d_actual;//根据磁编码器算出的云台转速 float vert_speed_jy02a_actual;//根据电机驱动芯片算出的云台转速 float vert_speed_hall_actual;//根据电机霍尔传感器算出的云台转速 ///云台垂直电机转速 float vert_motor_speed_set; float vert_motor_speed_actual; float vert_motor_speed_as5047d_actual;//根据磁编码器算出的电机转速 float vert_motor_speed_jy02a_actual;//根据电机驱动芯片算出的电机转速 float vert_motor_speed_hall_actual;//根据电机霍尔传感器算出的电机转速 ///云台PID调速参数 PtzPidValue vert_pid; PtzPidValue hori_pid; /**********************位置检测开关类型********************/ #ifdef PTZ_PHOTOELECTRIC_SWITCH ///水平挡片状态,遮光输出低电平,未遮光输出高电平 char hori_ps_sw3_state; ///水平挡片右转下降沿中断标志,1触发下降沿中断,0正常。 unsigned int hori_ps_sw3_right_fall; ///水平挡片右转上升沿中断标志,1触发上升沿中断,0正常。 unsigned int hori_ps_sw3_right_rise; ///水平挡片左转下降沿中断标志,1触发下降沿中断,0正常。 unsigned int hori_ps_sw3_left_fall; ///水平挡片左转上升沿中断标志,1触发上升沿中断,0正常。 unsigned int hori_ps_sw3_left_rise; ///垂直挡片状态,遮光输出低电平,未遮光输出高电平 char vert_ps_sw1_state; char vert_ps_sw2_state; unsigned int vert_ps_sw1_down_fall; unsigned int vert_ps_sw1_up_rise; unsigned int vert_ps_sw2_up_fall; unsigned int vert_ps_sw2_down_rise; #endif ///云台水平转动规划 PtzRotatePlan hori_rotate_plan; ///云台垂直转动规划 PtzRotatePlan vert_rotate_plan; ///云台水平自检标志,255表示自检结束 unsigned char hori_self_check; ///云台垂直自检标记,255表示自检结束 unsigned char vert_self_check; ///云台水平磁编码器 PtzAs5047D hori_as5047d; ///云台垂直磁编码器 PtzAs5047D vert_as5047d; ///云台水平角度范围参数 PtzAngleParameter hori_angleP; ///云台垂直角度范围参数 PtzAngleParameter vert_angleP; ///云台转动定位是否到达指定位置 char hori_arrive_flag;//1正在转向指定位置,0到达指定位置 ///云台转动定位是否到达指定位置 char vert_arrive_flag;//1正在转向指定位置,0到达指定位置 ///重复定位开关 char hori_repeat_locate_switch;//0不需要重复定位,1需要重复定位 ///重复定位开关 char vert_repeat_locate_switch;//0不需要重复定位,1需要重复定位 /******************************************/ /*温度、电压、电流*/ float H_boad_temp;//水平电机侧驱动电路主板温度 float V_boad_temp;//垂直电机侧驱动电路主板温度 float temperature; float Voltage; float electric_current; ///故障检测 FaultDetect fault_detect; ///指令回复开关 char cmd_reply_switch;//1回复打开,0回复关闭 #ifdef PTZ_ELECTRIC_STABLE_L6235D ///电子稳定,反向力矩 ElectricStable hori_electric_stable; ElectricStable vert_electric_stable; #endif ///护罩电源管理 AuxSwitchPower power; ///保存当前接收到的指令 PtzCmdSave cmd_save; ///角度偏移量 PtzZeroOffsetAngle offset_angle; ///云台调试端口数据 PtzDebug debug_data; ///角度定位回传 PtzAngleLocation location_return; ///区域扫描结束回传 PtzAreaScanEnd area_scan_return; ///预置位到达回传 PtzPresetBit preset_bit_return; //上位机窗口打印输出 Ptzprintf ptz_printf; ///云台继电器开关状态 unsigned char ptz_motor_relay_state; ///云台不自检位置数据读取状态 unsigned char no_self_check_state; //0读取云台位置参数失败,1读取位置数据成功,2读取自检数据成功后擦除位置数据 ///云台不自检强制保存数据 unsigned char no_self_check_force_save; //0不强制保存,1强制保存 ///强制删除位置数据 unsigned char no_self_check_force_erase; //0不强制删除,1强制删除 ///预处理指令保存开关 char cmd_before_handle_swtich;//1打开预处理指令功能并保存;0关闭预处理指令功能 ///长焦镜头控制 CameraLens cameralens; // PtzWorkTime time;//云台工作时间计时 unsigned char hori_angle_state;//角度状态,0故障,1正常 unsigned char vert_angle_state;//角度状态,0故障,1正常 unsigned char hori_angle_erro_switch;//水平角度误差消除开关,初始化于角度模块中,0——关闭,1——打开 float hori_angle_error;//存储水平结构误差 /***测试用***/ //磁编码器圈数计算异常统计 unsigned int hori_jia;//++ unsigned int hori_jian;//-- unsigned int hori_cuowu;//错误 unsigned int vert_jia;//++ unsigned int vert_jian;//-- unsigned int vert_cuowu;//错误 unsigned int vert_stop_num; }PtzState; extern PtzState g_ptz; typedef struct _cycle_count_ { float intit; float actual; int count; }cycle_count; #endif