Files
rag_agent/RAG-TEST-TOOLS/PrjAttCtrlMng/AttModeSel.c

461 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Created: 2022/11/4 11:02:40
* Author: wangzk zhengmengxing
*/
#include "..\PrjCommon\CommonDef.h"
//#include "..\PrjCommon\BlockRing.h"
#include "..\PrjCommon\DataStorDefine.h"
#include "..\PrjCommon\DevDefine.h"
//#include "..\PrjCommon\DevDrvs.h"
//#include "..\PrjPowCtrlMng\PowCtlMng.h"
#include "AttMath.h"
#include "AttCtrlMain.h"
/********************************************************************/
//extern sAttPriData *m_pZKPriInfo;
/***********************************************
说明:姿控工作模式选择初始化,在模式切换时候进行部分参数初始化
输入:无
输出:
返回:
注意: 模式切换时候调用一次
***********************************************/
void ZKModChgInit(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCmdDsp_t *pCmdDsp= NULL;
if(NULL == tmpAtt)
{return;}
pCmdDsp = &tmpAtt->sCmdDspPara;
//切换到新模式后,将相关计数器清零
#ifdef MINMODULE_TYPE
tmpAtt->sModePara.WModCnt2[0]=0; //2、速率阻尼
tmpAtt->sModePara.WModCnt2[1]=0; //2、速率阻尼
#else
//pAttCtlPara->sWModePara.WModCnt1=0; //1、碰撞规避模式
tmpAtt->sModePara.WModCnt2[0]=0; //2、速率阻尼
tmpAtt->sModePara.WModCnt2[1]=0; //2、速率阻尼
tmpAtt->sModePara.WModCnt3=0; //3、轮控对日定向
tmpAtt->sModePara.WModCnt4=0; //4、磁控对日定向
tmpAtt->sModePara.WModCnt5=0; //5、对地定向
tmpAtt->sModePara.WModCnt6=0; //6、稳态对地
tmpAtt->sModePara.WModCnt7=0; //7、轨控前调姿
tmpAtt->sModePara.WModCnt8=0; //8、轨道控制
tmpAtt->sModePara.WModCntA=0; //11、对目标定向
pCmdDsp->Wheel_Cmd_Cnt = 0; /*飞轮电流指令发送计数*/
tmpAtt->sCtlPara.PD2PIDCnt=0; //PD转PID计数
tmpAtt->sCtlPara.CtrlPD2PID=0; //
memset(tmpAtt->sCtlPara.SumAerrPre, 0.0, 3*sizeof(TYPE_CAL)); //PID积分器清零
tmpAtt->sErrCtlPara.AttLoseCnt=0;//模式切换时不正常计数清零
tmpAtt->sErrCtlPara.AttExCnt=0;
tmpAtt->sErrCtlPara.AttExFlg[0]=0x00;
tmpAtt->sErrCtlPara.AttExFlg[1]=0x00;
tmpAtt->sErrCtlPara.AttExFlg[2]=0x00;
tmpAtt->sErrCtlPara.AttUnStaCnt=0;
tmpAtt->sErrCtlPara.AttModCnt=0;
tmpAtt->sErrCtlPara.AttUnSta[0] = 0;
tmpAtt->sErrCtlPara.AttUnSta[1] = 0;
tmpAtt->sErrCtlPara.AttUnSta[2] = 0;
tmpAtt->sErrCtlPara.YawCnt = 0;
#endif
}
/***********************************************
说明:设置当前模式
输入:工作模式
输出:当前工作模式
返回: 无
注意:
***********************************************/
void ZKModDoSet(UINT8 newWMode)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL == tmpAtt)
{return;}
if (newWMode == tmpAtt->sModePara.WorkMode)
{return;}
tmpAtt->sModePara.WorkModePre = tmpAtt->sModePara.WorkMode;
tmpAtt->sModePara.WorkMode = newWMode;
tmpAtt->sModePara.ModeSwitchFlg = POSE_OK;
}
/***********************************************
说明:姿控工作模式选择初始化,参数初始化
注意: 开始调用一次
***********************************************/
void ZKModInit(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
sAttModPara_t *pWMod =NULL;
AttCmdDsp_t *pCmdDsp= NULL;
if((NULL==tmpAtt) || (NULL==tmpConst))
{return;}
pWMod =&tmpAtt->sModePara;
pCmdDsp = &tmpAtt->sCmdDspPara;
//工作模式初始化为碰撞规避
#ifdef MINMODULE_TYPE
pWMod->WorkMode = ATTMOD_RATEDMP;
#else
pWMod->WorkMode = ATTMOD_NOCOLL;
#endif
pWMod->ReDataBK = POSE_NO;
pWMod->ATTFlashSwitch= POSE_NO;
pWMod->Mod2UnctlFirst=0x55;
pWMod->WorkModePre = ATTMOD_NOCOLL;
tmpAtt->sModePara.ModeSwitchFlg = POSE_OK;
pWMod->ZKPowOnFirst =0; //首次分离/计算机冷启动
pWMod->ZKPowOnStep =0; //首次分离/计算机冷启动加电序列
//pWMod->ModeTRATEDMP =0;
tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_NO; //二次点火允许标志,默认禁止
//定义连续判断时长单位为s可上注
//tmpConst->judge_time1 =200;
tmpConst->judge_time1 =180; //ZMX20240115
tmpConst->judge_time2 = 60;
tmpConst->judge_time3=30;
tmpConst->AttCmdFlashPara.judgeWait_time=6000;
tmpConst->judge_time4 = 0;
tmpConst->judge_time5 = 30;
tmpConst->judge_time6 = 0;
tmpConst->judge_time7 = 0;
tmpConst->judge_time8 = 0;
tmpConst->judge_time9 = 30;
tmpConst->judge_timeA = 0;
tmpConst->judge_timeB = 120;
//判断阈值初始化(可上注)
tmpConst->RateThr_2T3 = 0.3f * ANG2RADIAN; //0.3°/s
tmpConst->HWHLThr_2T3 = 0.5f;
tmpConst->AngThr_3TB = 2.0f * ANG2RADIAN; //2.0° --对日定向转无控模式角度阈值
tmpConst->RateThr_3TB = 0.1f * ANG2RADIAN; //0.1°/s--对日定向转无控模式角速度阈值
tmpConst->AngThr_5T6 = 2.0f * ANG2RADIAN; //对地定向模式切换到稳定对地模式角度阈值
tmpConst->RateThr_5T6 = 0.1f * ANG2RADIAN; //对地定向模式切换到稳定对地模式角速度阈值
tmpConst->AngThr_9TA = 2.0f * ANG2RADIAN;
tmpConst->RateThr_9TA = 0.1f * ANG2RADIAN;
//计数器初始化
pWMod->WModCnt2[0]=0; //2、速率阻尼
pWMod->WModCnt2[1]=0; //2、速率阻尼
pWMod->WModCnt3=0; //3、轮控对日定向
pWMod->WModCnt4=0; //4、磁控对日定向
pWMod->WModCnt5=0; //5、对地定向
pWMod->WModCnt6=0; //6、稳态对地
pWMod->WModCnt7=0; //7、轨控前调姿
pWMod->WModCnt8=0; //8、轨道控制
pWMod->WModCntA=0; //11、对目标定向
pWMod->WModCntB= 0;
pWMod->WModCnt1 = 0;
pCmdDsp->Wheel_Cmd_Cnt = 0;
}
/***********************************************
说明:姿控工作模式中计数的管理,
输入:当前工作模式,闭环姿态数据
输出:模式计数值
返回:
注意: 每0.5秒调用一次
***********************************************/
void ZKDoModCal(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
sAttModPara_t *pWMod =NULL;
sAttDeterPara_t *pDeter =NULL;
WhlPara_t *PWhl =NULL;
//AttIMPTPara_t *pImpt;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
if((NULL==tmpAtt) || (NULL==tmpConst))
{return;}
pWMod=&tmpAtt->sModePara;
pDeter=&tmpAtt->sDeterPara;
PWhl = &tmpAtt->sPerPara.WhlPara;
//pImpt=&tmpAtt->sIMPTPara;
#ifdef MINMODULE_TYPE
switch(pWMod->WorkMode)
{
case ATTMOD_RATEDMP://速率阻尼转对日判断计数
{
//滚动、俯仰和偏航各轴的惯性角速率绝对值连续10s不大于0.3°/s&&闭环姿态数据有效
if(
(POSE_ABSF(pDeter->CLPAttAngRat[0])<tmpConst->RateThr_2T3) &&
(POSE_ABSF(pDeter->CLPAttAngRat[1])<tmpConst->RateThr_2T3) &&
(POSE_ABSF(pDeter->CLPAttAngRat[2])<tmpConst->RateThr_2T3) &&
(pDeter->CLPAttValid==0x55))
{
if(pWMod->WModCnt2[0]<60000)
{pWMod->WModCnt2[0]++;}
}
else
{
pWMod->WModCnt2[0]=0;
}
//反作用轮卸载角动量和小于0.5Nms
if ((POSE_OK == PWhl->WhlIn_Valid[0])&&(POSE_OK == PWhl->WhlIn_Valid[1])&&(POSE_OK == PWhl->WhlIn_Valid[2])&&(POSE_OK == PWhl->WhlIn_Valid[3])&&(POSE_ABSF(PWhl->Whl_Momentum_Sum)<tmpConst->HWHLThr_2T3))
{
if(pWMod->WModCnt2[1]<60000)
{pWMod->WModCnt2[1]++;}
}
else
{
pWMod->WModCnt2[1]=0;
}
break;
}
default:
{
break;
}
}
#else
switch(pWMod->WorkMode)
{
case ATTMOD_RATEDMP://速率阻尼转对日判断计数
{
//连续60s闭环姿态数据有效标志为有效闭环姿态角速度滚动、俯仰和偏航各轴的惯性姿态角速率在±0.3°/s内
if(
(POSE_ABSF(pDeter->CLPAttAngRat[0])<tmpConst->RateThr_2T3) &&
(POSE_ABSF(pDeter->CLPAttAngRat[1])<tmpConst->RateThr_2T3) &&
(POSE_ABSF(pDeter->CLPAttAngRat[2])<tmpConst->RateThr_2T3) &&
(0x55 == pDeter->CLPAttValid))
{
if(pWMod->WModCnt2[0]<60000)
{pWMod->WModCnt2[0]++;}
}
else
{
pWMod->WModCnt2[0]=0;
}
/*连续60s输出转速有效标志有效且反作用轮卸载三轴角动量和模小于0.5Nms*/
//反作用轮卸载角动量和小于0.5Nms
if ((POSE_OK == PWhl->WhlIn_Valid[0])&&(POSE_OK == PWhl->WhlIn_Valid[1])&&(POSE_OK == PWhl->WhlIn_Valid[2])&&(POSE_OK == PWhl->WhlIn_Valid[3])&&(POSE_ABSF(PWhl->Whl_Momentum_Sum)<tmpConst->HWHLThr_2T3))
{
if(pWMod->WModCnt2[1]<60000)
{pWMod->WModCnt2[1]++;}
}
else
{
pWMod->WModCnt2[1]=0;
}
break;
}
case ATTMOD_WhlTOSUN://对日定向转无控模式
//case ATTMOD_MagTOSUN://对日定向转无控模式
{
if((0x55 == pDeter->CLPAttValid) && (0x00 == pWMod->WModSadaOpen) && //帆板展开标志为未展开状态 注意帆板未展开未00展开为55
//(POSE_ABSF(pDeter->CLPAttAng[1])<=tmpConst->AngThr_3TB) &&
//(POSE_ABSF(pDeter->CLPAttAng[2])<=tmpConst->AngThr_3TB) &&
(POSE_ABSF(pDeter->CLPAttAng[0])<tmpConst->AngThr_3TB) && //20230926
(POSE_ABSF(pDeter->CLPAttAng[1])<tmpConst->AngThr_3TB) &&
(POSE_ABSF(pDeter->CLPAttAngRat[0])<tmpConst->RateThr_3TB) &&
(POSE_ABSF(pDeter->CLPAttAngRat[1])<tmpConst->RateThr_3TB) &&
(POSE_ABSF(pDeter->CLPAttAngRat[2])<tmpConst->RateThr_3TB))
{
if(pWMod->WModCnt3<60000)
{pWMod->WModCnt3++;}
}
else {pWMod->WModCnt3=0;}
break;
}
case ATTMOD_UNCTL://无控模式转对日定向
{
if (0x55 == pWMod->WModSadaOpen)
{
if(pWMod->WModCntB<60000) //WModCntB需要备份
{pWMod->WModCntB++;}
}
break;
}
case ATTMOD_ONLTOEARTH://对地定向模式切换到稳定对地模式条
{
if((0x55 == pDeter->CLPAttValid) &&
(POSE_ABSF(pDeter->CLPAttAng[0])<tmpConst->AngThr_5T6) &&
(POSE_ABSF(pDeter->CLPAttAng[1])<tmpConst->AngThr_5T6) &&
(POSE_ABSF(pDeter->CLPAttAngRat[0])<tmpConst->RateThr_5T6) &&
(POSE_ABSF(pDeter->CLPAttAngRat[1])<tmpConst->RateThr_5T6)
//(POSE_ABSF(pDeter->CLPAttAngRat[2])<=pWMod->RateThr_SUNTOUNCTL)
)
{
if(pWMod->WModCnt5<60000)
{pWMod->WModCnt5++;}
}
else {pWMod->WModCnt5=0;}
break;
}
//case ATTMOD_ATTAJUST://对地定向模式切换到稳定对地模式条
//{
//if((0x55 == pDeter->CLPAttValid) &&
//(POSE_ABSF(pDeter->CLPAttAng[0])<tmpConst->AngThr_9TA) &&
//(POSE_ABSF(pDeter->CLPAttAng[1])<tmpConst->AngThr_9TA) &&
//(POSE_ABSF(pDeter->CLPAttAngRat[0])<tmpConst->RateThr_9TA) &&
//(POSE_ABSF(pDeter->CLPAttAngRat[1])<tmpConst->RateThr_9TA)
////(POSE_ABSF(pDeter->CLPAttAngRat[2])<=pWMod->RateThr_SUNTOUNCTL)
//)
//{
//if(pWMod->WModCnt9<60000)
//{pWMod->WModCnt9++;}
//}
//else {pWMod->WModCnt9=0;}
//break;
//}
default:
{
break;
}
}
#endif
}
/***********************************************
说明:姿控工作模式自主切换判断,判断使用哪种模式
输入:当前工作模式,模式指令状态,闭环姿态数据
输出:工作模式
返回: 无
注意:
***********************************************/
void ZKModeSel_Auto(void)
{
UINT8 tmpNewMod =0;
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
sAttModPara_t *pWMod =NULL;
WhlPara_t *PWhl =NULL;
if((NULL==tmpAtt) || (NULL==tmpConst))
{return;}
pWMod=&tmpAtt->sModePara;
PWhl = &tmpAtt->sPerPara.WhlPara;
tmpNewMod=pWMod->WorkMode;
#ifdef MINMODULE_TYPE
switch(pWMod->WorkMode)
{
case ATTMOD_RATEDMP:
{
if((pWMod->WModCnt2[0]>= (tmpConst->judge_time2 * 2))&&((pWMod->WModCnt2[1]>= (tmpConst->judge_time2 * 2))
||((POSE_NO == PWhl->WhlIn_Valid[0])||(POSE_NO == PWhl->WhlIn_Valid[1])||(POSE_NO == PWhl->WhlIn_Valid[2])||(POSE_NO == PWhl->WhlIn_Valid[3]))))
{
tmpNewMod = ATTMOD_MagTOSUN;
pWMod->WModCnt2[0]=0;
pWMod->WModCnt2[1]=0;
}
break;
}
default:
{
break;
}
}
#else
switch(pWMod->WorkMode)
{
case ATTMOD_NOCOLL://碰撞规避模式
{
if (pWMod->WModCnt1>= (tmpConst->judge_time1*2) || (POSE_OK == pWMod->WModSadaOpen))
{
tmpNewMod = ATTMOD_RATEDMP;
}
break;
}
case ATTMOD_RATEDMP://速率阻尼
{
if((pWMod->WModCnt2[0]>= (tmpConst->judge_time2 * 2))&&((pWMod->WModCnt2[1]>= (tmpConst->judge_time2 * 2))
||((POSE_NO == PWhl->WhlIn_Valid[0])||(POSE_NO == PWhl->WhlIn_Valid[1])||(POSE_NO == PWhl->WhlIn_Valid[2])||(POSE_NO == PWhl->WhlIn_Valid[3]))))
{
if (PWhl->Whl_UseCnt >= 3)
{
tmpNewMod = ATTMOD_WhlTOSUN;
}
else
{
tmpNewMod = ATTMOD_MagTOSUN;
}
}
break;
}
case ATTMOD_WhlTOSUN:
{
if((pWMod->WModCnt3>=(tmpConst->judge_time3 * 2))&&(pWMod->WModCnt1>=(tmpConst->AttCmdFlashPara.judgeWait_time * 2)))
{
//pWMod->Mod2UnctlFirst=0x55;
tmpNewMod = ATTMOD_UNCTL;
}
break;
}
case ATTMOD_UNCTL:
{
if (0x55 == pWMod->Mod2UnctlFirst)
{
if(pWMod->WModCntB>= (tmpConst->judge_timeB* 2)) //连续120s
{
tmpNewMod = ATTMOD_RATEDMP;
pWMod->Mod2UnctlFirst=0x00;
}
}
break;
}
case ATTMOD_ONLTOEARTH:
{
if(pWMod->WModCnt5>=(tmpConst->judge_time5* 2)) //连续30s
{
tmpNewMod = ATTMOD_WHEELTOEARTH;
}
break;
}
default:
{
break;
}
}
#endif
tmpAtt->sModePara.ModeSwitchFlg = POSE_NO;
ZKModDoSet(tmpNewMod);
}
/***********************************************
说明:姿控工作模式选择主函数
注意: 每0.5秒调用一次
***********************************************/
void ZKDoModeAct(void)
{
//AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
//
//if(NULL==tmpConst)
//{
//return;
//}
ZKDoModCal();
ZKModeSel_Auto();
}