/* * Created: 2022/11/4 11:02:40 * Author: wangzk zhengmengxing */ #include "..\PrjCommon\CommonDef.h" #include "..\PrjCommon\DevDefine.h" #include "..\PrjTelCtrlMng\TelCtrlMng.h" #include "AttMath.h" #include "AttCtrlMain.h" /******************************************************* 说明:指令分配数据初始化 *******************************************************/ void ZKCtrlCmdInit(void) { UINT8 i = 0x00; sAttPriData *tmpAtt = NULL ; AttCmdDsp_t *pCmdDsp = NULL; MtPara_t *pMt = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL ==tmpAtt) return; pCmdDsp = &tmpAtt->sCmdDspPara; pMt=&tmpAtt->sPerPara.MtPara; //飞轮 pCmdDsp->WheelD_MomOfForce_Cmd = 0; pCmdDsp->WheelD_RotatSpd_Cmd = 0; memset(pCmdDsp->Wheel_TwcCmd, 0, 3*sizeof(TYPE_CAL)); memset(pCmdDsp->Wheel_LJCmd, 0, 4*sizeof(TYPE_CAL)); memset(pCmdDsp->Whl_Torque, 0, 4*sizeof(TYPE_CAL)); //磁力矩器 for (i = 0; i < MT_NUM; i++) { pMt->MTOnOff[i] = MT_OFF; pMt->MTCtrlOutP0[i] = 0.0; pMt->MTDirect[i] =MT_DIRECT_POS; } } /*********************************************** 说明:PPU开关机处理 输入: 开关状态 0x55:电推开机,0xAA:电推关机;其他:无操作 输出: ***********************************************/ //void ZKDev_PPU_OnOffProcess(UINT8 OnState) //{ //sAttPriData *tmpAtt = NULL; //UINT8 PPUOff[8] = {0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // //tmpAtt = (sAttPriData *)ATTCLT_DATA1_ADDR; // //if((NULL == tmpAtt) || ((0x55 != (OnState)) && (0xAA != (OnState)))) //return; // //if (0xAA == (OnState))/*电推关机*/ //{ ///*当前拍的关动作*/ //dev_can_write(DEV_NO_CAN0,PPUOff,8); ///*下一拍的关动作标志*/ //tmpAtt->sErrCtlPara.AttPPUOffReq = POSE_OK; //} ////else if (0x55 == (OnState))/*电推开机*/ ////{ /////*当前拍的开动作*/ ////OCOut(OC68_PPU_ON, 0, 16); /////*下一拍的关动作标志*/ ////tmpAtt->sErrCtlPara.AttPPUOnReq = POSE_OK; ////} // //} ///*********************************************** //说明:轨道控制模块,轨控主函数. //输入:上注轨控数据,当前模式 //输出:PPU开关 //***********************************************/ void ZKPPUCmdDsp(void) { // UINT8 PPUOn[8] = {0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; UINT8 PPUOff[8] = {0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; UINT32 SatTime[2] ={0,0}; UINT8 cmdDataBuff[50] = {0}; sTaskInfo* tmpTaskInfo = NULL; sAttPriData *tmpAtt = NULL; PPUPara_t *PPPU = NULL; sAttModPara_t *pMod = NULL; AttIMPTPara_t *pImpt = NULL; sAttOrbitCtlInfo_t *pOrb =NULL; AttCtrlConst_t *tmpConst= NULL; sAttErrCtlPara_t *pREcheck= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL ==tmpAtt|| NULL ==tmpConst) return; PPPU = &tmpAtt->sPerPara.PPUPara; pMod = &tmpAtt->sModePara; pImpt= &tmpAtt->sIMPTPara; pOrb=&tmpAtt->sOrbitInp; pREcheck=&tmpAtt->sErrCtlPara; tmpTaskInfo = GetTaskInfoBT(TASK_ATTCTL); memset(cmdDataBuff, 0x00, 50); GetTime(SatTime); //获取当前星上时 //if((ATTMOD_ATTAJUSTPRE == pMod->WorkMode) || (ATTMOD_ORBITCTL == pMod->WorkMode))/*轨控期间*/ if(ATTMOD_ORBITCTL == pMod->WorkMode)/*轨控期间*/ { if (pImpt->PPUUseStatus == POSE_NO)/*电推进状态为不可用*/ { //DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff); pREcheck->PPU_Diag = POSE_NO; DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff); pOrb->CurOrbCtrlPcak_ID = 0; pOrb->CurOrbCtrlPcak_PreID =0xFF; pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00; PPPU->PPUT_FIR_Cnt = 0; pOrb->OrbDataIn_OK = POSE_NO; if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST)) { /* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/ BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE); } /*轨控异常,当前拍的关PPU动作*/ dev_can_write(DEV_NO_CAN0, PPUOff, 8); PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/ tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO; /*2.5S后关PPU电源*/ PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK; PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0; PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO; PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0; return ; } } if(POSE_OK == pOrb->OrbDataIn_OK) { /*判断当前时间,是否在轨控时间段内*/ if (((SatTime[0]>=(pOrb->OrbCtrlPackCur.OrbCtrl_StartTime+30)) && (SatTime[0]<= (pOrb->OrbCtrlPackCur.OrbCtrl_StartTime + pOrb->OrbCtrlPackCur.OrbCtrl_TimeLength-30)) )) { if (ATTMOD_ORBITCTL != pMod->WorkMode) { /*不在的话退出*/ //DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff); pOrb->CurOrbCtrlPcak_ID = 0; pOrb->CurOrbCtrlPcak_PreID =0xFF; pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00; PPPU->PPUT_FIR_Cnt = 0; pOrb->OrbDataIn_OK = POSE_NO; //if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST)) //{ ///* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/ //BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE); //} /*轨控异常,当前拍的关PPU动作*/ dev_can_write(DEV_NO_CAN0, PPUOff, 8); PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/ tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO; /*2.5S后关PPU电源*/ PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK; PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0; PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO; PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0; return; } //if ((0x01 == PPPU->PPUIn_FIREOKPre)&&(0x01 != PPPU->PPUIn_FIREOK)) //{ ////if ((POSE_NO==tmpConst->WorkModeChangeAuto)||(POSE_OK == tmpAtt->sCtlPara.ZK_Ctrl_Reserver111)) ////{ ///*不在的话退出*/ //DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff); //pOrb->CurOrbCtrlPcak_ID = 0; //pOrb->CurOrbCtrlPcak_PreID =0xFF; //pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00; //PPPU->PPUT_FIR_Cnt = 0; //pOrb->OrbDataIn_OK = POSE_NO; //if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST)) //{ ///* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/ //BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE); //} // ///*轨控异常,当前拍的关PPU动作*/ //dev_can_write(DEV_NO_CAN0, PPUOff, 8); //PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/ //tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO; ///*2.5S后关PPU电源*/ //PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK; //PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0; // //PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO; //PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0; //return; ////} ////else if (POSE_OK==tmpConst->WorkModeChangeAuto) ////{ /////*轨控异常,当前拍的关PPU动作*/ ////dev_can_write(DEV_NO_CAN0, PPUOff, 8); ////PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/ ////tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO; /////*2.5S后关PPU电源*/ ////PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK; ////PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0; //// ////PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_IN; ////PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0; ////return; ////} ////else ////{ ////; ////} //} } } if((POSE_OK == pOrb->OrbDataIn_OK) && (ATTMOD_ORBITCTL == pMod->WorkMode)) { /*判断当前时间,是否在轨控时间段内*/ if (!( (SatTime[0]>=(pOrb->OrbCtrlPackCur.OrbCtrl_StartTime-2)) && (SatTime[0]<= (pOrb->OrbCtrlPackCur.OrbCtrl_StartTime + pOrb->OrbCtrlPackCur.OrbCtrl_TimeLength+2)) )) { /*不在的话退出*/ DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff); pOrb->CurOrbCtrlPcak_ID = 0; pOrb->CurOrbCtrlPcak_PreID =0xFF; pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00; PPPU->PPUT_FIR_Cnt = 0; pOrb->OrbDataIn_OK = POSE_NO; if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST)) { /* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/ BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE); } /*轨控异常,当前拍的关PPU动作*/ dev_can_write(DEV_NO_CAN0, PPUOff, 8); PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/ tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO; /*2.5S后关PPU电源*/ PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK; PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0; PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO; PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0; return; } } } /******************************************************* 说明:发送飞轮指令 输入:ID 飞轮转速(RPM) 飞轮模式 输出: *******************************************************/ void SetWheel(UINT8 WheelId, TYPE_CAL Value, UINT8 CmdType) { UINT8 i = 0; UINT8 sum = 0; UINT16 tmpLen = 0 ; UINT16 WhlLen = 8; INT16 tmpI =0 ; UINT8 tmpWhl_order[8] = {0X01,WHL_CMD_CODE_RATE,0xFF,0x0,0x0,0x0,0x0,0x0}; //飞轮控制指令组包 sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; sAttDataPrePara_t *pData = NULL; AttCmdDsp_t *pCmdDsp = NULL; sDevInfo * tmpDevInfo = NULL; WhlPara_t *PWhl = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL ==tmpAtt) || (NULL ==tmpConst)) return; pData = &tmpAtt->sPerPara; pCmdDsp = &tmpAtt->sCmdDspPara; tmpDevInfo = GETDEVINFO(DEV_NO_UART8 + WheelId - 1); PWhl = &tmpAtt->sPerPara.WhlPara; tmpWhl_order[0] = tmpConst->Whl_ID[WheelId -1]; if (WHL_CMD_CODE_RATE == CmdType) /* 转速指令 */ { Value = Value * RPM2RADS; DoSetFloatTo8(Value,tmpWhl_order+3); sum = 0; for(i = 0; i < 7; i++) {sum += tmpWhl_order[i];} sum = 0xFF - sum; tmpWhl_order[7]= sum; tmpLen = UartWrite(tmpDevInfo->iConNO, tmpWhl_order, WhlLen); if(tmpLen != WhlLen)/*表示发送成功*/ { PWhl->WhlIn_DataSta[WheelId-1] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[WheelId-1], 5, 1 ); } } else if ( WHL_CMD_CODE_TRQ == CmdType ) /* 力矩指令 */ { tmpWhl_order[1]= WHL_CMD_CODE_TRQ; if (POSE_ABSF(Value) < 0.1) { DoSetFloatTo8(Value,tmpWhl_order+3); sum = 0; for(i = 0; i < 7; i++) {sum += tmpWhl_order[i];} sum = 0xFF - sum; tmpWhl_order[7]= sum; tmpLen = UartWrite(tmpDevInfo->iConNO, tmpWhl_order, WhlLen); if(tmpLen != WhlLen)/*表示发送成功*/ { PWhl->WhlIn_DataSta[WheelId-1] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[WheelId-1], 6, 1 ); } } else { PWhl->WhlIn_DataSta[WheelId-1] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[WheelId-1], 6, 1 ); } } else if ( WHL_CMD_CODE_CURR == CmdType) /* 电流指令 */ { tmpWhl_order[1]= WHL_CMD_CODE_CURR; if (POSE_ABSF(Value) < 0.1) { tmpWhl_order[3] = 0xFF; tmpWhl_order[4] = 0xFF; tmpI =(INT16)(Value / 0.036 * 1000000.0 /103.0); DoSetInt16To8(tmpI,tmpWhl_order+5); sum = 0; for(i = 0; i < 7; i++) {sum += tmpWhl_order[i];} sum = 0xFF - sum; tmpWhl_order[7]= sum; tmpLen = UartWrite(tmpDevInfo->iConNO, tmpWhl_order, WhlLen); if(tmpLen != WhlLen)/*表示发送成功*/ { PWhl->WhlIn_DataSta[WheelId-1] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[WheelId-1], 7, 1 ); } } else { PWhl->WhlIn_DataSta[WheelId-1] = ZERO_TO_ONE( PWhl->WhlIn_DataSta[WheelId-1], 7, 1 ); } } //遥测下发记录 if( WHL_CMD_CODE_TRQ== CmdType) { pCmdDsp->Wheel_LJCmd[WheelId-1]=Value; if (tmpConst->Whl_J[WheelId-1] > POSE_ZERO) { pCmdDsp->Whl_Torque[WheelId-1]= pData->WhlPara.Whl_Rate[WheelId-1] + Value * 0.5 * RADS2RPM /tmpConst->Whl_J[WheelId-1]; } } else if( WHL_CMD_CODE_RATE== CmdType) { pCmdDsp->Whl_Torque[WheelId-1]=Value * RADS2RPM ; } } /*********************************************** 说明:反作用轮指令分配 输入: 输出: 返回: ***********************************************/ void ZKWhlCmdDsp(void) { UINT8 i =0x00; UINT8 j =0x00; UINT8 tmpReversibleFlg =0x00; UINT8 UnUseWheelId =0x00;//记录下不使用的是哪个飞轮,指令发送给其他三个,1234对应ABCD TYPE_CAL tmpCu[9]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//飞轮分配矩阵 TYPE_CAL tmpCp[9]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; TYPE_CAL tmpUse = 0.0; TYPE_CAL tmpTwc[3]={0.0,0.0,0.0};//三个飞轮的控制指令 TYPE_CAL tmpTwi_Max =0.0; TYPE_CAL tmpTwc_Max =0.0; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst = NULL; sAttModPara_t *pMod = NULL; WhlPara_t *PWhl = NULL; AttIMPTPara_t *pImpt = NULL; sAttDataPrePara_t *pData = NULL; sAttCtlPara_t *pCtl = NULL; AttCmdDsp_t *pCmdDsp = NULL; sAttErrCtlPara_t *pREcheck = NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL ==tmpAtt) || (NULL ==tmpConst)) { return; } pMod =&tmpAtt->sModePara; PWhl = &tmpAtt->sPerPara.WhlPara; pImpt=&tmpAtt->sIMPTPara; pData = &tmpAtt->sPerPara; pCtl = &tmpAtt->sCtlPara; pCmdDsp = &tmpAtt->sCmdDspPara; pREcheck=&tmpAtt->sErrCtlPara; if((ATTMOD_RATEDMP == pMod->WorkMode)||(ATTMOD_MagTOSUN == pMod->WorkMode)||(ATTMOD_UNCTL == pMod->WorkMode)) { return; } pREcheck->WhlUseState = 0; for(i=0;i<4;i++) { pREcheck->WhlUseState =(pREcheck->WhlUseState |((POSE_OK == pImpt->Whl_Use[i]) << i)); } if(count_onebit(pREcheck->WhlUseState,4)<3) { return; } //计算飞轮分配矩阵tmpCp //XYZS/XYZ UnUseWheelId=0; if((0x0f ==pREcheck->WhlUseState)||(0x07 == pREcheck->WhlUseState)) { memcpy(tmpCu, &tmpConst->AttCmdFlashPara.M_Wheel[0][0], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+3, &tmpConst->AttCmdFlashPara.M_Wheel[1][0], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+6, &tmpConst->AttCmdFlashPara.M_Wheel[2][0], 3*sizeof(TYPE_CAL)); UnUseWheelId=4; } //YZS else if(0x0e == pREcheck->WhlUseState) { memcpy(tmpCu, &tmpConst->AttCmdFlashPara.M_Wheel[0][1], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+3, &tmpConst->AttCmdFlashPara.M_Wheel[1][1], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+6, &tmpConst->AttCmdFlashPara.M_Wheel[2][1], 3*sizeof(TYPE_CAL)); UnUseWheelId=1; } //XZS else if(0x0d == pREcheck->WhlUseState) { memcpy(tmpCu, &tmpConst->AttCmdFlashPara.M_Wheel[0][1], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+3, &tmpConst->AttCmdFlashPara.M_Wheel[1][1], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+6, &tmpConst->AttCmdFlashPara.M_Wheel[2][1], 3*sizeof(TYPE_CAL)); tmpCu[0]=tmpConst->AttCmdFlashPara.M_Wheel[0][0]; tmpCu[3]=tmpConst->AttCmdFlashPara.M_Wheel[1][0]; tmpCu[6]=tmpConst->AttCmdFlashPara.M_Wheel[2][0]; UnUseWheelId=2; } //XYS else if(0x0b == pREcheck->WhlUseState) { memcpy(tmpCu, &tmpConst->AttCmdFlashPara.M_Wheel[0][0], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+3, &tmpConst->AttCmdFlashPara.M_Wheel[1][0], 3*sizeof(TYPE_CAL)); memcpy(tmpCu+6, &tmpConst->AttCmdFlashPara.M_Wheel[2][0], 3*sizeof(TYPE_CAL)); tmpCu[2]=tmpConst->AttCmdFlashPara.M_Wheel[0][3]; tmpCu[5]=tmpConst->AttCmdFlashPara.M_Wheel[1][3]; tmpCu[8]=tmpConst->AttCmdFlashPara.M_Wheel[2][3]; UnUseWheelId=3; } tmpUse=1.0e-4; InvsymMatrix3(tmpCu, tmpCp, &tmpReversibleFlg, &tmpUse); if(!tmpReversibleFlg) { return; } //计算反作用轮控制指令(限幅)tmpTwc MatrixProductHL(tmpCp, pCtl->WheelCtrlResult, tmpTwc, 3, 3, 1); for(i=0;i<3;i++) { if(POSE_ABSF(tmpTwc[i])>POSE_ABSF(tmpTwc_Max)) { tmpTwi_Max=tmpTwc[i]; tmpTwc_Max=tmpTwc[i]; } } if(POSE_ABSF(tmpTwc_Max)>0.1) { if (tmpTwc_Max > 0) { tmpTwc_Max=0.1; } else { tmpTwc_Max=-0.1; } if(POSE_ABSF(tmpTwi_Max) > POSE_ZERO) { for(i=0;i<3;i++) tmpTwc[i]=tmpTwc[i]*tmpTwc_Max/tmpTwi_Max; } } memcpy(pCmdDsp->Wheel_TwcCmd,tmpTwc,3*sizeof(TYPE_CAL)); //发送飞轮指令 if(0 != UnUseWheelId) { j=0; for(i=1;i<=4;i++) { if(i!=UnUseWheelId) { if (WHL_CMD_CODE_RATE == PWhl->Whl_WorkMode[i-1]) { if (tmpConst->Whl_J[j] > POSE_ZERO) { //tmpTwc[j] = pData->WhlPara.Whl_Rate[j] + tmpTwc[j] * 0.5 /PWhl->Whl_J[j]* RADS2RPM ; tmpTwc[j] = pData->WhlPara.Whl_Rate[i-1] + tmpTwc[j] * 0.5 /tmpConst->Whl_J[j]* RADS2RPM ; } } else if (WHL_CMD_CODE_TRQ == PWhl->Whl_WorkMode[i-1]) { ; } SetWheel(i,tmpTwc[j],PWhl->Whl_WorkMode[i-1]); j++; } } } } /*********************************************** 说明:配平轮指令分配 ***********************************************/ void ZKWhlDCmdDsp(void) { UINT8 i = 0x00; TYPE_CAL tmpT[3] ={0.0,0.0,0.0}; TYPE_CAL tmpWhlM[3] ={0.0,0.0,0.0}; TYPE_CAL tmpWhlRate = 0.0; sAttPriData *tmpAtt =NULL; AttCtrlConst_t *tmpConst=NULL; AttCmdDsp_t *pCmdDsp=NULL; WhlPara_t *pWhl=NULL; sAttDataPrePara_t *pData=NULL; sAttErrCtlPara_t *pREcheck=NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if(NULL ==tmpAtt || NULL ==tmpConst) { return; } for(i=0;i<3;i++) { tmpWhlM[i]= tmpConst->AttCmdFlashPara.M_Wheel[i][3]; } //pImpt=&tmpAtt->sIMPTPara; pCmdDsp = &tmpAtt->sCmdDspPara; pWhl=&tmpAtt->sPerPara.WhlPara; pData = &tmpAtt->sPerPara; pREcheck=&tmpAtt->sErrCtlPara; if(0x0f != pREcheck->WhlUseState) return; if(POSE_ABSF(tmpConst->WheelD_NomSpeed-pWhl->Whl_Rate[3])WheelD_SpeedErrThr) { //飞轮D转速指令为标称转速 pCmdDsp->WheelD_RotatSpd_Cmd=tmpConst->WheelD_NomSpeed; //发送飞轮D转速指令 SetWheel(4,pCmdDsp->WheelD_RotatSpd_Cmd,WHL_CMD_CODE_RATE); } else { //计算配平轮力矩指令 pCmdDsp->WheelD_MomOfForce_Cmd=tmpConst->WheelD_Default; for(i=0;i<3;i++) { tmpT[i]=pCmdDsp->Wheel_TwcCmd[i]+tmpWhlM[i]*tmpConst->WheelD_Default; if(POSE_ABSF(tmpT[i])>tmpConst->WheelD_AllDefault) { pCmdDsp->WheelD_MomOfForce_Cmd=0; break; } } //发送飞轮D力矩指令 tmpWhlRate = tmpConst->WheelD_NomSpeed - pData->WhlPara.Whl_Rate[3]; if (tmpWhlRate > 0.0) { tmpWhlRate = 1.0; } else { tmpWhlRate = - 1.0; } pCmdDsp->WheelD_RotatSpd_Cmd = pData->WhlPara.Whl_Rate[3] + tmpWhlRate * pCmdDsp->WheelD_MomOfForce_Cmd * 0.5 /tmpConst->Whl_J[3] * RADS2RPM ; SetWheel(4,pCmdDsp->WheelD_RotatSpd_Cmd,WHL_CMD_CODE_RATE); } } /*********************************************** 说明:飞轮指令分配,反作用轮通过422控制 ***********************************************/ void ActuatorCmdDsp(void) { sAttPriData *tmpAtt = NULL; sAttModPara_t *pMod= NULL; WhlPara_t *pWhl= NULL; AttCmdDsp_t *pCmdDsp= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; if(NULL == tmpAtt) return; pMod =&tmpAtt->sModePara; pWhl=&tmpAtt->sPerPara.WhlPara; pCmdDsp = &tmpAtt->sCmdDspPara; #ifdef MINMODULE_TYPE switch (pMod->WorkMode) { case ATTMOD_MagTOSUN: case ATTMOD_RATEDMP: { if(pCmdDsp->Wheel_Cmd_Cnt<60000) pCmdDsp->Wheel_Cmd_Cnt++; if (pCmdDsp->Wheel_Cmd_Cnt <= 3) { SetWheel(1,0,WHL_CMD_CODE_CURR); SetWheel(2,0,WHL_CMD_CODE_CURR); SetWheel(3,0,WHL_CMD_CODE_CURR); SetWheel(4,0,WHL_CMD_CODE_CURR); } } break; default: break; } #else switch (pMod->WorkMode) { case ATTMOD_UNCTL: break; case ATTMOD_WhlTOSUN: //(0x33)轮控对日定向 case ATTMOD_ONLTOEARTH: //(0x55)对地定向 case ATTMOD_WHEELTOEARTH: //(0x66)稳态对地 case ATTMOD_ATTAJUSTPRE: //(0x77)轨控前调姿 case ATTMOD_ORBITCTL: //(0x88)轨道控制 case ATTMOD_ATTAJUST: //(0xAA)定向前调姿 case ATTMOD_ONLTOTAR: //(0xBB)对目标定向 if (pWhl->Whl_UseCnt >= 3) { ZKWhlCmdDsp(); ZKWhlDCmdDsp(); } break; case ATTMOD_NOCOLL: if (pWhl->Whl_UseCnt >= 3) { ZKWhlCmdDsp(); } break; case ATTMOD_RATEDMP: //ZMX20230920ADD case ATTMOD_MagTOSUN: { if(pCmdDsp->Wheel_Cmd_Cnt<60000) pCmdDsp->Wheel_Cmd_Cnt++; if (pCmdDsp->Wheel_Cmd_Cnt <= 3) { SetWheel(1,0,WHL_CMD_CODE_CURR); SetWheel(2,0,WHL_CMD_CODE_CURR); SetWheel(3,0,WHL_CMD_CODE_CURR); SetWheel(4,0,WHL_CMD_CODE_CURR); } } break; default: break; } #endif } /******************************************************************** 功能:开关磁力矩器限幅 输入: 输出: *********************************************************************/ void MTOcOutProc(TYPE_CAL *MTIn,TYPE_CAL *MTOut, UINT8 *MTOnOff, UINT8 *MTDirect) { UINT8 i= 0x00; TYPE_CAL tmpMagMoment = 0.0; //TYPE_CAL TIME = 1.0; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt)||(NULL==tmpConst)) { return; } for (i = 0; i < MT_NUM; ++i) { tmpMagMoment = MTIn[i]; if (POSE_ABSF(tmpMagMoment) > tmpConst->MTOutXYZLimit[i]) //>P0 { MTOnOff[i] = MT_ON; if (tmpMagMoment > tmpConst->MTOutXYZLimit[i]) { MTDirect[i] = MT_DIRECT_POS; //正开 MTOut[i] = 500* (TYPE_CAL)tmpConst->MTCtrlTIME; } else { MTDirect[i] = MT_DIRECT_NEG; //负开 MTOut[i] = 500* (TYPE_CAL)tmpConst->MTCtrlTIME; } } else { MTOnOff[i] = MT_ON; if (tmpMagMoment< 0) { MTDirect[i] = MT_DIRECT_NEG; } else { MTDirect[i] = MT_DIRECT_POS; } MTOut[i] = POSE_ABSF( tmpMagMoment )/tmpConst->MTOutXYZLimit[i] * 500.0* (TYPE_CAL)tmpConst->MTCtrlTIME; } if (MTOut[i] < 100.0) { MTOnOff[i] = MT_OFF; } } } /******************************************************************** 功能:磁力矩器控制 输入: 输出: *********************************************************************/ void ZKMtCmdDsp(void) { UINT8 i = 0x00; UINT8 chn = 0x00; UINT8 dir = 0x00; UINT8 tmpReversibleFlg = 0x00; UINT16 delay_ms = 0; UINT32 pulse_ms = 0; UINT32 tmpCNT = 0; TYPE_CAL tmpMTin[MT_NUM] ={0.0,0.0,0.0,0.0}; TYPE_CAL tmpM_MAGCtrl[3][4] ={{0.0F,0.0F,0.0F,0.0F}, {0.0F,0.0F,0.0F,0.0F}, {0.0F,0.0F,0.0F,0.0F}}; //磁力矩器安装矩阵 TYPE_CAL tmpM_MAGCtrlFP1[4][3]={{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 tmpM_MAGCtrlFP[4][3]={{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 tmpM_MAGAA[3][3]={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}}; //磁力矩器分配矩阵中间量 TYPE_CAL tmpM_MAGAANI[3][3]={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}}; //磁力矩器分配矩阵中间量求逆 TYPE_CAL tmpUse = 0.0001F; sAttPriData *tmpAtt = NULL; AttCtrlConst_t *tmpConst= NULL; MtPara_t *pMt= NULL; sAttCtlPara_t *pCtrl= NULL; AttIMPTPara_t *pImpt= NULL; tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR; tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR; if((NULL==tmpAtt)||(NULL==tmpConst)) { return; } pMt=&tmpAtt->sPerPara.MtPara; pCtrl=&tmpAtt->sCtlPara; pImpt=&tmpAtt->sIMPTPara; memset(&tmpM_MAGCtrl[0][0], 0, 12*sizeof(TYPE_CAL)); if (POSE_OK == pImpt->MTUseStatus[0]) { tmpM_MAGCtrl[0][0]=tmpConst->AttCmdFlashPara.M_MAGCtrl[0][0]; tmpM_MAGCtrl[1][0]=tmpConst->AttCmdFlashPara.M_MAGCtrl[1][0]; tmpM_MAGCtrl[2][0]=tmpConst->AttCmdFlashPara.M_MAGCtrl[2][0]; } if (POSE_OK == pImpt->MTUseStatus[1]) { tmpM_MAGCtrl[0][1]=tmpConst->AttCmdFlashPara.M_MAGCtrl[0][1]; tmpM_MAGCtrl[1][1]=tmpConst->AttCmdFlashPara.M_MAGCtrl[1][1]; tmpM_MAGCtrl[2][1]=tmpConst->AttCmdFlashPara.M_MAGCtrl[2][1]; } if (POSE_OK == pImpt->MTUseStatus[2]) { tmpM_MAGCtrl[0][2]=tmpConst->AttCmdFlashPara.M_MAGCtrl[0][2]; tmpM_MAGCtrl[1][2]=tmpConst->AttCmdFlashPara.M_MAGCtrl[1][2]; tmpM_MAGCtrl[2][2]=tmpConst->AttCmdFlashPara.M_MAGCtrl[2][2]; } if (POSE_OK == pImpt->MTUseStatus[3]) { tmpM_MAGCtrl[0][3]=tmpConst->AttCmdFlashPara.M_MAGCtrl[0][3]; tmpM_MAGCtrl[1][3]=tmpConst->AttCmdFlashPara.M_MAGCtrl[1][3]; tmpM_MAGCtrl[2][3]=tmpConst->AttCmdFlashPara.M_MAGCtrl[2][3]; } //计算转置 MatrixTransposeHL(tmpM_MAGCtrl[0], tmpM_MAGCtrlFP1[0], 3, 4); //单位阵 MatrixProductHL(tmpM_MAGCtrl[0], tmpM_MAGCtrlFP1[0], tmpM_MAGAA[0], 3, 4, 3); //求逆 //tmpUse=1.0e-4; tmpUse=0.0001F; InvsymMatrix3(tmpM_MAGAA[0], tmpM_MAGAANI[0], &tmpReversibleFlg, &tmpUse); if(!tmpReversibleFlg) return; MatrixProductHL(tmpM_MAGCtrlFP1[0], tmpM_MAGAANI[0], tmpM_MAGCtrlFP[0], 4, 3, 3); MatrixProductHL(tmpM_MAGCtrlFP[0], pCtrl->MagCtrlResult, tmpMTin, 4, 3, 1); pCtrl->MagCtrlXYZZ[0] =tmpMTin[0]; pCtrl->MagCtrlXYZZ[1] =tmpMTin[1]; pCtrl->MagCtrlXYZZ[2] =tmpMTin[2]; pCtrl->MagCtrlXYZZ[3] =tmpMTin[3]; //磁力矩器限幅 MTOcOutProc(tmpMTin, pMt->MTCtrlOutP0, pMt->MTOnOff, pMt->MTDirect ); //tmpCNT = pMt-> MTCtrlTime % tmpConst->MTCtrlClc; tmpCNT = pMt-> MTCtrlTime % 10; //if (((tmpCNT >=1)&&(tmpCNT <= (UINT32)tmpConst->MTCtrlTIME))||( 0x88 == pMag->MagUseSwich)) if ((tmpCNT >=1)&&(tmpCNT <= (UINT32)tmpConst->MTCtrlTIME)) { if (tmpCNT ==1) { for (i = 0; i < MT_NUM; i++) { //输出磁力矩占控比 //chn:通道号,0x11:X, 0x22:Y, 0x33:Z,0x44:S //dir:方向,0:正向,1:反向 //delay_ms:启动延时,单位毫秒 (有效值 1--1000) //pluse_ms:脉冲宽阔,单位毫秒 (有效值 1--1800000) chn = chn + 0x11; if (MT_DIRECT_POS == pMt->MTDirect[i]) { dir = 0; } else if (MT_DIRECT_NEG == pMt->MTDirect[i]) { dir = 1; } pulse_ms = (UINT32)(pMt->MTCtrlOutP0[i]); if (MT_ON == pMt->MTOnOff[i]) { magnetic_out( chn, dir, delay_ms, pulse_ms); } else { //输出磁力矩占控比为0 dir = 0; pulse_ms = 0; magnetic_out( chn, dir, delay_ms, pulse_ms); } } } } else { //输出磁力矩占控比为0 for (i = 0; i < MT_NUM; i++) { chn = chn + 0x11; dir = 0; pulse_ms = 0; magnetic_out( chn, dir, delay_ms, pulse_ms); } } } /*********************************************** 说明:指令分配模块主函数,所有动作均指定 注意: 分离后启动 ***********************************************/ void ZKCmdDspAct(void) { #ifdef MINMODULE_TYPE //指令初始化 ZKCtrlCmdInit(); //磁力矩器 ZKMtCmdDsp(); //飞轮指令分配主模块 ActuatorCmdDsp(); #else //指令初始化 ZKCtrlCmdInit(); //飞轮指令分配主模块 ActuatorCmdDsp(); //磁力矩器 ZKMtCmdDsp(); //PPU ZKPPUCmdDsp(); #endif }