📄 updown.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 + -