📄 frontback.c
字号:
/**************************************************************************/
//出退马达状态管理函数,在10ms定时中断中调用
//函数名称:FbStatusContrel (void)
//创建时间:080603
/**************************************************************************/
#define FB_DRIVER
#include <includes.h>
#define FB_DEATH_MAX_CNT 0 //马达死区时间为30ms
FRONTBACK_STATUS FrontBackStatus = FRONTBACK_IDLE;
extern INT8U FBAimPst;//出退马达目标位置,全局变量
extern INT8U FBNowPst;//出退马达当前位置
extern INT8U IC3Cnt; //位置计数光编
extern INT8U Limit_F; //前限位标志
extern INT8U Limit_B; //后限位标志
INT8U FBDeathCnt; //死区时间计时
void FbStatusContrel (void)
{
switch (FrontBackStatus)
{
case FRONTBACK_IDLE:
{
//if(FBNowPst>FBAimPst+CNT_FB_ERROR)
if(FBNowPst>FBAimPst)
{
FrontBackStatus = FRONTBACK_BACK; //后退
IC3Cnt = 0; //计数器清零
IC3CONbits.ICM=2; //下降沿触发
}
//else if (FBNowPst+CNT_FB_ERROR<FBAimPst)
else if (FBNowPst<FBAimPst)
{
FrontBackStatus = FRONTBACK_FRONT; //前伸
IC3Cnt = 0; //计数器清零
IC3CONbits.ICM=3; //上升沿触发
}
else
{
FrontBackStatus = FRONTBACK_IDLE;
}
}
break;
case FRONTBACK_DEATHCNT:
if(FBDeathCnt>=FB_DEATH_MAX_CNT) //死区等待时间到
{
FrontBackStatus = FRONTBACK_IDLE;
FBDeathCnt = 0;
}
else if(FBDeathCnt<FB_DEATH_MAX_CNT)
{
FBDeathCnt ++;
}
break;
case FRONTBACK_FRONT:
if ((Limit_F==1) ||(MS2Sensor ==0)) //马达到达前限位且未过流
{
FBNowPst = PF(CNT_FB_LIMIT_DIST);//当前位置设为最大值
FBAimPst =PF(CNT_FB_LIMIT_DIST);
IC3Cnt = 0xFF; //關閉出退計數器
FBDeathCnt = 0;// 啟動停止計時
//FrontBackStatus = FRONTBACK_DEATHCNT; //设为死区等待阶段
FrontBackStatus = FRONTBACK_IDLE; //设为空闲阶段
FrontPwmSet = 0;//前伸PWM清除,
//发布前限位信息
OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
}
else//未过流且前后限位都未到达
{
if (IC3Cnt != 0xff) //及时更新当前位置
{
if(FBNowPst<=0xFF-IC3Cnt)
FBNowPst = FBNowPst+IC3Cnt;//當前位置=上次停止位置+出退計數值
else
FBNowPst=0xFF;
IC3Cnt = 0;
}
if ((FBAimPst!=0xFF)&&(FBNowPst >= FBAimPst))//当前位置〉=目标位置
{
//if(FBNowPst <= FBAimPst+CNT_FB_ERROR)
if(FBNowPst == FBAimPst)
//发布到位信息
OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
IC3Cnt = 0xFF; //關閉出退計數器
FBDeathCnt = 0;// 啟動停止計時
//FrontBackStatus = FRONTBACK_DEATHCNT; //设为死区等待阶段
FrontBackStatus = FRONTBACK_IDLE; //设为空闲阶段
FrontPwmSet = 0;//前伸PWM清除,
}
else
{
SETUP_FRONT(FBAimSpd);
FrontBackStatus = FRONTBACK_FRONT; //前伸
}
}
break;
case FRONTBACK_BACK:
if((Limit_B==1) || (MS3Sensor ==0)) //马达到达后限位且未过流
{
FBNowPst = 0x01;//当前位置设为最小值
FBAimPst = 0x01;
IC3Cnt = 0xFF; //關閉出退計數器
FBDeathCnt = 0;// 啟動停止計時
//FrontBackStatus = FRONTBACK_DEATHCNT; //设为死区等待阶段
FrontBackStatus = FRONTBACK_IDLE; //设为空闲阶段
//后退PWM清除,
BackPwmSet = 0;//发布后限位信息
//发布到位信息
OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
}
else//未过流且前后限位都未到达
{
if (IC3Cnt != 0xff)//及时更新当前位置
{
if(FBNowPst>=IC3Cnt)
FBNowPst = FBNowPst-IC3Cnt;//當前位置=上次停止位置-出退計數值
else
FBNowPst=0x00;
IC3Cnt = 0;
}
if (FBNowPst <= FBAimPst)//当前位置<=目标位置
{
//if(FBNowPst+CNT_FB_ERROR >= FBAimPst)
if(FBNowPst== FBAimPst)
//发布到位信息
OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
IC3Cnt = 0xFF; //關閉出退計數器
FBDeathCnt = 0;// 啟動停止計時
//FrontBackStatus = FRONTBACK_DEATHCNT; //设为死区等待阶段
FrontBackStatus = FRONTBACK_IDLE; //设为空闲阶段
BackPwmSet = 0;//后退PWM清除,
}
else
{
SETUP_BACK(FBAimSpd);
FrontBackStatus = FRONTBACK_BACK; //后退
}
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -