⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frontback.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 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 + -