/* * Created: 2022/11/4 11:02:40 * Author: wangzk zhengmengxing */ #include "..\PrjCommon\CommonDef.h" #include "..\PrjCommon\DevDefine.h" #include "AttMath.h" #include "AttCtrlMain.h" #include "..\PrjTelCtrlMng\TelCtrlMng.h" /*********************************************** 说明:数据处理模块初始化函数,进程开始调用一次 ***********************************************/ void ZKDPInit(void) { UINT32 i = 0; sAttPriData *tmpAtt = NULL; SsPara_t *pStar= NULL; GyroPara_t *pGyro= NULL; AssPara_t *pAss= NULL; MagPara_t *pMag= NULL; WhlPara_t *PWhl= NULL; PPUPara_t *PPPU= NULL; tmpAtt = (sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL==tmpAtt) { return; } pAss = &tmpAtt->sPerPara.AssPara; pMag = &tmpAtt->sPerPara.MagPara; PWhl = &tmpAtt->sPerPara.WhlPara; PPPU = &tmpAtt->sPerPara.PPUPara; //星敏 for (i = 0; i < STAR_NUM; i++) { pStar = &tmpAtt->sPerPara.SsPara[i]; pStar->ssIn_AttVld = POSE_NO; pStar->ssIn_DataSta = 0; pStar->ssCrCheckFlg = NO_CC; memset(pStar->ssIn_W, 0, 3*sizeof(TYPE_CAL)); pStar->ssExpose_Qbi[0] = 0; pStar->ssExpose_Qbi[1] = 0; pStar->ssExpose_Qbi[2] = 0; pStar->ssExpose_Qbi[3] = 1; memset(pStar->ssExpose_Wbi, 0, 3*sizeof(TYPE_CAL)); } tmpAtt->sPerPara.Ss_Qi[0] = 0; tmpAtt->sPerPara.Ss_Qi[1] = 0; tmpAtt->sPerPara.Ss_Qi[2] = 0; tmpAtt->sPerPara.Ss_Qi[3] = 1; memset(tmpAtt->sPerPara.Ss_Wi, 0.0, 3*sizeof(TYPE_CAL)); //陀螺 for (i = 0; i < GYRO_NUM; i++) { pGyro = &tmpAtt->sPerPara.GyroPara[i]; pGyro->GyroIn_AttVld = POSE_NO; pGyro->Gyro_ComTHUse[0] = POSE_OK; pGyro->Gyro_ComTHUse[1] = POSE_OK; pGyro->Gyro_ComTHUse[2] = POSE_OK; pGyro->GyroIn_DataSta = 0; pGyro->GyroCrCheckFlg =NO_CC; memset(pGyro->GyroIn_Tmper, 0, 3*sizeof(TYPE_CAL)); memset(pGyro->Gyro_Wi, 0, 3*sizeof(TYPE_CAL)); } memset(tmpAtt->sPerPara.GyroIn_CombWi, 0, 3*sizeof(TYPE_CAL)); memset(tmpAtt->sPerPara.Gyro_ATTWi, 0, 3*sizeof(TYPE_CAL)); tmpAtt->sPerPara.GyroIn_Comb = POSE_NO; //模拟太敏 for (i = 0; i < ASS_NUM; i++) { pAss->AssIn_AttVld[i]= POSE_NO; memset(pAss->AssIn_sensor[i], 0, 4*sizeof(TYPE_CAL)); pAss->AssCrCheckFlg =NO_CC; } pAss->Ass_SunVecb[0]= 0; //模拟太敏本体系太阳矢量XYZ pAss->Ass_SunVecb[1]= 0; //模拟太敏本体系太阳矢量XYZ pAss->Ass_SunVecb[2]= 0; //模拟太敏本体系太阳矢量XYZ pAss->Ass_SunVecVld= POSE_NO; //模拟太敏太阳矢量有效标志 pAss->Ass_SunVecbF[0]= 0; //模拟太敏帆板系太阳矢量XYZ pAss->Ass_SunVecbF[1]= 0; //模拟太敏帆板系太阳矢量XYZ pAss->Ass_SunVecbF[2]= 0; //模拟太敏帆板系太阳矢量XYZ pAss->Ass_SunATT[0] = 0; pAss->Ass_SunATT[1] = 0; pAss->Ass_SunOK= POSE_NO; pAss->ADIn_Date= POSE_OK; //磁强计 for (i = 0; i < MAG_NUM; i++) { pMag->MagIn_Valid[i]= POSE_NO; //模拟磁强计A/B有效标志 //输出量 memset(pMag->Mag_Bc_MeaAB[i],0,3*sizeof(TYPE_CAL)); memset(pMag->Mag_Bb_MeaAB[i],0,3*sizeof(TYPE_CAL)); } pMag->MagIn_Valid[2]= POSE_NO; //模拟磁强计A/B有效标志 pMag->MagIn_DataSta= 0; pMag->MagUseSwich= 0; pMag->Mag_Bb_MeaZH[0] =0; pMag->Mag_Bb_MeaZH[1] =0; pMag->Mag_Bb_MeaZH[2] =0; for (i = 0; i < MAG_NUM; i++) { pMag->MagCrCheckFlg[i]= NO_CC; pMag->MagAvailableFlg[i] = POSE_OK; } memset(pMag->Mag_UBb,0,3*sizeof(TYPE_CAL)); //飞轮 for (i = 0; i < WHEEL_NUM; i++) { PWhl->WhlIn_DataSta[i] = 0; PWhl->WhlIn_Valid[i] = POSE_NO; PWhl->Whl_Current[i]= 0.0f; PWhl->Whl_Tmper[i] = 0.0f; PWhl->Whl_Momentum[i]= 0; //四个飞轮的角动量 } for(i=0;i<3;i++) { PWhl->Whl_Momentum_XYZ[i]= 0.0; //飞轮三轴的角动量 } PWhl->Whl_Momentum_Sum = 0; #ifndef MINMODULE_TYPE //电推 PPPU->PPUIn_Valid = POSE_NO; //PPU数据有效标志 PPPU->PPUIn_DataSta = 0; //PPU 数据无效原因 PPPU->PPUIn_ReCnt= 0; //PPU遥测请求计数 PPPU->PPUIn_AVoltage = 0; //推进阳极电源电压 PPPU->PPUIn_ACurrent = 0; //推进阳极电源电流 PPPU->PPUT_BOTTLE_Tmper1 = 0.0f; PPPU->PPUT_BOTTLE_Tmper2 = 0.0f; PPPU->PPUT_PIPE_Tmper1 = 0.0f; PPPU->PPUT_PIPE_Tmper2 = 0.0f; #endif } /*********************************************** 说明:获取星敏数据,注意星敏A\B原包数据均为小端 ***********************************************/ void Ss_DataGet(void ) //ST-APS2-2B(X)星敏感器 { UINT8 sum = 0; UINT8 i = 0; UINT8 j = 0; UINT16 tmpHEAD[3] = {0,0,0}; UINT16 tmpINFIN[3] ={0,0,0}; INT32 tempQdata[4] = {0,0,0,1}; INT16 tempWdata = 0; INT32 tempQdataC = 0; INT16 tempWdataC = 0; sAttPriData *tmpAtt = NULL; sDevInfo * tmpDevInfo[3]= {NULL}; SsPara_t *PStar[STAR_NUM]= {NULL}; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL==tmpAtt) { return; } //获取设备数据地址 tmpDevInfo[0] = GETDEVINFO(DEV_NO_UART15); //星敏A(803) tmpDevInfo[1] = GETDEVINFO(DEV_NO_UART16); //星敏B(803) tmpDevInfo[2] = GETDEVINFO(DEV_NO_UART4); //星敏C(天银) PStar[0] = &tmpAtt->sPerPara.SsPara[0]; PStar[1] = &tmpAtt->sPerPara.SsPara[1]; PStar[2] = &tmpAtt->sPerPara.SsPara[2]; //记录前次原包数据 for (i = 0; i < STAR_NUM; i++) { memcpy(PStar[i]->ssIn_Qpre, PStar[i]->ssIn_Q, 4*sizeof(TYPE_CAL)); //初始化 PStar[i]->ssIn_Q[0] = 0; PStar[i]->ssIn_Q[1] = 0; PStar[i]->ssIn_Q[2] = 0; PStar[i]->ssIn_Q[3] = 1; } //获取星敏单机包头 for (i = 0; i < STAR_NUM; i++) { tmpHEAD[i] = (tmpDevInfo[i]->cDevYCBuffer[0 + 20]<<8)|tmpDevInfo[i]->cDevYCBuffer[0 + 20+1]; } //获取星敏单机信息字 tmpINFIN[0] = (tmpDevInfo[0]->cDevYCBuffer[0 + 20 +2]<<8)|tmpDevInfo[0]->cDevYCBuffer[0 + 20+3]; tmpINFIN[1] = (tmpDevInfo[1]->cDevYCBuffer[0 + 20 +2]<<8)|tmpDevInfo[1]->cDevYCBuffer[0 + 20+3]; tmpINFIN[2] = tmpDevInfo[2]->cDevYCBuffer[0 + 20+2]; //星敏AB数据获取 for (i = 0; i < (STAR_NUM -1); i++) { if (INFO_SIG_CHANGE == tmpDevInfo[i] ->cDevYCBuffer[0]) { if ((STARAB_HEAD != tmpHEAD[i]) || (STARAB_ID != tmpINFIN[i])) { PStar[i]->ssIn_AttVld = POSE_NO; PStar[i]->ssIn_DataSta = ZERO_TO_ONE(PStar[i]->ssIn_DataSta , 1, 1 ); /* errNo=0,星敏包头|ID号错误 */ } else { sum = 0; /*判断校验和*/ for(j = 0; j < (STARAB_LEN - 1); j++) { sum += tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+j]; } if ((0xFF & sum) != tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+STARAB_LEN-1]) { PStar[i]->ssIn_AttVld = POSE_NO; PStar[i]->ssIn_DataSta = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 2, 1 ); /* errNo=0,星敏数据校验和不对 */ } else { //星敏数据包中状态字1判断 if (0x20 == (tmpDevInfo[i]->cDevYCBuffer[20+20] & 0x30)) { PStar[i]->ssIn_AttVld = POSE_NO; PStar[i]->ssIn_DataSta = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 3, 1 ); /* 星敏感器状态字1中数据无效*/ } else { PStar[i]->ssIn_AttVld = POSE_OK; } } } } else { PStar[i]->ssIn_AttVld = POSE_NO; PStar[i]->ssIn_DataSta = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 0, 1 ); /* errNo=0,星敏数据不更新 */ } //解析星敏AB的数据 if (POSE_OK == PStar[i]->ssIn_AttVld) { //四元数 for(j = 0; j < 4; j++) { tempQdata[j] = DoGetInt32From8(&(tmpDevInfo[i]->cDevYCBuffer[20+4*j+4])); } PStar[i]->ssIn_Q[3] = tempQdata[0]/2147483647.5f; PStar[i]->ssIn_Q[0] = tempQdata[1]/2147483647.5f; PStar[i]->ssIn_Q[1] = tempQdata[2]/2147483647.5f; PStar[i]->ssIn_Q[2] = tempQdata[3]/2147483647.5f; //角速度 for(j = 0; j < 3; j++) { tempWdata = DoGetInt16From8(&tmpDevInfo[i]->cDevYCBuffer[20+2*j+45]); PStar[i]->ssIn_W[j] = ((float)tempWdata)*ANG2RADIAN*POSE_2T13; } PStar[i]->ssIn_W[2] = - PStar[i]->ssIn_W[2]; } } //星敏C数据获取 if (INFO_SIG_CHANGE == tmpDevInfo[2] ->cDevYCBuffer[0]) { if ((STARC_HEAD != tmpHEAD[2]) || (STARC_ID != tmpINFIN[2])) { PStar[2]->ssIn_AttVld = POSE_NO; PStar[2]->ssIn_DataSta = ZERO_TO_ONE(PStar[2]->ssIn_DataSta , 1, 1 ); /* errNo=0,星敏包头|ID号错误 */ } else { sum = 0; /*判断校验和*/ for(j = 2; j < (STARC_LEN - 1); j++) {sum += tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+j];} if ((0xFF & sum) != tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+STARC_LEN - 1]) { PStar[2]->ssIn_AttVld = POSE_NO; PStar[2]->ssIn_DataSta = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 2, 1 ); /* errNo=0,星敏数据校验和不对 */ } else { //星敏数据包中状态字1判断 if ((tmpDevInfo[2]->cDevYCBuffer[20+33] & 0x01) != 0x01) { PStar[2]->ssIn_AttVld = POSE_NO; PStar[2]->ssIn_DataSta = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 3, 1 ); /* 星敏感器状态字1中数据无效*/ } else { PStar[2]->ssIn_AttVld = POSE_OK; } } } } else { PStar[2]->ssIn_AttVld = POSE_NO; PStar[2]->ssIn_DataSta = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 0, 1 ); /* errNo=0,星敏数据不更新 */ } //解析星敏C的数据 if (POSE_OK == PStar[2]->ssIn_AttVld) { //四元数 for(j = 0; j < 4; j++) { tempQdataC = DoGetInt32From8(&tmpDevInfo[2]->cDevYCBuffer[20+4*j+3]); PStar[2]->ssIn_Q[j] = ((float)tempQdataC)/2147483647.0f; } //角速度 for(j = 0; j < 3; j++) { tempWdataC = DoGetInt16From8(&tmpDevInfo[2]->cDevYCBuffer[20+2*j+42]); PStar[2]->ssIn_W[j] = ((float)tempWdataC)*ANG2RADIAN*POSE_2T11; } } } /*********************************************** 说明:星敏数据处理 ***********************************************/ void Ss_DataPre(void) { UINT8 i = 0; UINT8 j = 0; TYPE_CAL tmpRbs[9] = {0.0}; TYPE_CAL tmpRsi[9] = {0.0}; TYPE_CAL tmpRbi[9] = {0.0}; TYPE_CAL tmp_SS[3][3][3] = {0.0}; //星敏安装矩阵 sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; SsPara_t *PStar[STAR_NUM] = {NULL}; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt)||(NULL==tmpConst)) return; PStar[0] = &tmpAtt->sPerPara.SsPara[0]; PStar[1] = &tmpAtt->sPerPara.SsPara[1]; PStar[2] = &tmpAtt->sPerPara.SsPara[2]; memcpy(&(tmp_SS[0][0][0]), &(tmpConst->AttCmdFlashPara.M_SSA[0][0]), 9*sizeof(TYPE_CAL)); memcpy(&(tmp_SS[1][0][0]), &(tmpConst->AttCmdFlashPara.M_SSB[0][0]), 9*sizeof(TYPE_CAL)); memcpy(&(tmp_SS[2][0][0]), &(tmpConst->AttCmdFlashPara.M_SSC[0][0]), 9*sizeof(TYPE_CAL)); for (i = 0; i < STAR_NUM; i++) { if ((POSE_OK ==PStar[i]->ssIn_AttVld)) { if (POSE_ABSF(PStar[i]->ssIn_Qpre[0]-PStar[i]->ssIn_Q[0])< SENSOR_ZERO &&POSE_ABSF(PStar[i]->ssIn_Qpre[1]-PStar[i]->ssIn_Q[1])< SENSOR_ZERO &&POSE_ABSF(PStar[i]->ssIn_Qpre[2]-PStar[i]->ssIn_Q[2])< SENSOR_ZERO &&POSE_ABSF(PStar[i]->ssIn_Qpre[3]-PStar[i]->ssIn_Q[3])< SENSOR_ZERO) { if(PStar[i]->ssExpose_cnt<255) { PStar[i]->ssExpose_cnt++; } } else { PStar[i]->ssExpose_cnt =0; } if (PStar[i]->ssExpose_cnt >= 5) { PStar[i]->ssIn_AttVld = POSE_NO; PStar[i]->ssIn_DataSta = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 4, 1 ); } else { if(PStar[i]->ssIn_Q[3]<0) { for (j = 0; j < 4; j++) { PStar[i]->ssIn_Q[j] = - PStar[i]->ssIn_Q[j]; } } Q2Att(PStar[i]->ssIn_Q, tmpRsi); memcpy(tmpRbs, &(tmp_SS[i][0][0]), 9 * sizeof(TYPE_CAL)); MatrixProductHL(tmpRbs, tmpRsi, tmpRbi, 3, 3, 3); Att2Q(tmpRbi, PStar[i]->ssExpose_Qbi); MatrixProductHL(tmpRbs, PStar[i]->ssIn_W, PStar[i]->ssExpose_Wbi, 3, 3, 1); PStar[i]->ssIn_AttVld=POSE_OK; } } } } /*********************************************** 说明:获取陀螺数据 ***********************************************/ void Gyro_DataGet(void) { UINT8 i = 0; UINT8 j = 0; UINT8 k = 0; INT32 tmpDtInt = 0; INT16 tmpDtTmper = 0; UINT8 sum[GYRO_NUM] = {0,0,0}; UINT16 tmpHEAD[GYRO_NUM] = {0,0,0}; UINT8 tmpLONG[GYRO_NUM] = {0,0,0}; UINT16 tmpDATAHEAD[GYRO_NUM] = {0,0,0}; TYPE_CAL tmpGyroIn_Speed[3]= {0.0,0.0,0.0}; TYPE_CAL tmpkGyroIn_Speed[3]= {0.0,0.0,0.0}; UINT8 tmpcnt[GYRO_NUM][3] = {{POSE_OK,POSE_OK,POSE_OK},{POSE_OK,POSE_OK,POSE_OK},{POSE_OK,POSE_OK,POSE_OK}}; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; sDevInfo * tmpDevInfo[GYRO_NUM] = {NULL}; GyroPara_t *PGyro[GYRO_NUM] = {NULL}; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt)||(NULL==tmpConst)) { return; } PGyro[0] = &tmpAtt->sPerPara.GyroPara[0]; PGyro[1] = &tmpAtt->sPerPara.GyroPara[1]; PGyro[2] = &tmpAtt->sPerPara.GyroPara[2]; //获取陀螺地址 tmpDevInfo[0] = GETDEVINFO(DEV_NO_UART5) ; tmpDevInfo[1] = GETDEVINFO(DEV_NO_UART6) ; tmpDevInfo[2] = GETDEVINFO(DEV_NO_UART7) ; //获取数据包头 tmpHEAD[0]=(tmpDevInfo[0]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[0]->cDevYCBuffer[0 + INFO_ADDR_OFF+1]; tmpHEAD[1]=(tmpDevInfo[1]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[1]->cDevYCBuffer[0 + INFO_ADDR_OFF+1]; tmpHEAD[2]=(tmpDevInfo[2]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[2]->cDevYCBuffer[0 + INFO_ADDR_OFF+1]; tmpDATAHEAD[0] = GYRO_DATA_HEADA; tmpDATAHEAD[1] = GYRO_DATA_HEADA; tmpDATAHEAD[2] = GYRO_DATA_HEADC; //获取数据长 tmpLONG[0] = GYRO_DATA_LENA; tmpLONG[1] = GYRO_DATA_LENA; tmpLONG[2] = GYRO_DATA_LENC; //记录前次原包数据 for (i = 0; i < GYRO_NUM; i++) { memcpy(PGyro[i]->GyroIn_SpeedPre, PGyro[i]->GyroIn_Speed, 3*sizeof(TYPE_CAL)); //初始化 memset(PGyro[i]->GyroIn_Speed, 0, 3*sizeof(TYPE_CAL)); } for (i = 0; i < GYRO_NUM ; ++i) { if (INFO_SIG_CHANGE == tmpDevInfo[i]->cDevYCBuffer[0]) { if (tmpHEAD[i] == tmpDATAHEAD[i]) { /*判断校验和*/ for(j = 0; j < tmpLONG[i] - 1; j++) { sum[i] += tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+j];//陀螺的包长 } if ((0xFF & sum[i]) == tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+tmpLONG[i] - 1]) { PGyro[i]->GyroIn_AttVld = POSE_OK; } else { PGyro[i]->GyroIn_AttVld = POSE_NO; PGyro[i]->GyroIn_DataSta = ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 2, 1 ); /* errNo=0,陀螺A数据校验和错误 */ } } else { PGyro[i]->GyroIn_AttVld = POSE_NO; PGyro[i]->GyroIn_DataSta= ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta, 1, 1 ); /* errNo=0,陀螺A包头|包长错误 */ } } else { PGyro[i]->GyroIn_AttVld = POSE_NO; PGyro[i]->GyroIn_DataSta= ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 0, 1 ); /* errNo=0,陀螺A数据不更新 */ } } //陀螺AB数据解析 for (j = 0; j < 2 ; ++j) { if (POSE_OK ==PGyro[j]->GyroIn_AttVld) { for (i = 0; i < 3 ; ++i) { //XYZ轴角速度,单位:°/s tmpDtInt = DoGetInt32From8(&(tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+4*i+9])); tmpGyroIn_Speed[i] = (float)tmpDtInt * (1.0E-5)*ANG2RADIAN ; //XYZ轴角温度,单位:℃ tmpDtTmper= tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+2*i+21]<<8|tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+2*i+22]; PGyro[j]->GyroIn_Tmper[i] = (float)(tmpDtTmper)*(1.0E-2); } MatrixProductHL(tmpConst->AttCmdFlashPara.Gyro_Comd_K[j][0] , tmpGyroIn_Speed, tmpkGyroIn_Speed, 3, 3, 1); for (i = 0; i < 3 ; ++i) { //XYZ轴角速度,单位:°/s PGyro[j]->GyroIn_Speed[i] = tmpkGyroIn_Speed[i] + tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[j][i] ; } } } //陀螺C数据解析 if (POSE_OK == PGyro[2]->GyroIn_AttVld) { for (i = 0; i < 3 ; ++i) { //XYZ轴角速度,单位:°/s tmpGyroIn_Speed[i] = ((PoseGetInt32From24(&(tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+3*i+9]))))*POSE_POW(2,-18)*ANG2RADIAN ; //XYZ轴角温度,单位:℃ tmpDtTmper= tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+2*i+19]<<8|tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+2*i+20]; PGyro[2]->GyroIn_Tmper[i] = (float)(tmpDtTmper)*POSE_POW(2,-8); } MatrixProductHL(tmpConst->AttCmdFlashPara.Gyro_Comd_K[2][0] , tmpGyroIn_Speed, tmpkGyroIn_Speed, 3, 3, 1); for (i = 0; i < 3 ; ++i) { //XYZ轴角速度,单位:°/s PGyro[2]->GyroIn_Speed[i] = tmpkGyroIn_Speed[i] + tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[2][i] ; } } //陀螺数据判断 for (i = 0; i < GYRO_NUM ; ++i) { if (POSE_OK == PGyro[i]->GyroIn_AttVld) { for (k = 0; k < 3 ; ++k) { if (POSE_ABSF(PGyro[i]->GyroIn_SpeedPre[k] - PGyro[i]->GyroIn_Speed[k]) < POSE_ZERO) { if (PGyro[i]->Gyro_ComCnt[k] < 60000) { PGyro[i]->Gyro_ComCnt[k]++; } } else { PGyro[i]->Gyro_ComCnt[k] =0; } if (POSE_ABSF(PGyro[i]->GyroIn_Speed[k]) > 0.436) { tmpcnt[i][k] = POSE_NO; } else { tmpcnt[i][k] = POSE_OK; } if ((PGyro[i]->Gyro_ComCnt[k] < 5)&& (tmpcnt[i][k] == POSE_OK)) { PGyro[i]->Gyro_ComTHUse[k] = POSE_OK; } else { PGyro[i]->Gyro_ComTHUse[k] = POSE_NO; PGyro[i]->GyroIn_DataSta = ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 3+k, 1 ); } } } else { PGyro[i]->Gyro_ComTHUse[0] = POSE_NO; PGyro[i]->Gyro_ComTHUse[1] = POSE_NO; PGyro[i]->Gyro_ComTHUse[2] = POSE_NO; } if ((POSE_NO == PGyro[i]->Gyro_ComTHUse[0])||(POSE_NO == PGyro[i]->Gyro_ComTHUse[1])||(POSE_NO == PGyro[i]->Gyro_ComTHUse[2])) { PGyro[i]->GyroIn_AttVld= POSE_NO; } } } /*********************************************** 说明:陀螺数据处理 ***********************************************/ void Gyro_DataPre(void) { TYPE_CAL tmpRbs[9]= {0.0}; TYPE_CAL tmpRbi[3]= {0.0,0.0,0.0};//陀螺输出角速度XYZ UINT8 i = 0; UINT8 k = 0; UINT8 tmpGyro = POSE_NO; UINT8 tmpComTHUse[3] = {0,0,0}; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; GyroPara_t *PGyro[GYRO_NUM] = {NULL}; AttIMPTPara_t *pIMU = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt)||(NULL==tmpConst)) { return; } pIMU=&tmpAtt->sIMPTPara; PGyro[0] = &tmpAtt->sPerPara.GyroPara[0]; PGyro[1] = &tmpAtt->sPerPara.GyroPara[1]; PGyro[2] = &tmpAtt->sPerPara.GyroPara[2]; if ((0x55 == PGyro[0]->GyroIn_AttVld) || (0x55 == PGyro[1]->GyroIn_AttVld) || (0x55 == PGyro[2]->GyroIn_AttVld)) { for (i = 0; i < GYRO_NUM ; ++i) { tmpGyro = POSE_NO; if (POSE_OK == PGyro[i]->GyroIn_AttVld) { for (k = 0; k < 3 ; ++k) { tmpRbi[k] = PGyro[i]->GyroIn_Speed[k]; } tmpGyro = POSE_OK; } memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_GYRO[i][0][0]), 9 * sizeof(TYPE_CAL)); if (tmpGyro == POSE_OK) { MatrixProductHL(tmpRbs, tmpRbi, PGyro[i]->Gyro_Wi, 3, 3, 1); } } } if((POSE_NO == pIMU->GyroUseState[0]) && (POSE_NO == pIMU->GyroUseState[1]) && (POSE_NO == pIMU->GyroUseState[2])) { if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0]) { tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][0]; tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][0]; tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][0]; tmpRbi[0] = PGyro[0]->GyroIn_Speed[0]; tmpComTHUse[0] = 0x55; } else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0]) { tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][0]; tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][0]; tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][0]; tmpRbi[0] = PGyro[1]->GyroIn_Speed[0]; tmpComTHUse[0] = 0x55; } else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0]) { tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][0]; tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][0]; tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][0]; tmpRbi[0] = PGyro[2]->GyroIn_Speed[0]; tmpComTHUse[0] = 0x55; } if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1]) { tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][1]; tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][1]; tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][1]; tmpRbi[1] = PGyro[0]->GyroIn_Speed[1]; tmpComTHUse[1] = 0x55; } else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1]) { tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][1]; tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][1]; tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][1]; tmpRbi[1] = PGyro[1]->GyroIn_Speed[1]; tmpComTHUse[1] = 0x55; } else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1]) { tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][1]; tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][1]; tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][1]; tmpRbi[1] = PGyro[2]->GyroIn_Speed[1]; tmpComTHUse[1] = 0x55; } if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2]) { tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][2]; tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][2]; tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][2]; tmpRbi[2] = PGyro[0]->GyroIn_Speed[2]; tmpComTHUse[2] = 0x55; } else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2]) { tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][2]; tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][2]; tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][2]; tmpRbi[2] = PGyro[1]->GyroIn_Speed[2]; tmpComTHUse[2] = 0x55; } else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2]) { tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][2]; tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][2]; tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][2]; tmpRbi[2] = PGyro[2]->GyroIn_Speed[2]; tmpComTHUse[2] = 0x55; } if ((0x55 == tmpComTHUse[0])&&(0x55 == tmpComTHUse[1])&&(0x55 == tmpComTHUse[2]) ) { tmpAtt->sPerPara.GyroIn_Comb = POSE_OK; MatrixProductHL(tmpRbs, tmpRbi, tmpAtt->sPerPara.GyroIn_CombWi, 3, 3, 1); } else { tmpAtt->sPerPara.GyroIn_Comb = POSE_NO; } } } /*********************************************** 说明:获取模拟太敏数据 ***********************************************/ void Ass_DataGet(void ) { UINT32 i = 0; UINT32 j = 0; INT16 tmpDtInt = 0; INT16 *pAss16 = NULL; sDevInfo * tmpDevInfo = NULL; sAttPriData *tmpAtt = NULL; AssPara_t *pAss = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL==tmpAtt) { return; } pAss = &tmpAtt->sPerPara.AssPara; //UINT32 ID[6] = {97,113,101,117,121,125}; UINT32 ID[6] = {SA1_TM_XP1-1, SA9_TM_YN1-1,SA5_TM_XN1-1,SA13_TM_YP1-1,SA17_TM_ZN1-1,SA21_TM_P1-1}; //获取AD采集数据 tmpDevInfo = GETDEVINFO(DEV_NO_AD) ; pAss16 = (INT16 *)(&tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]); //模拟太敏有效性判断 if (INFO_SIG_CHANGE ==tmpDevInfo->cDevYCBuffer[0]) { for (i= 0; i < ASS_NUM; i++) { for (j= 0; j < 4; j++) { //获取模拟太敏6*4电池片电压 tmpDtInt = *(pAss16 + ID[i] +j); pAss->AssIn_sensor[i][j] = (((TYPE_CAL)(tmpDtInt))*10/4095.0-5.0)/966.0*1000.0 ; } } pAss->ADIn_Date = POSE_OK; } else { pAss->ADIn_Date = POSE_NO; } } /*********************************************** 说明:太敏数据处理 ***********************************************/ void Ass_DataPre(void) { UINT32 i = 0; UINT32 j = 0; UINT32 k = 0; UINT32 iMax = 0; UINT8 tempAssUseState[ASS_NUM]= {0,0,0,0,0,0};; //单个太敏可用标志 TYPE_CAL tmpSumMax = 0.0; TYPE_CAL tmpAss_data_SUM[ASS_NUM] = {0.0,0.0,0.0,0.0,0.0,0.0}; TYPE_CAL tmpU[4] = {0.0,0.0,0.0,0.0}; TYPE_CAL tmpRbs[9]= {0.0}; TYPE_CAL tmpSm[3]= {0.0}; TYPE_CAL tmpXs = 0.0; TYPE_CAL tmpYs = 0.0; TYPE_CAL tmpX = 1.0; TYPE_CAL tmpY = 1.0; TYPE_CAL tmpa=5.0;//电池片宽度 TYPE_CAL tmpH=1.95;//光栅距离电池面距离 TYPE_CAL tmpTheta = 0.0; TYPE_CAL tmpGamma = 0.0; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; AssPara_t *pAss = NULL; AttIMPTPara_t *pImpt = NULL; sAttModPara_t *pWMod = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) { return; } pAss = &tmpAtt->sPerPara.AssPara; pImpt=&tmpAtt->sIMPTPara; pWMod=&tmpAtt->sModePara; if (POSE_OK == pAss->ADIn_Date) { for (i= 0; i < 4; i++) { for (j= 0; j < 4; j++) { tmpAss_data_SUM[i] += pAss->AssIn_sensor[i][j]; } if ((tmpAss_data_SUM[i] < tmpConst->Ass_MaxFour_limt[0] )&&(tmpAss_data_SUM[i] > tmpConst->Ass_MinFour_limt[0])) { pAss->AssIn_AttVld[i] = POSE_OK; } else { pAss->AssIn_AttVld[i] = POSE_NO; } } for (i= 4; i < ASS_NUM; i++) { for (j= 0; j < 4; j++) { tmpAss_data_SUM[i] += pAss->AssIn_sensor[i][j]; } if ((tmpAss_data_SUM[i] < tmpConst->Ass_MaxFour_limt[1] )&&(tmpAss_data_SUM[i] > tmpConst->Ass_MinFour_limt[1])) { pAss->AssIn_AttVld[i] = POSE_OK; } else { pAss->AssIn_AttVld[i] = POSE_NO; } } } if ((0x55 == pWMod->WModSadaOpen)&& (0x55 != pWMod->WModSadaOpenPre)) { pImpt->AssUseState[4] = POSE_NO; } //选择当前使用的模拟太敏,如果均不可用,则没有太敏可用于计算太阳矢量,输出模拟太敏矢量无效 for (k= 0; k < ASS_NUM -1; k++) { if ((POSE_OK == pAss->AssIn_AttVld[k])&& (POSE_OK == pImpt->AssUseState[k])) { if(tmpAss_data_SUM[k]>tmpSumMax) { tmpSumMax=tmpAss_data_SUM[k]; iMax=k; } tempAssUseState[k] = 0x55; } } if((0 == tempAssUseState[0])&&(0 == tempAssUseState[1])&&(0 == tempAssUseState[2])&&(0 == tempAssUseState[3])&&(0 == tempAssUseState[4]))//太敏均无效 { pAss->Ass_SunVecVld = POSE_NO; } else { if(0 == iMax) { memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSA[0][0]), 9 * sizeof(TYPE_CAL)); } else if(1 == iMax) { memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSB[0][0]), 9 * sizeof(TYPE_CAL)); } else if(2 == iMax) { memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSC[0][0]), 9 * sizeof(TYPE_CAL)); } else if(3 == iMax) { memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSD[0][0]), 9 * sizeof(TYPE_CAL)); } else if(4 == iMax) { memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSE[0][0]), 9 * sizeof(TYPE_CAL)); } if ((iMax>=0)&&(iMax<4)) { tmpH = 1.95; } else { tmpH = 4.0; } tmpXs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpH; if(tmpXs!=0) { tmpX=tmpa*(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpXs; } tmpYs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpH; if(tmpYs!=0) { tmpY=tmpa*(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpYs; } //根据坐标值求出太阳矢量方位角θ、虚余仰角r tmpTheta = POSE_ATAN2F(tmpY, tmpX); tmpGamma = POSE_ATANF((POSE_SQRTF(tmpX*tmpX+tmpY*tmpY))/tmpH); tmpSm[0] = -POSE_COSF(tmpTheta)*POSE_SINF(tmpGamma); tmpSm[1] = -POSE_SINF(tmpTheta)*POSE_SINF(tmpGamma); tmpSm[2] = POSE_COSF(tmpGamma); MatrixProductHL(tmpRbs, tmpSm, pAss->Ass_SunVecb, 3, 3, 1); pAss->Ass_SunVecVld= POSE_OK; } //计算帆板模拟太敏方位角θ、虚余仰角r if ((POSE_OK == pAss->AssIn_AttVld[5])&& (POSE_OK == pImpt->AssUseState[5])) { tmpH = 4.0; memcpy(tmpU, &(pAss->AssIn_sensor[5][0]), 4*sizeof(TYPE_CAL)); memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSF[0][0]), 9 * sizeof(TYPE_CAL)); tmpXs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpH; if(tmpXs!=0) { tmpX=tmpa*(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpXs; } tmpYs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpH; if(tmpYs!=0) { tmpY=tmpa*(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpYs; } //根据坐标值求出太阳矢量方位角θ、虚余仰角r tmpTheta = POSE_ATAN2F(tmpY, tmpX); tmpGamma = POSE_ATANF((POSE_SQRTF(tmpX*tmpX+tmpY*tmpY))/tmpH); pAss->Ass_SunATT[0] = tmpTheta; pAss->Ass_SunATT[1] = tmpGamma; tmpSm[0] = -POSE_COSF(tmpTheta)*POSE_SINF(tmpGamma); tmpSm[1] = -POSE_SINF(tmpTheta)*POSE_SINF(tmpGamma); tmpSm[2] = POSE_COSF(tmpGamma); MatrixProductHL(tmpRbs, tmpSm, pAss->Ass_SunVecbF, 3, 3, 1); pAss->Ass_SunOK = POSE_OK; } else { pAss->Ass_SunOK = POSE_NO; } } /*********************************************** 说明:获取磁强计数据 ***********************************************/ void Mag_DataGet(void) { TYPE_CAL tmpMag_Bb_Limit = 55000.0; //sjd20231123 INT16 tmpDtInt = 0; INT16 *pMag16 = NULL; UINT32 i = 0; UINT32 j = 0; TYPE_CAL tmpVm[MAG_NUM][3] = {{0,0,0},{0,0,0}}; UINT32 ID = 2; ID = SV3_CQJA_X -1 ; sDevInfo * tmpDevInfo = NULL; sAttPriData *tmpAtt= NULL; AttCtrlConst_t *tmpConst= NULL; MagPara_t *pMag= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; pMag = &tmpAtt->sPerPara.MagPara; //获取AD采集数据 tmpDevInfo = GETDEVINFO(DEV_NO_AD) ; pMag16 = (INT16 *)(&tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]); //模拟磁强计的补偿矩阵计算 if (INFO_SIG_CHANGE == tmpDevInfo -> cDevYCBuffer[0]) { for (i = 0; i < MAG_NUM; ++i) { //计算Vm for (j = 0; j< 3; j++) { tmpDtInt = *(pMag16 + ID +j + 3*i); tmpVm[i][j] = tmpConst->AttCmdFlashPara.MAG_LK[i][j] * (((float)(tmpDtInt))*10/4095 - 5 ) + tmpConst->AttCmdFlashPara.MAG_LB[i][j]; //MAG_LK 24000 } } if ((POSE_ABSF(tmpVm[0][0]) >tmpMag_Bb_Limit)|| (POSE_ABSF(tmpVm[0][1]) >tmpMag_Bb_Limit)|| (POSE_ABSF(tmpVm[0][2]) >tmpMag_Bb_Limit)) { if (POSE_ABSF(tmpVm[0][0]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 1, 1 ); //磁强计A测量值超阈值 } if (POSE_ABSF(tmpVm[0][1]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 2, 1 ); //磁强计A测量值超阈值 } if (POSE_ABSF(tmpVm[0][2]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 3, 1 ); //磁强计A测量值超阈值 } pMag->MagIn_Valid[0] = POSE_NO; } else { memcpy(pMag->Mag_Bc_MeaAB[0], tmpVm[0], 3*sizeof(TYPE_CAL)); pMag->MagIn_Valid[0] = POSE_OK; } if ((POSE_ABSF(tmpVm[1][0]) >tmpMag_Bb_Limit) || (POSE_ABSF(tmpVm[1][1]) >tmpMag_Bb_Limit)||(POSE_ABSF(tmpVm[1][2]) >tmpMag_Bb_Limit)) { if (POSE_ABSF(tmpVm[1][0]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 4, 1 ); //磁强计A测量值超阈值 } if (POSE_ABSF(tmpVm[1][1]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 5, 1 ); //磁强计A测量值超阈值 } if (POSE_ABSF(tmpVm[1][2]) >tmpMag_Bb_Limit) { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 6, 1 ); //磁强计A测量值超阈值 } pMag->MagIn_Valid[1] = POSE_NO; } else { memcpy(pMag->Mag_Bc_MeaAB[1], tmpVm[1], 3*sizeof(TYPE_CAL)); pMag->MagIn_Valid[1] = POSE_OK; } } else { pMag->MagIn_DataSta = ZERO_TO_ONE( pMag->MagIn_DataSta, 0, 1 ); //数据不更新 pMag->MagIn_Valid[0] = POSE_NO; pMag->MagIn_Valid[1] = POSE_NO; } } /*********************************************** 说明:磁强计数据处理 ***********************************************/ void Mag_DataPre(void) { UINT8 i = 0; TYPE_CAL tmKm[3][3] = {{0.0,0.0,0.0},{0.0,0.0,0.0},{0.0,0.0,0.0}}; TYPE_CAL tmpMag_Bc_MeaAB[3]= {0.0,0.0,0.0}; UINT8 tmpComTHUse[3] = {0,0,0}; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; MagPara_t *pMag = NULL; AttIMPTPara_t *pIMU = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt) || (NULL==tmpConst)) { return; } pMag = &tmpAtt->sPerPara.MagPara; pIMU=&tmpAtt->sIMPTPara; //测量系磁强计A磁矢量 if (POSE_OK == pMag->MagIn_Valid[0]) { memcpy( tmKm[0], tmpConst->AttCmdFlashPara.M_MAG[0], 9 * sizeof(TYPE_CAL)); MatrixPlusVectorN( tmKm[0], pMag->Mag_Bc_MeaAB[0], pMag->Mag_Bb_MeaAB[0], 3, 3 ); } if (POSE_OK ==pMag->MagIn_Valid[1]) { memcpy( tmKm[0], tmpConst->AttCmdFlashPara.M_MAG[1], 9 * sizeof(TYPE_CAL)); MatrixPlusVectorN( tmKm[0], pMag->Mag_Bc_MeaAB[1], pMag->Mag_Bb_MeaAB[1], 3, 3 ); } if ((POSE_NO == pIMU->MagUseState[0])&&(POSE_NO == pIMU->MagUseState[1])) { for (i = 0; i < 3; ++i) { if (0x11 == tmpConst->AttCmdFlashPara.Mag_ComRESW[i]) { tmKm[0][i] = tmpConst->AttCmdFlashPara.M_MAG[0][0][i]; tmKm[1][i] = tmpConst->AttCmdFlashPara.M_MAG[0][1][i]; tmKm[2][i] = tmpConst->AttCmdFlashPara.M_MAG[0][2][i]; tmpMag_Bc_MeaAB[i] =pMag->Mag_Bc_MeaAB[0][i]; tmpComTHUse[i] = 0x55; } else if (0x22 == tmpConst->AttCmdFlashPara.Mag_ComRESW[i]) { tmKm[0][i] = tmpConst->AttCmdFlashPara.M_MAG[1][0][i]; tmKm[1][i] = tmpConst->AttCmdFlashPara.M_MAG[1][1][i]; tmKm[2][i] = tmpConst->AttCmdFlashPara.M_MAG[1][2][i]; tmpMag_Bc_MeaAB[i] =pMag->Mag_Bc_MeaAB[1][i]; tmpComTHUse[i] = 0x55; } } if ((0x55 == tmpComTHUse[0])&&(0x55 == tmpComTHUse[1])&&(0x55 == tmpComTHUse[2])) { MatrixPlusVectorN( tmKm[0], tmpMag_Bc_MeaAB, pMag->Mag_Bb_MeaZH, 3, 3 ); pMag->MagIn_Valid[2] = POSE_OK; } else { pMag->MagIn_Valid[2] = POSE_NO; } } } /*********************************************** 说明:获取飞轮数据 ***********************************************/ void Whl_DataGet(void) { UINT8 sum= 0; UINT32 i = 0; UINT32 j = 0; UINT16 tmpU16=0; INT16 tmpI16=0; UINT8 tmpWhlHEAD = 0; UINT8 tmpWhlHEADP = 0; UINT8 tmpWhlHEADID[4]={0}; UINT16 tmpWhlEnd = 0; sDevInfo * tmpDevInfo = NULL; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; WhlPara_t *PWhl = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt) || (NULL==tmpConst)) { return; } PWhl = &tmpAtt->sPerPara.WhlPara; tmpWhlHEADID[0] = tmpConst->Whl_ID[0]; tmpWhlHEADID[1] = tmpConst->Whl_ID[1]; tmpWhlHEADID[2] = tmpConst->Whl_ID[2]; tmpWhlHEADID[3] = tmpConst->Whl_ID[3]; //记录数据 memcpy(PWhl->Whl_RatePre,PWhl->Whl_Rate,4*sizeof(TYPE_CAL)); memcpy(PWhl->Whl_TimePRE,PWhl->Whl_Time,4*sizeof(UINT32)); for (i = 0; i < (WHEEL_NUM); ++i) { tmpDevInfo = GETDEVINFO(i+ DEV_NO_UART8) ; tmpWhlHEAD = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]; tmpWhlHEADP = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+1]; tmpWhlEnd = (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+32]<<8)|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+33]; /*飞轮数据更新*/ if (INFO_SIG_CHANGE == tmpDevInfo->cDevYCBuffer[0]) { sum = 0; for(j = 2; j < WHL_DATA_LEN -1; j++) {sum += tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF +j];} sum = 0xFF - sum; if((WHL_DATA_END != tmpWhlEnd)||(WHL_CMD_CODE_REQ!=tmpWhlHEADP)||(tmpWhlHEADID[i]!=tmpWhlHEAD)) { PWhl->WhlIn_Valid[i] = POSE_NO; PWhl->WhlIn_DataSta[i] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 1, 1 ); /* errNo=0,飞轮包头|包长错误 */ } else { if (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+ WHL_DATA_LEN -1]!=sum) { PWhl->WhlIn_Valid[i] = POSE_NO; PWhl->WhlIn_DataSta[i] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 2, 1 ); /* errNo=0,飞轮包头|包长错误 */ } else { PWhl->Whl_Time[i]=DoGetInt32From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF +2])); tmpI16 = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+22]<<8|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+23]; tmpU16 = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+24]<<8|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+25]; PWhl->Whl_Rate[i] = DoGetFloatFrom8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+10]))*RADS2RPM; PWhl->Whl_Current[i] = tmpI16; PWhl->Whl_Tmper[i] = 0.4863 * (TYPE_CAL)(tmpU16) - 273.15 ; PWhl->WhlIn_Valid[i] = POSE_OK; } } } else { PWhl->WhlIn_Valid[i] = POSE_NO; PWhl->WhlIn_DataSta[i] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 0, 1 ); /* errNo=0,飞轮转速不更新 */ } } } /*********************************************** 说明:飞轮数据处理 ***********************************************/ void Whl_DataPre(void) { UINT8 i = 0; sAttPriData *tmpAtt = NULL; WhlPara_t *PWhl = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL == tmpAtt) { return; } PWhl = &tmpAtt->sPerPara.WhlPara; for (i = 0; i < WHEEL_NUM; ++i) { if (POSE_OK == PWhl->WhlIn_Valid[i]) { if (POSE_ABSF( PWhl->Whl_Rate[i]- PWhl->Whl_RatePre[i] ) > 100*RADS2RPM) //200t230 { PWhl->WhlIn_DataSta[i] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 4, 1 ); PWhl->WhlIn_Valid[i] = POSE_NO; } else { PWhl->WhlIn_Valid[i] = POSE_OK; } } } } /*********************************************** 说明:霍尔电推数据处理 ***********************************************/ void PPU_DataPre(void) { UINT16 tmpPPUHEAD = 0; UINT8 tmpPPSUM = 0; UINT8 sum = 0; UINT8 i = 0; UINT32 TempSatTime[2] ={0,0}; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; sDevInfo * tmpDevInfo = NULL; PPUPara_t *PPPU = NULL; sAttOrbitCtlInfo_t *pOrb = NULL; sAttModPara_t *pWMod= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt) || (NULL==tmpConst)) { return; } pWMod=&tmpAtt->sModePara; PPPU = &tmpAtt->sPerPara.PPUPara; pOrb=&tmpAtt->sOrbitInp; tmpDevInfo = GETDEVINFO(DEV_NO_CAN0) ; tmpPPUHEAD = (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]<<8)|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+1]; tmpPPSUM = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF + PPU_CMD_LEN +1]; /*获取星上时*/ GetTime(TempSatTime); /*PPU单机数据更新判断*/ if(INFO_SIG_CHANGE == tmpDevInfo->cDevYCBuffer[0]) { for(i = 0; i < PPU_CMD_LEN+1 ; i++) {sum += tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF +i];} /*PPU数据有效判断*/ if((PPU_CMD_LEN == tmpPPUHEAD )&&(sum == tmpPPSUM)) { /*PPU数据有效更新上一拍、当前拍的请求计数(单机包中返回请求计数)*/ PPPU->PPUIn_ReCntPre = PPPU->PPUIn_ReCnt; PPPU->PPUIn_ReCnt= tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+3]; /*PPU数据上一拍、当前拍数据 不更新,则PPU数据无效 ????*/ if (PPPU->PPUIn_ReCntPre == PPPU->PPUIn_ReCnt) { PPPU->PPUIn_Valid = POSE_NO; PPPU->PPUIn_DataSta = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 2, 1 ); } else { /*PPU数据上一拍、当前拍数据更新,则PPU数据有效*/ PPPU->PPUIn_AVoltage=tmpConst->AttCmdFlashPara.PPUPVK *DoGetInt16From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+15])) + tmpConst->AttCmdFlashPara.PPUPVB; //推进阳极电源电压 PPPU->PPUIn_ACurrent=tmpConst->AttCmdFlashPara.PPUPAK *DoGetInt16From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+17])) + tmpConst->AttCmdFlashPara.PPUPAB; //推进阳极电源电流 /*跟新上一拍、当前拍的点火标志(单机数据包中的点火标志)*/ PPPU->PPUIn_FIREOKPre = PPPU->PPUIn_FIREOK; PPPU->PPUIn_FIREOK = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+24]; //点火成功标志 PPPU->PPUIn_Valid = POSE_OK; } } else { /*PPU数据校验不通过,设置PPU数据无效*/ PPPU->PPUIn_Valid = POSE_NO; PPPU->PPUIn_DataSta = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 1, 1 ); ///*PPU数据校验不通过,设置上一拍、当前拍点火成功标志 为 未点火*/ //PPPU->PPUIn_FIREOKPre = 0x00; // ///*因PPU单机数据校验不通过,如果上一拍的点火成功,当前拍点火标志清零认为点火结束???,记录点火结束时间*/ //if(0x01 == PPPU->PPUIn_FIREOK) //PPPU->PPUT_FIR_EndLast = TempSatTime[0]; // //PPPU->PPUIn_FIREOK = 0x00; // //return; } } else { /*PPU单机数据不更新,设置PPU数据无效*/ PPPU->PPUIn_Valid = POSE_NO; PPPU->PPUIn_DataSta = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 0, 1 ); ///*PPU数据校验不通过,设置上一拍、当前拍点火成功标志 为 未点火*/ //PPPU->PPUIn_FIREOKPre = 0x00; // ///*因PPU单机数据未更新,如果上一拍的点火成功,当前拍点火标志清零认为点火结束???,记录点火结束时间*/ //if(0x01 == PPPU->PPUIn_FIREOK) //PPPU->PPUT_FIR_EndLast = TempSatTime[0]; // //PPPU->PPUIn_FIREOK = 0x00; // //return; } /*PPU点火成功 总次数 不清除 一直记录*/ if(0x01 == PPPU->PPUIn_FIREOK) { if (PPPU->PPUT_FIR_Sum< 0xFFFFFFFE) { PPPU->PPUT_FIR_Sum++ ; } else { PPPU->PPUT_FIR_Sum= 0; } } /*PPU从 点火 到 未点火,数据记录*/ if ((0x01 == PPPU->PPUIn_FIREOKPre)&&(0x01 != PPPU->PPUIn_FIREOK)) { if(PPPU->PPUT_FIR_Cnt>0) PPPU->PPUT_FIR_Cnt--; } /*PPU从未点火 到 点火,数据记录*/ if ((0x01 != PPPU->PPUIn_FIREOKPre)&&(0x01 == PPPU->PPUIn_FIREOK)) { //if(PPPU->PPUT_FIR_Cnt>0) //PPPU->PPUT_FIR_Cnt--; if(PPPU->PPUT_FIR_SumCnt < 60000) { PPPU->PPUT_FIR_SumCnt++; } else { PPPU->PPUT_FIR_SumCnt = 0; } if((pOrb->CurOrbCtrlPcak_ID >= 0) &&(pOrb->CurOrbCtrlPcak_ID< 50)) { PPPU->PPUT_FIR_Start[pOrb->CurOrbCtrlPcak_ID] = TempSatTime[0]; } }/*PPU从点火 到 未点火,数据记录*/ else if((0x01 == PPPU->PPUIn_FIREOKPre)&&(0x01 != PPPU->PPUIn_FIREOK)) { tmpConst->AttCmdFlashPara.PPUT_FIR_EndLast = TempSatTime[0] ; pWMod->ATTFlashSwitch = POSE_OK; if(((pOrb->CurOrbCtrlPcak_ID >= 1) &&(pOrb->CurOrbCtrlPcak_ID <= 50))) { PPPU->PPUT_FIR_End[pOrb->CurOrbCtrlPcak_ID - 1] = TempSatTime[0]; } else if(0==pOrb->CurOrbCtrlPcak_ID) { if((PPPU->PPUT_FIR_CntS >= 1) &&(PPPU->PPUT_FIR_CntS <= 50)) { PPPU->PPUT_FIR_End[PPPU->PPUT_FIR_CntS - 1] = TempSatTime[0]; PPPU->PPUT_FIR_CntS =0; } } } else {;} /*不做处理*/ } /*********************************************** 说明:星敏互校验 ***********************************************/ void SSABC_CC(void) { UINT8 i=0; UINT8 tmpCheckCnt=0; TYPE_CAL tmpLb[3][3] ={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}}; TYPE_CAL tmpLi[3][3] ={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}}; TYPE_CAL tmpRbs[3][9]={ {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, }; TYPE_CAL tmpAab_b = 0.0; TYPE_CAL tmpAbc_b = 0.0; TYPE_CAL tmpAac_b = 0.0; TYPE_CAL tmpAab_i = 0.0; TYPE_CAL tmpAbc_i= 0.0; TYPE_CAL tmpAac_i= 0.0; TYPE_CAL tmpRsi[3][9]={ {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, }; TYPE_CAL tmpRis[3][9]={ {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, }; UINT8 Valid[3]={0}; UINT8 ssA_CCFlg=0; UINT8 ssB_CCFlg=0; UINT8 ssC_CCFlg=0; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; SsPara_t *ssA = NULL; SsPara_t *ssB = NULL; SsPara_t *ssC = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt) ||( NULL==tmpConst)) { return; } ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; Valid[0]=ssA->ssIn_AttVld; Valid[1]=ssB->ssIn_AttVld; Valid[2]=ssC->ssIn_AttVld; memcpy(tmpRbs[0], &(tmpConst->AttCmdFlashPara.M_SSA[0][0]), 9 * sizeof(TYPE_CAL)); memcpy(tmpRbs[1], &(tmpConst->AttCmdFlashPara.M_SSB[0][0]), 9 * sizeof(TYPE_CAL)); memcpy(tmpRbs[2], &(tmpConst->AttCmdFlashPara.M_SSC[0][0]), 9 * sizeof(TYPE_CAL)); //计算星敏本体系光轴矢量 for(i=0;i<3;i++) { tmpLb[i][0]=tmpRbs[i][2]; tmpLb[i][1]=tmpRbs[i][5]; tmpLb[i][2]=tmpRbs[i][8]; } //计算星敏本体系光轴矢量夹角 CalVecArc(tmpLb[0], tmpLb[1], &tmpAab_b); CalVecArc(tmpLb[0], tmpLb[2], &tmpAac_b); CalVecArc(tmpLb[1], tmpLb[2], &tmpAbc_b); //计算惯性系光轴矢量 Q2Att(ssA->ssIn_Q, tmpRsi[0]); Q2Att(ssB->ssIn_Q, tmpRsi[1]); Q2Att(ssC->ssIn_Q, tmpRsi[2]); for(i=0;i<3;i++) { MatrixTransposeHL(tmpRsi[i], tmpRis[i],3, 3); tmpLi[i][0]=tmpRis[i][2]; tmpLi[i][1]=tmpRis[i][5]; tmpLi[i][2]=tmpRis[i][8]; } //计算惯性系光轴矢量夹角 CalVecArc(tmpLi[0], tmpLi[1], &tmpAab_i); CalVecArc(tmpLi[0], tmpLi[2], &tmpAac_i); CalVecArc(tmpLi[1], tmpLi[2], &tmpAbc_i); if (0x55 == Valid[0]) { ssA_CCFlg=CC_UNCERTAIN; } else { ssA_CCFlg=NO_CC; } if (0x55 == Valid[1]) { ssB_CCFlg=CC_UNCERTAIN; } else { ssB_CCFlg=NO_CC; } if (0x55 == Valid[2]) { ssC_CCFlg=CC_UNCERTAIN; } else { ssC_CCFlg=NO_CC; } if((0x55 == Valid[0])&&(0x55 == Valid[1])) { if(POSE_ABSF(tmpAab_i-tmpAab_b)<(tmpConst->SS_SS_CThr)) { ssA_CCFlg=CC_CORRECT; ssB_CCFlg=CC_CORRECT; tmpCheckCnt++; } } if((0x55 == Valid[0])&&(0x55 == Valid[2])) { if(POSE_ABSF(tmpAac_i-tmpAac_b)<(tmpConst->SS_SS_CThr)) { ssA_CCFlg=CC_CORRECT; ssC_CCFlg=CC_CORRECT; tmpCheckCnt++; } } if((0x55 == Valid[1])&&(0x55 == Valid[2])) { if(POSE_ABSF(tmpAbc_i-tmpAbc_b)<(tmpConst->SS_SS_CThr)) { ssB_CCFlg=CC_CORRECT; ssC_CCFlg=CC_CORRECT; tmpCheckCnt++; } } if(tmpCheckCnt>0)//存在校验正确的星敏 { if(ssA_CCFlg==CC_UNCERTAIN) ssA_CCFlg=CC_ERROR; if(ssB_CCFlg==CC_UNCERTAIN) ssB_CCFlg=CC_ERROR; if(ssC_CCFlg==CC_UNCERTAIN) ssC_CCFlg=CC_ERROR; } ssA->ssCrCheckFlg=ssA_CCFlg; ssB->ssCrCheckFlg=ssB_CCFlg; ssC->ssCrCheckFlg=ssC_CCFlg; } /*********************************************** 说明:星敏+太敏互校验 ***********************************************/ void StarSun_CC(void) { UINT8 i,tmpCheckCnt=0; UINT8 ssA_CCFlg, ssB_CCFlg, ssC_CCFlg, Sun_CCFlg; TYPE_CAL tmpRbi[3][9]; TYPE_CAL tmpSb[3][3]; TYPE_CAL tmpAam,tmpAbm,tmpAcm; sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; SsPara_t *ssA, *ssB, *ssC; AssPara_t *pASS; sAttOrbitGetPara_t *pOrbit = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; pASS=&tmpAtt->sPerPara.AssPara; pOrbit = &tmpAtt->sOrbitPara; //校验条件判断(这里应该不判断也可) if((CC_CORRECT == ssA->ssCrCheckFlg)||(CC_CORRECT == ssB->ssCrCheckFlg)||(CC_CORRECT == ssC->ssCrCheckFlg)) return; if(0x00 == pASS->Ass_SunVecVld) return; if((0x00 == ssA->ssIn_AttVld)&&(0x00 == ssB->ssIn_AttVld)&&(0x00 == ssC->ssIn_AttVld)) return; if(POSE_NO == pOrbit->MJCLv) { return; } ssA_CCFlg=CC_UNCERTAIN; ssB_CCFlg=CC_UNCERTAIN; ssC_CCFlg=CC_UNCERTAIN; Sun_CCFlg=CC_UNCERTAIN; //计算本体系太阳矢量 Q2Att(ssA->ssExpose_Qbi, tmpRbi[0]); Q2Att(ssB->ssExpose_Qbi, tmpRbi[1]); Q2Att(ssC->ssExpose_Qbi, tmpRbi[2]); for(i=0;i<3;i++) MatrixProductHL(tmpRbi[i], tmpAtt->sEnvPara.SunVecI, tmpSb[i], 3, 3, 1); //计算本体系下星敏太阳矢量和太敏太阳矢量夹角 CalVecArc(tmpSb[0], pASS->Ass_SunVecb, &tmpAam); CalVecArc(tmpSb[1], pASS->Ass_SunVecb, &tmpAbm); CalVecArc(tmpSb[2], pASS->Ass_SunVecb, &tmpAcm); if((0x55 == ssA->ssIn_AttVld)&&(tmpAamSS_ASS_CCThr)) { ssA_CCFlg=CC_CORRECT; Sun_CCFlg=CC_CORRECT; tmpCheckCnt++; } if((0x55 == ssB->ssIn_AttVld)&&(tmpAbmSS_ASS_CCThr)) { ssB_CCFlg=CC_CORRECT; Sun_CCFlg=CC_CORRECT; tmpCheckCnt++; } if((0x55 == ssC->ssIn_AttVld)&&(tmpAcmSS_ASS_CCThr)) { ssC_CCFlg=CC_CORRECT; Sun_CCFlg=CC_CORRECT; tmpCheckCnt++; } if(tmpCheckCnt>0) { if(ssA_CCFlg==CC_UNCERTAIN) ssA_CCFlg=CC_ERROR; if(ssB_CCFlg==CC_UNCERTAIN) ssB_CCFlg=CC_ERROR; if(ssC_CCFlg==CC_UNCERTAIN) ssC_CCFlg=CC_ERROR; } else Sun_CCFlg=CC_UNCERTAIN; ssA->ssCrCheckFlg=ssA_CCFlg; ssB->ssCrCheckFlg=ssB_CCFlg; ssC->ssCrCheckFlg=ssC_CCFlg; pASS->AssCrCheckFlg=Sun_CCFlg; } /*********************************************** 说明:星敏校太敏 ***********************************************/ void StarCheckSun(void) { TYPE_CAL tmpQbi[4]; TYPE_CAL tmpRbi[9]; TYPE_CAL tmpSb[3]; TYPE_CAL tmpAsm; sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; SsPara_t *ssA, *ssB, *ssC; AssPara_t *pASS; sAttOrbitGetPara_t *pOrbit = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; pASS=&tmpAtt->sPerPara.AssPara; pOrbit = &tmpAtt->sOrbitPara; if((0x00 == pASS->Ass_SunVecVld)||(POSE_NO == pOrbit->MJCLv)) { pASS->AssCrCheckFlg=NO_CC; return; } //利用星敏计算本体系太阳矢量 if(CC_CORRECT == ssA->ssCrCheckFlg) { memcpy(tmpQbi, ssA->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else if(CC_CORRECT == ssB->ssCrCheckFlg) { memcpy(tmpQbi, ssB->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else if(CC_CORRECT == ssC->ssCrCheckFlg) { memcpy(tmpQbi, ssC->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else { return; } Q2Att(tmpQbi, tmpRbi); MatrixProductHL(tmpRbi, tmpAtt->sEnvPara.SunVecI, tmpSb, 3, 3, 1); //判断夹角 CalVecArc(tmpSb, pASS->Ass_SunVecb, &tmpAsm); if(tmpAsmSS_ASS_CThr) pASS->AssCrCheckFlg=CC_CORRECT; else pASS->AssCrCheckFlg=CC_ERROR; } /*********************************************** 说明:星敏校陀螺 因为进入的条件是必有正常星敏,那么该星敏一定校验为1且角速度有效,该子函数中不再进行判断 ***********************************************/ void StarCheckGyro(void) { UINT8 i, j; TYPE_CAL deltaA[GYRO_NUM][3];//三轴角速度偏差 sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; SsPara_t *ssA, *ssB, *ssC; GyroPara_t *pGyro[3]; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; pGyro[0]=&tmpAtt->sPerPara.GyroPara[0]; pGyro[1]=&tmpAtt->sPerPara.GyroPara[1]; pGyro[2]=&tmpAtt->sPerPara.GyroPara[2]; //校陀螺 if(CC_CORRECT ==ssA->ssCrCheckFlg) { for(i=0;iGyro_Wi[j]-ssA->ssExpose_Wbi[j]); } } } else if(CC_CORRECT ==ssB->ssCrCheckFlg) { for(i=0;iGyro_Wi[j]-ssB->ssExpose_Wbi[j]); } } } else if(CC_CORRECT ==ssC->ssCrCheckFlg) { for(i=0;iGyro_Wi[j]-ssC->ssExpose_Wbi[j]); } } } else { return; } for(i=0;iGyroIn_AttVld) pGyro[i]->GyroCrCheckFlg=NO_CC; else if((deltaA[i][0]SS_GYRO_CThr)&&(deltaA[i][1]SS_GYRO_CThr)&&(deltaA[i][2]SS_GYRO_CThr)) pGyro[i]->GyroCrCheckFlg=CC_CORRECT; else pGyro[i]->GyroCrCheckFlg=CC_ERROR; } } /*********************************************** 说明:星敏校磁强计 ***********************************************/ void StarCheckMag(void) { UINT8 i; TYPE_CAL deltaA[MAG_NUM]; TYPE_CAL tmpQbi[4]; TYPE_CAL tmpRbi[9]; TYPE_CAL tmpSb[3]; sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; SsPara_t *ssA, *ssB, *ssC; MagPara_t *pMag; sAttEnvPara_t *pEnv; sAttOrbitGetPara_t *pObtIn; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; pObtIn = &tmpAtt->sOrbitPara; ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; pMag=&tmpAtt->sPerPara.MagPara; pEnv=&tmpAtt->sEnvPara; if(0x00 == pObtIn->OrbitVld) { pMag->MagCrCheckFlg[0]=NO_CC; pMag->MagCrCheckFlg[1]=NO_CC; return; } //利用星敏计算本体系太阳矢量 if(CC_CORRECT == ssA->ssCrCheckFlg) { memcpy(tmpQbi, ssA->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else if(CC_CORRECT == ssB->ssCrCheckFlg) { memcpy(tmpQbi, ssB->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else if(CC_CORRECT == ssC->ssCrCheckFlg) { memcpy(tmpQbi, ssC->ssExpose_Qbi, 4 * sizeof(TYPE_CAL)); } else { return; } Q2Att(tmpQbi, tmpRbi); MatrixProductHL(tmpRbi, pEnv->fvBi, tmpSb, 3, 3, 1); //校磁强计 for(i=0;iMagIn_Valid[i]) { CalVecArc(tmpSb, pMag->Mag_Bb_MeaAB[i], &deltaA[i]); if(deltaA[i]AttCmdFlashPara.SS_MAG_CThr) { pMag->MagCrCheckFlg[i]=CC_CORRECT; } else { pMag->MagCrCheckFlg[i]=CC_ERROR; } } else { pMag->MagCrCheckFlg[i]=NO_CC; } } } /*********************************************** 说明:陀螺互校验 ***********************************************/ void Gyro_CC(void) { UINT8 i=0; UINT8 Valid[3]; UINT8 tmpCnt = 0; sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; GyroPara_t *pGyro[3]; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; pGyro[0]=&tmpAtt->sPerPara.GyroPara[0]; pGyro[1]=&tmpAtt->sPerPara.GyroPara[1]; pGyro[2]=&tmpAtt->sPerPara.GyroPara[2]; for(i=0;iGyroCrCheckFlg=NO_CC; Valid[i]=pGyro[i]->GyroIn_AttVld; if (0x55 == Valid[i]) { pGyro[i]->GyroCrCheckFlg=CC_UNCERTAIN; } } if((0x55 == Valid[0])&&(0x55 ==Valid[1])) { if((POSE_ABSF(pGyro[0]->Gyro_Wi[0]-pGyro[1]->Gyro_Wi[0])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[0]->Gyro_Wi[1]-pGyro[1]->Gyro_Wi[1])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[0]->Gyro_Wi[2]-pGyro[1]->Gyro_Wi[2])GYRO_GYRO_CThr) ) { pGyro[0]->GyroCrCheckFlg=CC_CORRECT; pGyro[1]->GyroCrCheckFlg=CC_CORRECT; tmpCnt++; } else { ;/*不做处理*/ } } if((0x55 == Valid[0])&&(0x55 == Valid[2])) { if((POSE_ABSF(pGyro[0]->Gyro_Wi[0]-pGyro[2]->Gyro_Wi[0])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[0]->Gyro_Wi[1]-pGyro[2]->Gyro_Wi[1])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[0]->Gyro_Wi[2]-pGyro[2]->Gyro_Wi[2])GYRO_GYRO_CThr) ) { pGyro[0]->GyroCrCheckFlg=CC_CORRECT; pGyro[2]->GyroCrCheckFlg=CC_CORRECT; tmpCnt++; } else { ;/*不做处理*/ } } if((0x55 == Valid[1])&&(0x55 == Valid[2])) { if((POSE_ABSF(pGyro[1]->Gyro_Wi[0]-pGyro[2]->Gyro_Wi[0])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[1]->Gyro_Wi[1]-pGyro[2]->Gyro_Wi[1])GYRO_GYRO_CThr) &&(POSE_ABSF(pGyro[1]->Gyro_Wi[2]-pGyro[2]->Gyro_Wi[2])GYRO_GYRO_CThr) ) { pGyro[1]->GyroCrCheckFlg=CC_CORRECT; pGyro[2]->GyroCrCheckFlg=CC_CORRECT; tmpCnt++; } else { ;/*不做处理*/ } } for(i=0; i<3; i++) { if((NO_CC == pGyro[i]->GyroCrCheckFlg) ||(CC_CORRECT == pGyro[i]->GyroCrCheckFlg) ) continue; if(tmpCnt > 0) pGyro[i]->GyroCrCheckFlg = CC_ERROR; } } /*********************************************** 说明:磁强计互校验 ***********************************************/ void Mag_CC(void) { UINT8 i; TYPE_CAL deltaA[3]; sAttPriData *tmpAtt; AttCtrlConst_t *tmpConst; MagPara_t *pMag; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL==tmpAtt || NULL==tmpConst) return; pMag=&tmpAtt->sPerPara.MagPara; if((POSE_OK == pMag->MagIn_Valid[0])&&(POSE_OK ==pMag->MagIn_Valid[1])) { for(i=0;i<3;i++) { deltaA[i]=POSE_ABSF(pMag->Mag_Bb_MeaAB[0][i]-pMag->Mag_Bb_MeaAB[1][i]); } if((deltaA[0]MAG_MAG_CThr)&&(deltaA[1]MAG_MAG_CThr)&&(deltaA[2]MAG_MAG_CThr)) { pMag->MagCrCheckFlg[0]=CC_CORRECT; pMag->MagCrCheckFlg[1]=CC_CORRECT; } else { pMag->MagCrCheckFlg[0]=CC_UNCERTAIN; pMag->MagCrCheckFlg[1]=CC_UNCERTAIN; } } else { pMag->MagCrCheckFlg[0]=NO_CC; pMag->MagCrCheckFlg[1]=NO_CC; } } /*********************************************** 说明:单机互校验 ***********************************************/ void Att_CrossCheck(void) { UINT8 tmpValidSum; sAttPriData *tmpAtt; SsPara_t *ssA, *ssB, *ssC; AssPara_t *pASS; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL ==tmpAtt) return; ssA=&tmpAtt->sPerPara.SsPara[0]; ssB=&tmpAtt->sPerPara.SsPara[1]; ssC=&tmpAtt->sPerPara.SsPara[2]; pASS=&tmpAtt->sPerPara.AssPara; tmpValidSum=ssA->ssIn_AttVld+ssB->ssIn_AttVld+ssC->ssIn_AttVld; if((0xAA ==tmpValidSum)||(0xFF ==tmpValidSum))//2或3个星敏有效 { SSABC_CC();//2、3个星敏间互校验 if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT ==ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏 { StarCheckSun();//正常星敏校太敏 StarCheckGyro();//正常星敏校陀螺 StarCheckMag();//正常星敏校磁强计 } else { if(0x55 == pASS->Ass_SunVecVld)//太敏有效 { StarSun_CC();//星敏太敏互校验 if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT ==ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏 { StarCheckGyro();//正常星敏校陀螺 StarCheckMag();//正常星敏校磁强计 } else { Gyro_CC(); Mag_CC(); } } else { Gyro_CC(); Mag_CC(); } } } else if(0x55 ==tmpValidSum)//单星敏有效 { if(0x55 ==pASS->Ass_SunVecVld)//太敏有效 { StarSun_CC();//星敏太敏互校验 if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT == ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏 { StarCheckGyro();//正常星敏校陀螺 StarCheckMag();//正常星敏校磁强计 } else { Gyro_CC(); Mag_CC(); } } else { Gyro_CC(); Mag_CC(); } } else if(0 ==tmpValidSum)//没有有效星敏 { Gyro_CC(); Mag_CC(); } } /************************************************ 说明:数据预处理模块每周期调用操作 输入: 输出: ************************************************/ void ZKDPAction(void) { AttCtrlConst_t *tmpConst; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL == tmpConst) return; //初始化 ZKDPInit(); //星敏 Ss_DataGet(); Ss_DataPre(); //陀螺 Gyro_DataGet(); Gyro_DataPre(); //模拟太敏 Ass_DataGet(); Ass_DataPre(); //磁强计 Mag_DataGet(); Mag_DataPre(); //飞轮 Whl_DataGet(); Whl_DataPre(); #ifndef MINMODULE_TYPE //电推 PPU_DataPre(); //互校验 if (tmpConst->Allow_Sensor_CThr == 0x55 ) { Att_CrossCheck(); } #endif }