#include "ptz_header_file.h" #include "get_angle.h" #include "rotate_plan.h" #include "rotate_bldc.h" #include "rotate_step.h" #include "agent_hyt.h" #include "ptz_struct.h" #include "math.h" #include "service_selfcheck.h" #include "ptz_type_select.h" #include "ptz_global_variable.h" #include "speed_to_step.h" ///云台角度回复 void ptz_send_angle(char dev,char angle_choice) { unsigned short int uint16_angle; unsigned char data[7]; if(angle_choice == PTZ_HORI) { uint16_angle = (unsigned short int)(g_ptz.hori_angle_actual * 100 + 0.5); data[0] = 0xff; data[1] = g_ptz.address; data[3] = 0x59; data[4] = (u_int16_t)(uint16_angle >> 8); data[5] = (u_int16_t)(uint16_angle & 0x00ff); data[6] = MotorCalPelcoDSUM(data,sizeof(data)); } else//angle_choice == PTZ_VERT { uint16_angle = (unsigned short int)(g_ptz.vert_angle_actual * 100 + 0.5); data[0] = 0xff; data[1] = g_ptz.address; data[3] = 0x5b; data[4] = (u_int16_t)(uint16_angle >> 8); data[5] = (u_int16_t)(uint16_angle & 0x00ff); data[6] = MotorCalPelcoDSUM(data,sizeof(data)); } ptz_send_data(dev, data, sizeof(data)); } //角度状态查询,仅代理层调用 void ptz_send_sw_angle_state(char dev) { unsigned char data[7]; data[0] = 0xff; data[1] = g_ptz.address; data[2] = 0x9d; data[3] = 0; data[4] = g_ptz.hori_angle_state; data[5] = g_ptz.vert_angle_state; data[6] = MotorCalPelcoDSUM(data,sizeof(data)); ptz_send_data(dev, data, sizeof(data)); } //时间计算 unsigned int time_ticks(unsigned int time_now, unsigned time_end) { unsigned int time; if(time_now >= time_end) { time = time_now - time_end; } else { time = (time_now - 0) + (4294967295 - time_end); } return time; } #ifdef PTZ_BLDC_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); } else { vert_ps_time = (unsigned int)((PTZ_VERT_MAX_SPEED / PTZ_VERT_MIN_SPEED) * PTZ_VERT_PS_TIEM); } 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_STEP_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() { float right_diff_x1 = 0; float right_diff_x2 = 0; float hori_angle[PTZ_HORI_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0; float tem = 0; float tem1 = 0; float tem2 = 0; float left_diff_x1 = 0; float left_diff_x2 = 0; unsigned int tem3 = 0; float tem4 = 0; static float hori_cycle_angle_right; static float hori_cycle_angle_left; char flag; #ifdef PTZ_HORI_GET_ANGLE_MANY for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { hori_angle[i] = as5047d_hori_get_angle_a(); // test_angle[test_angle_count] = hori_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } if(hori_angle[i] < 0 || //防止读出的角度为负值 hori_angle[i] > 360.0||//防止读出的数值超过360 isnan(hori_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { if(fabs(hori_angle[i] - hori_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { if(hori_angle[i] < 5.0) { hori_angle[i] = hori_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_HORI_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_HORI_ANGLE_READ_NUM-j-1; k++) { if(hori_angle[k] > hori_angle[k+1]) { tem = hori_angle[k]; hori_angle[k] = hori_angle[k+1]; hori_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { tem = tem + hori_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_HORI_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_HORI_GET_ANGLE_SINGLE tem = as5047d_hori_get_angle_a(); // hori_as5047d_angle_save[hori_as5047d_angle_save_count] = tem; // hori_as5047d_angle_save_count ++; // if(hori_as5047d_angle_save_lock >= 1) // { // hori_as5047d_angle_save_lock ++; // } // if(hori_as5047d_angle_save_lock >= 10) // { // hori_as5047d_angle_save_lock = 0; // } // if(hori_as5047d_angle_save_count > 48) // { // hori_as5047d_angle_save_count = 0; // } if(tem < 0 || //防止读出的角度为负值 tem > 360.0||//防止读出的数值超过360 isnan(tem) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 return 0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.hori_as5047d.as5047d_data_reset == 1) { g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_cycle_num = 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_data_reset = 0; tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; } //反转,云台角度减小,磁编码角度增大 if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_right_fall >= 1) // { // if(PS_HORI_SW3_READ == PS_COVER) // { // 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_ps_sw3_right_fall = 0; // } // } if(g_ptz.hori_ps_sw3_left_rise >= 1) { #ifdef PTZ_SW3_LEFT_RISE_UPDATE ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_NO_COVER) { g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } g_ptz.hori_angle_state = 1; g_ptz.hori_ps_sw3_left_rise = 0; } #endif g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_fall >= 1) { g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 left_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); left_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x1 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x2 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度减小 if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_left_rise >= 1) // { // if(PS_HORI_SW3_READ == PS_NO_COVER) // { // g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; // g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + // g_ptz.hori_as5047d.as5047d_remain_angle; // if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) // { // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; // } // g_ptz.hori_ps_sw3_left_rise = 0; // } // } if(g_ptz.hori_ps_sw3_right_fall >= 1) { ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_COVER) { 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_angle_state = 1; g_ptz.hori_ps_sw3_right_fall = 0; } g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_left_rise >= 1) { g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 right_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); right_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual <= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x1 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.hori_as5047d.as5047d_angle_actual >= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x2 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //计算当前角度 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.hori_as5047d.as5047d_ptz_init_angle - g_ptz.hori_as5047d.as5047d_angle_actual) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } //对磁编码器角度进行滤波 if((fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) < PTZ_HORI_AS5047D_ANGLE_WF_A) || (fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) > PTZ_HORI_AS5047D_ANGLE_WF_B)) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; //break; } else { // if(hori_as5047d_angle_save_lock == 0) // { // hori_as5047d_angle_save_lock = 1; // } } //防止角度范围超过限度 if(g_ptz.hori_as5047d.as5047d_state == 1) { if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_angle_max) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual < 0) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - 0); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual + g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle - tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_angle_max || g_ptz.hori_as5047d.as5047d_ptz_angle_actual == 0) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual; } else { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } } } //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (unsigned int)((g_ptz.hori_as5047d.as5047d_ptz_angle_actual * g_ptz.hori_as5047d.as5047d_ptz_angle_K) * 1000.0 + 0.5); //计算云台实际角度 tem4 = tem3 / 1000.0; g_ptz.hori_angle_actual_a = tem4; if(g_ptz.offset_angle.hori_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.hori_zero_offset_angle; if(tem4 < 0) { tem4 = tem4 + 360.0; } } g_ptz.hori_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.hori_as5047d.as5047d_angle_last = g_ptz.hori_as5047d.as5047d_angle_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_last = g_ptz.hori_as5047d.as5047d_ptz_angle_actual; g_ptz.hori_angle_last = g_ptz.hori_angle_actual; return 1; } static char ptz_hori_get_angle_a() { float right_diff_x1 = 0; float right_diff_x2 = 0; float hori_angle[PTZ_HORI_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0, m = 0; float tem = 0; float tem1 = 0; float tem2 = 0; float left_diff_x1 = 0; float left_diff_x2 = 0; float x1 = 0, x2 = 0, x3 = 0; unsigned int tem3 = 0; float tem4 = 0; static float hori_cycle_angle_right; static float hori_cycle_angle_left; char flag; int cycle_count_save = 0; g_ptz.hori_as5047d.time_end = g_ptz.hori_as5047d.time_now; g_ptz.hori_as5047d.time_now = OSTimeGet(); g_ptz.hori_as5047d.time = time_ticks(g_ptz.hori_as5047d.time_now, g_ptz.hori_as5047d.time_end); #ifdef CLK_50M if(g_ptz.hori_as5047d.time < 2) { g_ptz.hori_as5047d.time = 2; } #else if(g_ptz.hori_as5047d.time < 1) { g_ptz.hori_as5047d.time = 1; } #endif #ifdef PTZ_HORI_GET_ANGLE_MANY for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { hori_angle[i] = as5047d_hori_get_angle_a(); // test_angle[test_angle_count] = hori_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } if(hori_angle[i] < 0 || //防止读出的角度为负值 hori_angle[i] > 360.0||//防止读出的数值超过360 isnan(hori_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { if(fabs(hori_angle[i] - hori_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { if(hori_angle[i] < 5.0) { hori_angle[i] = hori_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_HORI_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_HORI_ANGLE_READ_NUM-j-1; k++) { if(hori_angle[k] > hori_angle[k+1]) { tem = hori_angle[k]; hori_angle[k] = hori_angle[k+1]; hori_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { tem = tem + hori_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_HORI_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_HORI_GET_ANGLE_SINGLE tem = as5047d_hori_get_angle_a(); // hori_as5047d_angle_save[hori_as5047d_angle_save_count] = tem; // hori_as5047d_angle_save_count ++; // if(hori_as5047d_angle_save_lock >= 1) // { // hori_as5047d_angle_save_lock ++; // } // if(hori_as5047d_angle_save_lock >= 10) // { // hori_as5047d_angle_save_lock = 0; // } // if(hori_as5047d_angle_save_count > 48) // { // hori_as5047d_angle_save_count = 0; // } // if(tem < 0 || //防止读出的角度为负值 // tem > 360.0||//防止读出的数值超过360 // isnan(tem) == 1)//防止读出的不是一个数 // {//以上错误的数据都该舍弃,从新读取 // return 0; // } // g_ptz.hori_as5047d.as5047d_angle_actual = tem; for(m = 0; m < 5; m++) { tem = as5047d_hori_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0 ||//防止读出的数值超过360 isnan(tem) == 1 ||//防止读出的不是一个数 ((fabs(tem - g_ptz.hori_as5047d.as5047d_angle_last) > PTZ_HORI_ANGLE_DIFF_A) && (fabs(tem - g_ptz.hori_as5047d.as5047d_angle_last) < PTZ_HORI_ANGLE_DIFF_B))) {//以上错误的数据都该舍弃,从新读取 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop"); } else { break; } } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.hori_as5047d.as5047d_data_reset == 1) { g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_cycle_num = 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_data_reset = 0; tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; } x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_angle_last); x2 = (g_ptz.hori_as5047d.as5047d_angle_actual - 0) + (360.0 - g_ptz.hori_as5047d.as5047d_angle_last); x3 = (g_ptz.hori_as5047d.as5047d_angle_last - 0) + (360.0 - g_ptz.hori_as5047d.as5047d_angle_actual); //首先判断磁编码器角度判断磁编码器转向 //磁编码器正转角度增大 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_angle_last && x1 < x3) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_angle_last && x2 < x1) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } //磁编码器反转角度减小 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_angle_last && x3 < x1) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_angle_last && x1 < x2) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(x1 == x2 || x1 == x3) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } } //反转,云台角度减小,磁编码角度增大 if(g_ptz.hori_as5047d.as5047d_dir == AS5047D_DIR_FWD) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_right_fall >= 1) // { // if(PS_HORI_SW3_READ == PS_COVER) // { // 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_ps_sw3_right_fall = 0; // } // } if(g_ptz.hori_ps_sw3_left_rise >= 1) { #ifdef PTZ_SW3_LEFT_RISE_UPDATE if(g_ptz.hori_angle_erro_switch == 0) {//误差消除开关关闭,使能左转上升沿角度更新,,打开则失能 ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_NO_COVER) { g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } g_ptz.hori_angle_state = 1; g_ptz.hori_ps_sw3_left_rise = 0; } } #endif g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_fall >= 1) { g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 left_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); left_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x1 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x2 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度减小 if(g_ptz.hori_as5047d.as5047d_dir == AS5047D_DIR_REV) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_left_rise >= 1) // { // if(PS_HORI_SW3_READ == PS_NO_COVER) // { // g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; // g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + // g_ptz.hori_as5047d.as5047d_remain_angle; // if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) // { // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; // } // g_ptz.hori_ps_sw3_left_rise = 0; // } // } if(g_ptz.hori_ps_sw3_right_fall >= 1) { ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_COVER) { 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_angle_state = 1; g_ptz.hori_ps_sw3_right_fall = 0; } g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_left_rise >= 1) { g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 right_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); right_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual <= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x1 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.hori_as5047d.as5047d_angle_actual >= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x2 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count_last = g_ptz.hori_as5047d.as5047d_cycle_count; g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //保存当前磁编码器圈数 cycle_count_save = g_ptz.hori_as5047d.as5047d_cycle_count; for(i = 0; i < 4; i++) {//这个循环的目的是为了防止磁编码器圈数计算错误,恢复正常的磁编码圈数 //计算当前角度 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.hori_as5047d.as5047d_ptz_init_angle - g_ptz.hori_as5047d.as5047d_angle_actual) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } //对磁编码器总角度进行滤波 if((fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) < PTZ_HORI_AS5047D_ANGLE_WF_A) || (fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) > PTZ_HORI_AS5047D_ANGLE_WF_B)) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; break; } else { //根据判断,恢复实际的磁编码器圈数 switch(i) { case 0: g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 break; case 1: g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 break; case 2: //磁编码器实际圈数恢复失败 g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save; break; case 3: g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; break; } } } //防止角度范围超过限度 if(g_ptz.hori_as5047d.as5047d_state == 1) { if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_angle_max) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = (int)(g_ptz.hori_as5047d.as5047d_ptz_angle_actual / 360.0); g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual < 0) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - 0); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual + g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = (int)(g_ptz.hori_as5047d.as5047d_ptz_angle_actual / 360.0); g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle - tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_angle_max || g_ptz.hori_as5047d.as5047d_ptz_angle_actual == 0) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual; } else { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual + g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } } } //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (unsigned int)((g_ptz.hori_as5047d.as5047d_ptz_angle_actual * g_ptz.hori_as5047d.as5047d_ptz_angle_K) * 1000.0 + 0.5); //计算云台实际角度 tem4 = tem3 / 1000.0; g_ptz.hori_angle_actual_a = tem4; if(g_ptz.offset_angle.hori_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.hori_zero_offset_angle; if(tem4 < 0) { tem4 = tem4 + 360.0; } } g_ptz.hori_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.hori_as5047d.as5047d_angle_last = g_ptz.hori_as5047d.as5047d_angle_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_last = g_ptz.hori_as5047d.as5047d_ptz_angle_actual; g_ptz.hori_angle_last = g_ptz.hori_angle_actual; return 1; } #endif /// 计算云台垂直角度 #ifdef PTZ_VERT_ANGLE_AS5047D_ANGLE_ASY static char ptz_vert_get_angle() { float up_diff_x1 = 0; float up_diff_x2 = 0; float vert_angle[PTZ_VERT_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0; float tem = 0; float tem1 = 0; static float vert_cycle_angle_up; static float vert_cycle_angle_down; long int tem3 = 0; float tem4 = 0; float down_diff_x1 = 0; float down_diff_x2 = 0; char flag; // static float vert_angle_actual; // static float vert_angle_last; #ifdef PTZ_VERT_GET_ANGLE_MANY for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { vert_angle[i] = as5047d_vert_get_angle_a(); // test_angle[test_angle_count] = vert_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } // if(vert_angle[i] < 0 || //防止读出的角度为负值 vert_angle[i] > 360.0||//防止读出的数值超过360 isnan(vert_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { if(fabs(vert_angle[i] - vert_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { if(vert_angle[i] < 5.0) { vert_angle[i] = vert_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_VERT_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_VERT_ANGLE_READ_NUM-j-1; k++) { if(vert_angle[k] > vert_angle[k+1]) { tem = vert_angle[k]; vert_angle[k] = vert_angle[k+1]; vert_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { tem = tem + vert_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_VERT_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_VERT_GET_ANGLE_SINGLE tem = as5047d_vert_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0||//防止读出的数值超过360 isnan(tem) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 return 0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.vert_as5047d.as5047d_data_reset == 1) { g_ptz.vert_as5047d.as5047d_cycle_count = 0; g_ptz.vert_as5047d.as5047d_cycle_num = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_data_reset = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0; tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; } //反转,云台角度减小,磁编码角度增大 if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { if(g_ptz.vert_ps_sw1_up_rise > 0) { g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { #ifdef PTZ_SW1_DOWN_FALL_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_down_fall = 0; } #endif g_ptz.vert_ps_sw1_down_fall = 0; } // if(g_ptz.vert_ps_sw2_down_rise > 0) // { // g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; // g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_angle_actual + g_ptz.vert_as5047d.as5047d_remain_angle; // if(g_ptz.vert_as5047d.as5047d_ptz_init_angle >= 360.0) // { // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_ptz_init_angle - 360.0; // } // g_ptz.vert_ps_sw2_down_rise = 0; // } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 down_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); down_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x1 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x2 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度减小 if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { // if(g_ptz.vert_ps_sw1_up_rise > 0) // { // 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_ps_sw1_up_rise = 0; // } if(g_ptz.vert_ps_sw1_up_rise > 0) { #ifdef PTZ_SW1_UP_RISE_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_NO_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_up_rise = 0; } #endif g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { g_ptz.vert_ps_sw1_down_fall = 0; } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { ptz_vert_ps_delay_ms(); if(PS_VERT_SW2_READ == PS_COVER) { g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual + g_ptz.vert_as5047d.as5047d_remain_angle; if(g_ptz.vert_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_ptz_init_angle - 360.0; } g_ptz.vert_angle_state = 1; g_ptz.vert_ps_sw2_up_fall = 0; } g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 up_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); up_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual <= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x1 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.vert_as5047d.as5047d_angle_actual >= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x2 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //计算当前角度 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.vert_as5047d.as5047d_ptz_init_angle - g_ptz.vert_as5047d.as5047d_angle_actual) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual == g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } //对算出的磁编码器总角度进行滤波处理 if(fabs(g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last) < PTZ_VERT_AS5047D_ANGLE_WF_A) { g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; } if(g_ptz.vert_as5047d.as5047d_state == 1) { //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (long int)((g_ptz.vert_as5047d.as5047d_ptz_angle_K * (g_ptz.vert_as5047d.as5047d_ptz_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_max / 2.0)) * 1000.0 + 0.5); tem4 = tem3 / 1000.0; g_ptz.vert_angle_actual_a = tem4; if(g_ptz.offset_angle.vert_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.vert_zero_offset_angle; } g_ptz.vert_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.vert_as5047d.as5047d_angle_last = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_last = g_ptz.vert_as5047d.as5047d_ptz_angle_actual; g_ptz.vert_angle_last = g_ptz.vert_angle_actual; return 1; } static char ptz_vert_get_angle_a() { float up_diff_x1 = 0; float up_diff_x2 = 0; float x1 = 0, x2 = 0, x3 = 0; float vert_angle[PTZ_VERT_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0, m = 0; float tem = 0; float tem1 = 0; static float vert_cycle_angle_up; static float vert_cycle_angle_down; long int tem3 = 0; float down_diff_x1 = 0; float down_diff_x2 = 0; float tem4 = 0; char flag; int cycle_count_save = 0; // static float vert_angle_actual; // static float vert_angle_last; g_ptz.vert_as5047d.time_end = g_ptz.vert_as5047d.time_now; g_ptz.vert_as5047d.time_now = OSTimeGet(); g_ptz.vert_as5047d.time = time_ticks(g_ptz.vert_as5047d.time_now, g_ptz.vert_as5047d.time_end); #ifdef CLK_50M if(g_ptz.vert_as5047d.time < 2) { g_ptz.vert_as5047d.time = 2; } #else if(g_ptz.vert_as5047d.time < 1) { g_ptz.vert_as5047d.time = 1; } #endif #ifdef PTZ_VERT_GET_ANGLE_MANY for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { vert_angle[i] = as5047d_vert_get_angle_a(); // test_angle[test_angle_count] = vert_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } // if(vert_angle[i] < 0 || //防止读出的角度为负值 vert_angle[i] > 360.0||//防止读出的数值超过360 isnan(vert_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { if(fabs(vert_angle[i] - vert_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { if(vert_angle[i] < 5.0) { vert_angle[i] = vert_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_VERT_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_VERT_ANGLE_READ_NUM-j-1; k++) { if(vert_angle[k] > vert_angle[k+1]) { tem = vert_angle[k]; vert_angle[k] = vert_angle[k+1]; vert_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { tem = tem + vert_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_VERT_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_VERT_GET_ANGLE_SINGLE // tem = as5047d_vert_get_angle_a(); // // if(tem < 0 || //防止读出的角度为负值 // tem > 360.0||//防止读出的数值超过360 // isnan(tem) == 1)//防止读出的不是一个数 // {//以上错误的数据都该舍弃,从新读取 // return 0; // } // g_ptz.vert_as5047d.as5047d_angle_actual = tem; for(m = 0; m < 5; m++) { tem = as5047d_vert_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0 ||//防止读出的数值超过360 isnan(tem) == 1 || ((fabs(tem - g_ptz.vert_as5047d.as5047d_angle_last) > PTZ_VERT_ANGLE_DIFF_A) && (fabs(tem - g_ptz.vert_as5047d.as5047d_angle_last) < PTZ_VERT_ANGLE_DIFF_B)))//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop"); } else { break; } } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.vert_as5047d.as5047d_data_reset == 1) { g_ptz.vert_as5047d.as5047d_cycle_count = 0; g_ptz.vert_as5047d.as5047d_cycle_num = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_data_reset = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0; tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; } x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_angle_last); x2 = (g_ptz.vert_as5047d.as5047d_angle_actual - 0) + (360.0 - g_ptz.vert_as5047d.as5047d_angle_last); x3 = (g_ptz.vert_as5047d.as5047d_angle_last - 0) + (360.0 - g_ptz.vert_as5047d.as5047d_angle_actual); //首先判断磁编码器角度判断磁编码器转向 //磁编码器正转角度增大 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_angle_last && x1 < x3) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_angle_last && x2 < x1) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } //磁编码器反转角度减小 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_angle_last && x3 < x1) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_angle_last && x1 < x2) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(x1 == x2 || x1 == x3) { if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } } //反转,云台角度减小,磁编码角度增大 if(g_ptz.vert_as5047d.as5047d_dir == AS5047D_DIR_FWD) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { if(g_ptz.vert_ps_sw1_up_rise > 0) { g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { #ifdef PTZ_SW1_DOWN_FALL_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_down_fall = 0; } #endif g_ptz.vert_ps_sw1_down_fall = 0; } // if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 down_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); down_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x1 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x2 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度减小 if(g_ptz.vert_as5047d.as5047d_dir == AS5047D_DIR_REV) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { // if(g_ptz.vert_ps_sw1_up_rise > 0) // { // 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_ps_sw1_up_rise = 0; // } if(g_ptz.vert_ps_sw1_up_rise > 0) { #ifdef PTZ_SW1_UP_RISE_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_NO_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_up_rise = 0; } #endif g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { g_ptz.vert_ps_sw1_down_fall = 0; } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { ptz_vert_ps_delay_ms(); if(PS_VERT_SW2_READ == PS_COVER) { g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual + g_ptz.vert_as5047d.as5047d_remain_angle; if(g_ptz.vert_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_ptz_init_angle - 360.0; } g_ptz.vert_angle_state = 1; g_ptz.vert_ps_sw2_up_fall = 0; } g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 up_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); up_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual <= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x1 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.vert_as5047d.as5047d_angle_actual >= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x2 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //保存当前磁编码器圈数 cycle_count_save = g_ptz.vert_as5047d.as5047d_cycle_count; for(i = 0; i < 4; i++) {//这个循环的目的是为了防止磁编码器圈数计算错误,恢复正常的磁编码圈数 //计算当前角度 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.vert_as5047d.as5047d_ptz_init_angle - g_ptz.vert_as5047d.as5047d_angle_actual) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual == g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } //对算出的磁编码器总角度进行滤波处理 if(fabs(g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last) < PTZ_VERT_AS5047D_ANGLE_WF_A) { g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; break; } else { //根据判断,恢复实际的磁编码器圈数 switch(i) { case 0: g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 break; case 1: g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 break; case 2: //磁编码器实际圈数恢复失败 g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; break; case 3: g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; break; } } } if(g_ptz.vert_as5047d.as5047d_state == 1) { //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (long int)((g_ptz.vert_as5047d.as5047d_ptz_angle_K * (g_ptz.vert_as5047d.as5047d_ptz_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_max / 2.0)) * 1000.0 + 0.5); tem4 = tem3 / 1000.0; g_ptz.vert_angle_actual_a = tem4; if(g_ptz.offset_angle.vert_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.vert_zero_offset_angle; } g_ptz.vert_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.vert_as5047d.as5047d_angle_last = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_last = g_ptz.vert_as5047d.as5047d_ptz_angle_actual; g_ptz.vert_angle_last = g_ptz.vert_angle_actual; return 1; } #endif /// 计算云台水平角度 #ifdef PTZ_HORI_ANGLE_AS5047D_ANGLE_SYN static char ptz_hori_get_angle() { float right_diff_x1 = 0; float right_diff_x2 = 0; float hori_angle[PTZ_HORI_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0; float tem = 0; float tem1 = 0; float tem2 = 0; float left_diff_x1 = 0; float left_diff_x2 = 0; unsigned int tem3 = 0; float tem4 = 0; static float hori_cycle_angle_right; static float hori_cycle_angle_left; char flag; #ifdef PTZ_HORI_GET_ANGLE_MANY for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { hori_angle[i] = as5047d_hori_get_angle_a(); if(hori_angle[i] < 0 || //防止读出的角度为负值 hori_angle[i] > 360.0||//防止读出的数值超过360 isnan(hori_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { if(fabs(hori_angle[i] - hori_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { if(hori_angle[i] < 5.0) { hori_angle[i] = hori_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_HORI_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_HORI_ANGLE_READ_NUM-j-1; k++) { if(hori_angle[k] > hori_angle[k+1]) { tem = hori_angle[k]; hori_angle[k] = hori_angle[k+1]; hori_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { tem = tem + hori_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_HORI_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_HORI_GET_ANGLE_SINGLE tem = as5047d_hori_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0||//防止读出的数值超过360 isnan(tem) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 return 0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.hori_as5047d.as5047d_data_reset == 1) { g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_cycle_num = 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_data_reset = 0; tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; } //反转,云台角度减小,磁编码角度减小 if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_right_fall >= 1) // { // if(PS_HORI_SW3_READ == PS_COVER) // { // 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_ps_sw3_right_fall = 0; // } // } if(g_ptz.hori_ps_sw3_left_rise >= 1) { #ifdef PTZ_SW3_LEFT_RISE_UPDATE ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_NO_COVER) { g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } g_ptz.hori_angle_state = 1; g_ptz.hori_ps_sw3_left_rise = 0; } #endif g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_fall >= 1) { g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 left_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); left_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x1 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x2 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度增大 if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_left_rise >= 1) // { // if(PS_HORI_SW3_READ == PS_NO_COVER) // { // g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; // g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; // if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) // { // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; // } // g_ptz.hori_ps_sw3_left_rise = 0; // } // } if(g_ptz.hori_ps_sw3_right_fall >= 1) { ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_COVER) { 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_ps_sw3_right_fall = 0; g_ptz.hori_angle_state = 1; } g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_left_rise >= 1) { g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 right_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); right_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual >= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x1 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.hori_as5047d.as5047d_angle_actual <= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x2 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //计算当前角度 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } //对磁编码器角度进行滤波 if((fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) < PTZ_HORI_AS5047D_ANGLE_WF_A) || (fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) > PTZ_HORI_AS5047D_ANGLE_WF_B)) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; } //防止角度范围超过限度 if(g_ptz.hori_as5047d.as5047d_state == 1) { if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_angle_max) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual < 0) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - 0); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual + g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle + tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_angle_max || g_ptz.hori_as5047d.as5047d_ptz_angle_actual == 0) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual; } else { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } } //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (unsigned int)((g_ptz.hori_as5047d.as5047d_ptz_angle_actual * g_ptz.hori_as5047d.as5047d_ptz_angle_K) * 1000.0 + 0.5); //计算云台角度 tem4 = tem3 / 1000.0; g_ptz.hori_angle_actual_a = tem4; if(g_ptz.offset_angle.hori_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.hori_zero_offset_angle; if(tem4 < 0) { tem4 = tem4 + 360.0; } } g_ptz.hori_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.hori_as5047d.as5047d_angle_last = g_ptz.hori_as5047d.as5047d_angle_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_last = g_ptz.hori_as5047d.as5047d_ptz_angle_actual; g_ptz.hori_angle_last = g_ptz.hori_angle_actual; return 1; } static char ptz_hori_get_angle_a() { float right_diff_x1 = 0; float right_diff_x2 = 0; float x1 = 0, x2 = 0, x3 = 0; float hori_angle[PTZ_HORI_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0, m = 0; float tem = 0; float tem1 = 0; float tem2 = 0; float left_diff_x1 = 0; float left_diff_x2 = 0; unsigned int tem3 = 0; float tem4 = 0; static float hori_cycle_angle_right; static float hori_cycle_angle_left; char flag; int cycle_count_save = 0; g_ptz.hori_as5047d.time_end = g_ptz.hori_as5047d.time_now; g_ptz.hori_as5047d.time_now = OSTimeGet(); g_ptz.hori_as5047d.time = time_ticks(g_ptz.hori_as5047d.time_now, g_ptz.hori_as5047d.time_end); #ifdef CLK_50M if(g_ptz.hori_as5047d.time < 2) { g_ptz.hori_as5047d.time = 2; } #else if(g_ptz.hori_as5047d.time < 1) { g_ptz.hori_as5047d.time = 1; } #endif #ifdef PTZ_HORI_GET_ANGLE_MANY for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { hori_angle[i] = as5047d_hori_get_angle_a(); if(hori_angle[i] < 0 || //防止读出的角度为负值 hori_angle[i] > 360.0||//防止读出的数值超过360 isnan(hori_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { if(fabs(hori_angle[i] - hori_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_HORI_ANGLE_READ_NUM; i++) { if(hori_angle[i] < 5.0) { hori_angle[i] = hori_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_HORI_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_HORI_ANGLE_READ_NUM-j-1; k++) { if(hori_angle[k] > hori_angle[k+1]) { tem = hori_angle[k]; hori_angle[k] = hori_angle[k+1]; hori_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_HORI_ANGLE_READ_NUM - 1; i++) { tem = tem + hori_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_HORI_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.hori_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_HORI_GET_ANGLE_SINGLE for(m = 0; m < 5; m++) { tem = as5047d_hori_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0 ||//防止读出的数值超过360 isnan(tem) == 1 ||//防止读出的不是一个数 ((fabs(tem - g_ptz.hori_as5047d.as5047d_angle_last) > PTZ_HORI_ANGLE_DIFF_A) && (fabs(tem - g_ptz.hori_as5047d.as5047d_angle_last) < PTZ_HORI_ANGLE_DIFF_B))) {//以上错误的数据都该舍弃,从新读取 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop"); } else { break; } } g_ptz.hori_as5047d.as5047d_angle_actual = tem; // tem = as5047d_hori_get_angle_a(); // // if(tem < 0 || //防止读出的角度为负值 // tem > 360.0||//防止读出的数值超过360 // isnan(tem) == 1)//防止读出的不是一个数 // {//以上错误的数据都该舍弃,从新读取 // return 0; // } // g_ptz.hori_as5047d.as5047d_angle_actual = tem; // #endif if(g_ptz.hori_as5047d.as5047d_data_reset == 1) { g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_cycle_num = 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_data_reset = 0; tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; } x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_angle_last); x2 = (g_ptz.hori_as5047d.as5047d_angle_actual - 0) + (360.0 - g_ptz.hori_as5047d.as5047d_angle_last); x3 = (g_ptz.hori_as5047d.as5047d_angle_last - 0) + (360.0 - g_ptz.hori_as5047d.as5047d_angle_actual); //首先判断磁编码器角度判断磁编码器转向 //磁编码器正转角度增大 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_angle_last && x1 < x3) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_angle_last && x2 < x1) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } //磁编码器反转角度减小 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_angle_last && x3 < x1) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_angle_last && x1 < x2) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(x1 == x2 || x1 == x3) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_dir = AS5047D_DIR_FWD; } } //反转,云台角度减小,磁编码角度减小 if(g_ptz.hori_as5047d.as5047d_dir == AS5047D_DIR_REV) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_right_fall >= 1) // { // if(PS_HORI_SW3_READ == PS_COVER) // { // 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_ps_sw3_right_fall = 0; // } // } if(g_ptz.hori_ps_sw3_left_rise >= 1) { #ifdef PTZ_SW3_LEFT_RISE_UPDATE if(g_ptz.hori_angle_erro_switch == 0) {//误差消除开关关闭,使能左转上升沿角度更新,,打开则失能 ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_NO_COVER) { g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } g_ptz.hori_angle_state = 1; g_ptz.hori_ps_sw3_left_rise = 0; ptz_printf("\n hori_ps_sw3_left_rise angle max update!! \r\n",strlen((const char *)"\n hori_ps_sw3_left_rise angle max update!! \r\n")); } } #endif g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_fall >= 1) { g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 left_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); left_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_angle_actual) + fabs(g_ptz.hori_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x1 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle && left_diff_x2 <= PTZ_LEFT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual < hori_cycle_angle_left) { g_ptz.hori_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度增大 if(g_ptz.hori_as5047d.as5047d_dir == AS5047D_DIR_FWD) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.hori_as5047d.as5047d_state == 1) { // if(g_ptz.hori_ps_sw3_left_rise >= 1) // { // if(PS_HORI_SW3_READ == PS_NO_COVER) // { // g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; // g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_max; // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; // if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) // { // g_ptz.hori_as5047d.as5047d_ptz_init_angle = // g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; // } // g_ptz.hori_ps_sw3_left_rise = 0; // } // } if(g_ptz.hori_ps_sw3_right_fall >= 1) { ptz_hori_ps_delay_ms(); if(PS_HORI_SW3_READ == PS_COVER) { 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_ps_sw3_right_fall = 0; g_ptz.hori_angle_state = 1; ptz_printf("\n hori_ps_sw3_right_fall angle min update!! \r\n",strlen((const char *)"\n hori_ps_sw3_right_fall angle min update!! \r\n")); } g_ptz.hori_ps_sw3_right_fall = 0; } if(g_ptz.hori_ps_sw3_left_rise >= 1) { g_ptz.hori_ps_sw3_left_rise = 0; } if(g_ptz.hori_ps_sw3_right_rise >= 1) { g_ptz.hori_ps_sw3_right_rise = 0; } if(g_ptz.hori_ps_sw3_left_fall >= 1) { g_ptz.hori_ps_sw3_left_fall = 0; } } #endif tem1 = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; hori_cycle_angle_right = tem1 + 350.0; hori_cycle_angle_left = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 right_diff_x1 = fabs(g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle); right_diff_x2 = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0); if(g_ptz.hori_as5047d.as5047d_angle_actual >= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x1 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.hori_as5047d.as5047d_angle_actual <= g_ptz.hori_as5047d.as5047d_ptz_init_angle && right_diff_x2 <= PTZ_RIGHT_CYCLE_C && g_ptz.hori_as5047d.as5047d_ptz_angle_actual > hori_cycle_angle_right) { g_ptz.hori_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //保存当前磁编码器圈数 cycle_count_save = g_ptz.hori_as5047d.as5047d_cycle_count; for(i = 0; i < 4; i++) {//这个循环的目的是为了防止磁编码器圈数计算错误,恢复正常的磁编码圈数 //计算当前角度 if(g_ptz.hori_as5047d.as5047d_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual < g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.hori_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.hori_as5047d.as5047d_angle_actual - 0) + g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.hori_as5047d.as5047d_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_init_angle) { g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.hori_as5047d.as5047d_cycle_count * 360.0; } //对磁编码器角度进行滤波 if((fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) < PTZ_HORI_AS5047D_ANGLE_WF_A) || (fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last) > PTZ_HORI_AS5047D_ANGLE_WF_B)) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; break; } else { //根据判断,恢复实际的磁编码器圈数 switch(i) { case 0: g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save - 1;//转动圈数减少1 g_ptz.hori_jia ++; break; case 1: g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save + 1;//转动圈数增加1 g_ptz.hori_jian ++; break; case 2: //磁编码器实际圈数恢复失败 g_ptz.hori_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.hori_cuowu ++; break; case 3: g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_wf_last = g_ptz.hori_as5047d.as5047d_ptz_angle_wf_actual; break; } } } //防止角度范围超过限度 if(g_ptz.hori_as5047d.as5047d_state == 1) { if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual > g_ptz.hori_as5047d.as5047d_ptz_angle_max) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual - g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = (int)(g_ptz.hori_as5047d.as5047d_ptz_angle_actual / 360.0); g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual < 0) { tem2 = fabs(g_ptz.hori_as5047d.as5047d_ptz_angle_actual - 0); g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_actual + g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = (int)(g_ptz.hori_as5047d.as5047d_ptz_angle_actual / 360.0); g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle + tem2; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle >= 360.0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle - 360.0; } if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } if(g_ptz.hori_as5047d.as5047d_ptz_angle_actual == g_ptz.hori_as5047d.as5047d_ptz_angle_max || g_ptz.hori_as5047d.as5047d_ptz_angle_actual == 0) { if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT) { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.hori_as5047d.as5047d_cycle_count = 0; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual; } else//左 { g_ptz.hori_as5047d.as5047d_ptz_angle_actual = g_ptz.hori_as5047d.as5047d_ptz_angle_max; g_ptz.hori_as5047d.as5047d_cycle_count = g_ptz.hori_as5047d.as5047d_cycle_num; g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_angle_actual - g_ptz.hori_as5047d.as5047d_remain_angle; if(g_ptz.hori_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.hori_as5047d.as5047d_ptz_init_angle = g_ptz.hori_as5047d.as5047d_ptz_init_angle + 360.0; } } } //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (unsigned int)((g_ptz.hori_as5047d.as5047d_ptz_angle_actual * g_ptz.hori_as5047d.as5047d_ptz_angle_K) * 1000.0 + 0.5); //计算云台角度 tem4 = tem3 / 1000.0; //误差消除开关打开 if(g_ptz.hori_angle_erro_switch == 1) { tem4 = tem4 + (g_ptz.offset_angle.offset_anle / 50.0);//消除误差,,,,使用误差消除时需要关闭光电开关左转上升沿角度更新 } g_ptz.hori_angle_actual_a = tem4; if(g_ptz.offset_angle.hori_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.hori_zero_offset_angle; // if(tem4 < 0) // { // tem4 = tem4 + 360.0; // } } if(tem4 == 360.0)///////解决既显示360又显示角度0的问题 { tem4 = 0; } if(tem4 < 0) { tem4 = tem4 + 360.0; } if(tem4>360.0) { tem4 = tem4 - 360.0; } g_ptz.hori_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.hori_as5047d.as5047d_angle_last = g_ptz.hori_as5047d.as5047d_angle_actual; g_ptz.hori_as5047d.as5047d_ptz_angle_last = g_ptz.hori_as5047d.as5047d_ptz_angle_actual; g_ptz.hori_angle_last = g_ptz.hori_angle_actual; // step_speed_for_hori = g_ptz.hori_as5047d.as5047d_ptz_angle_last;//用于步进电机速度计算 return 1; } #endif /// 计算云台垂直角度 #ifdef PTZ_VERT_ANGLE_AS5047D_ANGLE_SYN static char ptz_vert_get_angle() { float up_diff_x1 = 0; float up_diff_x2 = 0; float vert_angle[PTZ_VERT_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0; float tem = 0; float tem1 = 0; static float vert_cycle_angle_up; static float vert_cycle_angle_down; long int tem3 = 0; float down_diff_x1 = 0; float down_diff_x2 = 0; float tem4 = 0; char flag; // static float vert_angle_actual; // static float vert_angle_last; #ifdef PTZ_VERT_GET_ANGLE_MANY for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { vert_angle[i] = as5047d_vert_get_angle_a(); // test_angle[test_angle_count] = vert_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } if(vert_angle[i] < 0 || //防止读出的角度为负值 vert_angle[i] > 360.0||//防止读出的数值超过360 isnan(vert_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { if(fabs(vert_angle[i] - vert_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { if(vert_angle[i] < 5.0) { vert_angle[i] = vert_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_VERT_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_VERT_ANGLE_READ_NUM-j-1; k++) { if(vert_angle[k] > vert_angle[k+1]) { tem = vert_angle[k]; vert_angle[k] = vert_angle[k+1]; vert_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { tem = tem + vert_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_VERT_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_VERT_GET_ANGLE_SINGLE tem = as5047d_vert_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0||//防止读出的数值超过360 isnan(tem) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 return 0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.vert_as5047d.as5047d_data_reset == 1) { g_ptz.vert_as5047d.as5047d_cycle_count = 0; g_ptz.vert_as5047d.as5047d_cycle_num = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_data_reset = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0; tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; } //反转,云台角度减小,磁编码角度减小 if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { if(g_ptz.vert_ps_sw1_up_rise > 0) { g_ptz.vert_ps_sw1_up_rise = 0; } if(g_ptz.vert_ps_sw1_down_fall > 0) { #ifdef PTZ_SW1_DOWN_FALL_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_down_fall = 0; } #endif g_ptz.vert_ps_sw1_down_fall = 0; } // if(g_ptz.vert_ps_sw2_down_rise > 0) // { // g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; // g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_remain_angle; // if(g_ptz.vert_as5047d.as5047d_ptz_init_angle < 0) // { // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_ptz_init_angle + 360.0; // } // g_ptz.vert_ps_sw2_down_rise = 0; // } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 down_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); down_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x1 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x2 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度增大 if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { // if(g_ptz.vert_ps_sw1_up_rise > 0) // { // 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_ps_sw1_up_rise = 0; // } if(g_ptz.vert_ps_sw1_up_rise > 0) { #ifdef PTZ_SW1_UP_RISE_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_NO_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_up_rise = 0; } #endif g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { g_ptz.vert_ps_sw1_down_fall = 0; } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { ptz_vert_ps_delay_ms(); if(PS_VERT_SW2_READ == PS_COVER) { g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_remain_angle; if(g_ptz.vert_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_ptz_init_angle + 360.0; } g_ptz.vert_angle_state = 1; g_ptz.vert_ps_sw2_up_fall = 0; } g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 up_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); up_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual >= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x1 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.vert_as5047d.as5047d_angle_actual <= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x2 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //计算当前角度 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual == g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } /**/ //对算出的磁编码器总角度进行滤波处理 if(fabs(g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last) < PTZ_VERT_AS5047D_ANGLE_WF_A) { g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; } if(g_ptz.vert_as5047d.as5047d_state == 1) { //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (long int)((g_ptz.vert_as5047d.as5047d_ptz_angle_K * (g_ptz.vert_as5047d.as5047d_ptz_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_max / 2.0)) * 1000.0 + 0.5); tem4 = tem3 / 1000.0; g_ptz.vert_angle_actual_a = tem4; if(g_ptz.offset_angle.vert_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.vert_zero_offset_angle; } g_ptz.vert_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.vert_as5047d.as5047d_angle_last = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_last = g_ptz.vert_as5047d.as5047d_ptz_angle_actual; g_ptz.vert_angle_last = g_ptz.vert_angle_actual; return 1; } static char ptz_vert_get_angle_a() { float up_diff_x1 = 0; float up_diff_x2 = 0; float x1 = 0, x2 = 0, x3 = 0; float vert_angle[PTZ_VERT_ANGLE_READ_NUM] = {0}; char i = 0, j = 0, k = 0, m = 0; float tem = 0; float tem1 = 0; static float vert_cycle_angle_up; static float vert_cycle_angle_down; long int tem3 = 0; float down_diff_x1 = 0; float down_diff_x2 = 0; float tem4 = 0; char flag; int cycle_count_save = 0; // static float vert_angle_actual; // static float vert_angle_last; g_ptz.vert_as5047d.time_end = g_ptz.vert_as5047d.time_now; g_ptz.vert_as5047d.time_now = OSTimeGet(); g_ptz.vert_as5047d.time = time_ticks(g_ptz.vert_as5047d.time_now, g_ptz.vert_as5047d.time_end); #ifdef CLK_50M if(g_ptz.vert_as5047d.time < 2) { g_ptz.vert_as5047d.time = 2; } #else if(g_ptz.vert_as5047d.time < 1) { g_ptz.vert_as5047d.time = 1; } #endif #ifdef PTZ_VERT_GET_ANGLE_MANY for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { vert_angle[i] = as5047d_vert_get_angle_a(); // test_angle[test_angle_count] = vert_angle[i]; // test_angle_count ++; // if(test_angle_count >= 500) // { // test_angle_count = 0; // } if(vert_angle[i] < 0 || //防止读出的角度为负值 vert_angle[i] > 360.0||//防止读出的数值超过360 isnan(vert_angle[i]) == 1)//防止读出的不是一个数 {//以上错误的数据都该舍弃 i --; } } //由于磁编码器存在0位,防止采集到的数据差距接近360度,对采集到的数据进行优化处理 //例如0.2、0.1、359.9、359.8这种数据就需要处理 flag = 0; for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { if(fabs(vert_angle[i] - vert_angle[i+1]) > 350.0) { flag = 1;//说明磁编码器处于0位附近,需要进行数据优化处理 break; } } if(flag == 1) { for(i = 0; i < PTZ_VERT_ANGLE_READ_NUM; i++) { if(vert_angle[i] < 5.0) { vert_angle[i] = vert_angle[i] + 360.0; } } } //对采集到的角度值排序 for(j = 0; j < PTZ_VERT_ANGLE_READ_NUM-1; j++)//采样值由小到大排列 { for(k = 0; k < PTZ_VERT_ANGLE_READ_NUM-j-1; k++) { if(vert_angle[k] > vert_angle[k+1]) { tem = vert_angle[k]; vert_angle[k] = vert_angle[k+1]; vert_angle[k+1] = tem; } } } tem = 0; for(uint8_t i = 1; i < PTZ_VERT_ANGLE_READ_NUM - 1; i++) { tem = tem + vert_angle[i];//去掉一个最大值和一个最小值 } tem = tem / ((float)(PTZ_VERT_ANGLE_READ_NUM - 2)); if(tem > 360.0) { tem = tem - 360.0; } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif #ifdef PTZ_VERT_GET_ANGLE_SINGLE // tem = as5047d_vert_get_angle_a(); // // if(tem < 0 || //防止读出的角度为负值 // tem > 360.0||//防止读出的数值超过360 // isnan(tem) == 1)//防止读出的不是一个数 // {//以上错误的数据都该舍弃,从新读取 // return 0; // } // g_ptz.vert_as5047d.as5047d_angle_actual = tem; for(m = 0; m < 5; m++) { tem = as5047d_vert_get_angle_a(); if(tem < 0 || //防止读出的角度为负值 tem > 360.0 ||//防止读出的数值超过360 isnan(tem) == 1 || ((fabs(tem - g_ptz.vert_as5047d.as5047d_angle_last) > PTZ_VERT_ANGLE_DIFF_A) && (fabs(tem - g_ptz.vert_as5047d.as5047d_angle_last) < PTZ_VERT_ANGLE_DIFF_B)))//防止读出的不是一个数 {//以上错误的数据都该舍弃,从新读取 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop"); } else { break; } } g_ptz.vert_as5047d.as5047d_angle_actual = tem; #endif if(g_ptz.vert_as5047d.as5047d_data_reset == 1) { g_ptz.vert_as5047d.as5047d_cycle_count = 0; g_ptz.vert_as5047d.as5047d_cycle_num = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = 0; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_data_reset = 0; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = 0; tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; } x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_angle_last); x2 = (g_ptz.vert_as5047d.as5047d_angle_actual - 0) + (360.0 - g_ptz.vert_as5047d.as5047d_angle_last); x3 = (g_ptz.vert_as5047d.as5047d_angle_last - 0) + (360.0 - g_ptz.vert_as5047d.as5047d_angle_actual); //首先判断磁编码器角度判断磁编码器转向 //磁编码器正转角度增大 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_angle_last && x1 < x3) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_angle_last && x2 < x1) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } //磁编码器反转角度减小 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_angle_last && x3 < x1) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_angle_last && x1 < x2) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(x1 == x2 || x1 == x3) { if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_REV; } if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP) { g_ptz.vert_as5047d.as5047d_dir = AS5047D_DIR_FWD; } } //反转,云台角度减小,磁编码角度减小 if(g_ptz.vert_as5047d.as5047d_dir == AS5047D_DIR_REV) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { if(g_ptz.vert_ps_sw1_up_rise > 0) { g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { #ifdef PTZ_SW1_DOWN_FALL_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_down_fall = 0; ptz_printf("\n vert_ps_sw1_down_fall angle min update!! \r\n",strlen((const char *)"\n vert_ps_sw1_down_fall angle min update!! \r\n")); } #endif g_ptz.vert_ps_sw1_down_fall = 0; } // if(g_ptz.vert_ps_sw2_down_rise > 0) // { // g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; // g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_remain_angle; // if(g_ptz.vert_as5047d.as5047d_ptz_init_angle < 0) // { // g_ptz.vert_as5047d.as5047d_ptz_init_angle = // g_ptz.vert_as5047d.as5047d_ptz_init_angle + 360.0; // } // g_ptz.vert_ps_sw2_down_rise = 0; // } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 down_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); down_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_angle_actual) + fabs(g_ptz.vert_as5047d.as5047d_ptz_init_angle - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x1 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle && down_diff_x2 <= PTZ_DOWN_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual < vert_cycle_angle_down) { g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 } } //正转,云台角度增大,磁编码角度增大 if(g_ptz.vert_as5047d.as5047d_dir == AS5047D_DIR_FWD) { #ifdef PTZ_PHOTOELECTRIC_SWITCH //挡片更新角度 if(g_ptz.vert_as5047d.as5047d_state == 1) { if(g_ptz.vert_ps_sw1_up_rise > 0) { #ifdef PTZ_SW1_UP_RISE_UPDATE ptz_vert_ps_delay_ms(); if(PS_VERT_SW1_READ == PS_NO_COVER) { 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_angle_state = 1; g_ptz.vert_ps_sw1_up_rise = 0; ptz_printf("\n vert_ps_sw1_up_rise angle min update!! \r\n",strlen((const char *)"\n vert_ps_sw1_up_rise angle min update!! \r\n")); } #endif g_ptz.vert_ps_sw1_up_rise = 0; } if( g_ptz.vert_ps_sw1_down_fall > 0) { g_ptz.vert_ps_sw1_down_fall = 0; } if(g_ptz.vert_ps_sw2_down_rise > 0) { g_ptz.vert_ps_sw2_down_rise = 0; } if(g_ptz.vert_ps_sw2_up_fall > 0) { ptz_vert_ps_delay_ms(); if(PS_VERT_SW2_READ == PS_COVER) { g_ptz.vert_as5047d.as5047d_cycle_count = g_ptz.vert_as5047d.as5047d_cycle_num; g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_max; g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_remain_angle; if(g_ptz.vert_as5047d.as5047d_ptz_init_angle < 0) { g_ptz.vert_as5047d.as5047d_ptz_init_angle = g_ptz.vert_as5047d.as5047d_ptz_init_angle + 360.0; } g_ptz.vert_angle_state = 1; g_ptz.vert_ps_sw2_up_fall = 0; ptz_printf("\n vert_ps_sw2_up_fall angle max update!! \r\n",strlen((const char *)"\n vert_ps_sw2_up_fall angle max update!! \r\n")); } g_ptz.vert_ps_sw2_up_fall = 0; } } #endif tem1 = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; vert_cycle_angle_up = tem1 + 350.0; vert_cycle_angle_down = tem1 + 10.0; //根据计算方法b,计算云台当前角度 //判断磁编码器是否转完一圈 //首先计算当前角度度和初始角度之间的角度距离 up_diff_x1 = fabs(g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle); up_diff_x2 = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0); if(g_ptz.vert_as5047d.as5047d_angle_actual >= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x1 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } if(g_ptz.vert_as5047d.as5047d_angle_actual <= g_ptz.vert_as5047d.as5047d_ptz_init_angle && up_diff_x2 <= PTZ_UP_CYCLE_C && g_ptz.vert_as5047d.as5047d_ptz_angle_actual > vert_cycle_angle_up) { g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 } } //保存当前磁编码器圈数 cycle_count_save = g_ptz.vert_as5047d.as5047d_cycle_count; for(i = 0; i < 4; i++) {//这个循环的目的是为了防止磁编码器圈数计算错误,恢复正常的磁编码圈数 //计算当前角度 if(g_ptz.vert_as5047d.as5047d_angle_actual > g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = (g_ptz.vert_as5047d.as5047d_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual < g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = fabs(360.0 - g_ptz.vert_as5047d.as5047d_ptz_init_angle) + fabs(g_ptz.vert_as5047d.as5047d_angle_actual - 0) + g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } if(g_ptz.vert_as5047d.as5047d_angle_actual == g_ptz.vert_as5047d.as5047d_ptz_init_angle) { g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual = g_ptz.vert_as5047d.as5047d_cycle_count * 360.0; } /**/ //对算出的磁编码器总角度进行滤波处理 if(fabs(g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last) < PTZ_VERT_AS5047D_ANGLE_WF_A) { g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; break; } else { //根据判断,恢复实际的磁编码器圈数 switch(i) { case 0: g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.vert_as5047d.as5047d_cycle_count --;//转动圈数减少1 break; case 1: g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; g_ptz.vert_as5047d.as5047d_cycle_count ++;//转动圈数增加1 break; case 2: //磁编码器实际圈数恢复失败 g_ptz.vert_as5047d.as5047d_cycle_count = cycle_count_save; break; case 3: g_ptz.vert_as5047d.as5047d_ptz_angle_actual = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_wf_last = g_ptz.vert_as5047d.as5047d_ptz_angle_wf_actual; break; } } } if(g_ptz.vert_as5047d.as5047d_state == 1) { //对云台角度进行四舍五入,保留小数点后3位小数 tem3 = (long int)((g_ptz.vert_as5047d.as5047d_ptz_angle_K * (g_ptz.vert_as5047d.as5047d_ptz_angle_actual - g_ptz.vert_as5047d.as5047d_ptz_angle_max / 2.0)) * 1000.0 + 0.5); tem4 = tem3 / 1000.0; g_ptz.vert_angle_actual_a = tem4; if(g_ptz.offset_angle.vert_offset_switch == 2) { tem4 = tem4 - g_ptz.offset_angle.vert_zero_offset_angle; } g_ptz.vert_angle_actual = tem4; } //保存当前磁编码器的值以及云台角度值 g_ptz.vert_as5047d.as5047d_angle_last = g_ptz.vert_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_ptz_angle_last = g_ptz.vert_as5047d.as5047d_ptz_angle_actual; g_ptz.vert_angle_last = g_ptz.vert_angle_actual; // step_speed_for_vert = g_ptz.vert_as5047d.as5047d_ptz_angle_last;//用于步进电机速度计算 return 1; } #endif static void ptz_get_angle_task() { while(1) { ptz_hori_get_angle_a(); #ifdef CLK_50M OSTimeDlyHMSM(0u, 0u, 0u, 1u); #endif ptz_vert_get_angle_a(); OSTimeDlyHMSM(0u, 0u, 0u, 1u); } } void ptz_get_angle_init() { g_ptz.hori_as5047d.as5047d_angle_actual = as5047d_hori_get_angle_a(); g_ptz.hori_as5047d.as5047d_angle_actual = as5047d_hori_get_angle_a(); g_ptz.hori_as5047d.as5047d_angle_last = g_ptz.hori_as5047d.as5047d_angle_actual; g_ptz.vert_as5047d.as5047d_angle_actual = as5047d_vert_get_angle_a(); g_ptz.vert_as5047d.as5047d_angle_actual = as5047d_vert_get_angle_a(); g_ptz.vert_as5047d.as5047d_angle_last = g_ptz.vert_as5047d.as5047d_angle_actual; } static OS_STK task_get_angle_stk[TASK_GET_ANGLE_STK_SIZE]; static void creat_task_get_angle(void) { CPU_INT08U task_err; CPU_INT08U name_err; task_err = OSTaskCreateExt((void (*)(void *)) ptz_get_angle_task, (void *) 0, (OS_STK *)&task_get_angle_stk[TASK_GET_ANGLE_STK_SIZE - 1], (INT8U ) TASK_GET_ANGLE_PRIO, (INT16U ) TASK_GET_ANGLE_PRIO, (OS_STK *)&task_get_angle_stk[0], (INT32U ) TASK_GET_ANGLE_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if (OS_TASK_NAME_EN > 0) OSTaskNameSet(TASK_GET_ANGLE_PRIO, "ptz_get_angle_task", &name_err); #endif } void init_angle_module() { if(strstr((const char*)system_info.error_compensation, "on")) {//注:误差消除开关打开时,需要关闭水平重复定位功能 g_ptz.hori_angle_erro_switch = 1;//水平误差消除打开 g_ptz.hori_repeat_locate_switch = 0;//重复定位打开,重型云台关闭 }else{ g_ptz.hori_angle_erro_switch = 0;//水平误差消除关闭 } ptz_zero_offset_angle_read();//读取角度偏移量 // g_ptz.offset_angle.offset_anle = 0;//取消赋初始值,存入掉电保护 as5047d_init(); g_ptz.hori_as5047d.time_end = 0; g_ptz.hori_as5047d.time_now = 0; g_ptz.hori_as5047d.time = 0; g_ptz.vert_as5047d.time_end = 0; g_ptz.vert_as5047d.time_now = 0; g_ptz.vert_as5047d.time = 0; ptz_get_angle_init(); creat_task_get_angle(); }