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

📄 updown.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
字号:
/**************************************************************************/
//升降马达状态管理函数,在10ms定时中断中调用
//函数名称:UdStatusContrel (void)
//创建时间:080603
//说明:该程序为调试所用,若为实际运用时需要重新判断限位和过流信号
/**************************************************************************/
#define UD_DRIVER
#include <includes.h>
#define  UPDOWN_DEATH_MAX_CNT    0 //马达死区时间为30ms
UPDOWN_STATUS  UpDownStatus = UPDOWN_IDLE;
extern INT8U UDAimPst;//升降马达目标位置,全局变量
extern INT8U UDAimSpd;//升降马达目标速度,全局变量
extern INT8U IC4Cnt;//升降计数
extern INT8U Limit_D,Limit_U;//限位标志
extern INT8U UDNowPst;//升降马达当前位置,局部变量

INT8U  UDDeathCnt;   //死区时间计时

void UdStatusContrel (void)
{
    switch (UpDownStatus)
    {
        case  UPDOWN_IDLE:
            {
                //if(UDNowPst>UDAimPst+CNT_UD_ERROR)
                if(UDNowPst>UDAimPst)
                {
                    UpDownStatus = UPDOWN_UP;  //上升 
                    IC4Cnt = 0;                               //计数器清零
                    IC4CONbits.ICM=2;       //下降沿触发          
                }
                //else if (UDNowPst+CNT_UD_ERROR<UDAimPst)
                else if (UDNowPst<UDAimPst)
                {
                    UpDownStatus = UPDOWN_DOWN;  //下降 
                    IC4Cnt = 0;                               //计数器清零                    
                    IC4CONbits.ICM=3;       //上升沿触发          
                }
                else 
                {
                   UpDownStatus = UPDOWN_IDLE;
                }
            }

            break;
        case  UPDOWN_DEATHCNT:
            if(UDDeathCnt>=UPDOWN_DEATH_MAX_CNT )   //死区等待时间到
            {
                UpDownStatus =  UPDOWN_IDLE;
                UDDeathCnt = 0;              
            }
            else if(UDDeathCnt<UPDOWN_DEATH_MAX_CNT )
            {
                UDDeathCnt ++;
            }
            break;
        case  UPDOWN_DOWN:
             if((Limit_D==1) || (MS13Sensor ==0)) //马达到达下限位且未过流
            {
                UDNowPst = PB(0);//当前位置设为最大值
                UDAimPst = PB(0);
                IC4Cnt = 0xFF; //關閉升降計數器
                UDDeathCnt = 0;// 啟動停止計時
                //UpDownStatus =  UPDOWN_DEATHCNT; //设为死区等待阶段
                UpDownStatus =  UPDOWN_IDLE; //设为空闲阶段
                DownPwmSet = 0;//下降PWM清除,
                //发布下限位信息  
                OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);           
            }
            else//未过流且前后限位都未到达
            {
                if(IC4Cnt != 0xff)//及时更新位置信息
                {
                	if(UDNowPst<=0xFF-IC4Cnt)
                    	UDNowPst = UDNowPst+IC4Cnt;
                    else
                    	UDNowPst=0xFF;
                     IC4Cnt = 0;
                }
                if (UDNowPst >= UDAimPst)//当前位置〉=目标位置
                {
                	//if(UDNowPst <= UDAimPst+CNT_UD_ERROR)
                	if(UDNowPst == UDAimPst)
                    	//发布到位信息
            			OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);
                    IC4Cnt = 0xFF; //關閉升降計數器
                    UDDeathCnt = 0;// 啟動停止計時
                	//UpDownStatus =  UPDOWN_DEATHCNT; //设为死区等待阶段
                	UpDownStatus =  UPDOWN_IDLE; //设为空闲阶段
                    DownPwmSet = 0;//下降PWM清除,                    
                }
                else
                {
                    SETUP_DOWN(UDAimSpd);
                    UpDownStatus = UPDOWN_DOWN;  //下降
                }
             
            }

            break;
        case  UPDOWN_UP:
           if((Limit_U==1) || (MS10Sensor ==0)) //马达到达上限位且未过流
            {
                UDNowPst = 0x01;//当前位置设为最大值
                UDAimPst = 0x01;
                IC4Cnt = 0xFF; //關閉升降計數器
                UDDeathCnt = 0;// 啟動停止計時
                //UpDownStatus =  UPDOWN_DEATHCNT; //设为死区等待阶段
                UpDownStatus =  UPDOWN_IDLE; //设为空闲阶段
                UpPwmSet = 0;//上升PWM清除,
                //发布上限位信息 
                OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);   
            }
            else//未过流且上下限位都未到达
            {
                if(IC4Cnt != 0xff) //及时更新位置信息
                {
                	if(UDNowPst>=IC4Cnt)
                    	UDNowPst = UDNowPst-IC4Cnt;
                    else
                    	UDNowPst=0x00;
                     IC4Cnt = 0;
                }
                if  ((UDNowPst!=0x00)&&(UDNowPst <= UDAimPst))//当前位置<=目标位置
                {
                	//if(UDNowPst+CNT_UD_ERROR >= UDAimPst)
                	if(UDNowPst== UDAimPst)
                    	//发布到位信息
            			OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);
                    IC4Cnt = 0xFF; //關閉升降計數器
                    UDDeathCnt = 0;// 啟動停止計時
                	//UpDownStatus =  UPDOWN_DEATHCNT; //设为死区等待阶段
                	UpDownStatus =  UPDOWN_IDLE; //设为空闲阶段
                    UpPwmSet = 0;//上升PWM清除,                    
                }
                else
                {
                    SETUP_UP(UDAimSpd);
                    UpDownStatus = UPDOWN_UP;  //上升
                }
             
            }
            break;
        default:
            break;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -