📄 motor.c
字号:
#define MOTOR_GLOBAL
#include "motor.h"
static void MotorLocal(void); //本地控制
static void MotorRemote3(void); //远程三线制
static void MotorRemote4(void); //远程四线制
void Motor(void) //电机任务
{
//一个任务周期的信号消抖动
static uchar KeyLast = 0, KeyTemp = 0;
KeyTemp = (GetLocalClose()|GetLocalOpen()<<1|GetLocal()<<2|GetRemote()<<3|\
GetRemoteStop()<<4|GetRemoteClose()<<5|GetRemoteOpen()<<6);
//当有信号时消抖动
while(GetLocalClose()||GetLocalOpen()||GetLocal()||GetRemote()||\
GetRemoteStop()||GetRemoteClose()||GetRemoteOpen())
{
if(KeyTemp == KeyLast) break; //如两次电机任务扫描键值相等,跳出并执行后面代码
else
{
KeyLast = KeyTemp; //保存上次扫描键值
return;
}
}
if(KeyTemp == 0)StopMotor(); //所有信号丢失时关电机保护
ProtectMotor(); //电机过热、限位保护
if( GetLocal()&&(!GetRemote())) //本地控制
{
SetLocalLed();
ClrRemoteLed();
if(ControlFlag != IN_LOCAL) //控制状态转换
{
StopMotor();
ControlFlag = IN_LOCAL;
}
MotorLocal();
}
//远程三线制
if( (!GetLocal()) && GetRemote() && GetRemoteMode() )
{
ClrLocalLed();
SetRemoteLed();
if(ControlFlag != IN_REMOTE3) //控制状态转换
{
StopMotor();
ControlFlag = IN_REMOTE3;
}
MotorRemote3();
}
//远程四线制
if( (!GetLocal()) && GetRemote() && (!GetRemoteMode()) )
{
ClrLocalLed();
SetRemoteLed();
if(ControlFlag != IN_REMOTE4) //控制状态转换
{
StopMotor();
ControlFlag = IN_REMOTE4;
}
MotorRemote4();
}
}//end of 电机任务
static void MotorLocal(void) //本地控制
{
if(GetLocalOpen()&&!GetLocalClose()) //本地开
{
if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
{
OpenMotor(); //开电机
}
}
if(GetLocalClose()&&!GetLocalOpen()) //本地关
{
if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
{
CloseMotor();
}
}
}//edd of 本地控制
static void MotorRemote3(void) //远程三线制
{
if(GetRemoteOpen()&&!GetRemoteClose()) //远程三线开
{
if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
{
OpenMotor();
}
}
if(GetRemoteClose()&&!GetRemoteOpen()) //远程三线关
{
if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
{
CloseMotor();
}
}
}
static void MotorRemote4(void) //远程四线制
{
if(GetRemoteStop()) //远程四线停
{
StopMotor();
}
//远程四线开
if(GetRemoteOpen()&&!GetRemoteClose()&&!GetRemoteStop())
{
if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
{
OpenMotor();
}
}
//远程四线关
if(GetRemoteClose()&&!GetRemoteOpen()&&!GetRemoteStop())
{
if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
{
CloseMotor();
}
}
}
void OpenMotor(void) //开电机
{
if(MotorFlag == CLOSE) //反向切换延时1S
{
MotorFlag = OPEN;
if(GetDirection())
{
ClrMotor1();
SetMotor2();
}
else
{
SetMotor1();
ClrMotor2();
}
MotorDelayTime = 0;
while(MotorDelayTime<100)
{
if(GetOverheat()||GetLimit())break;
}
}
if(MotorFlag == STOP)
{
MotorFlag = OPEN;
if(GetDirection())
{
ClrMotor1();
SetMotor2();
}
else
{
SetMotor1();
ClrMotor2();
}
}
}//开电机
void CloseMotor() //关电机
{
if(MotorFlag == OPEN) //反向切换延时1S
{
MotorFlag = CLOSE;
if(GetDirection())
{
SetMotor1();
ClrMotor2();
}
else
{
ClrMotor1();
SetMotor2();
}
MotorDelayTime = 0;
while(MotorDelayTime<100)
{
if(GetOverheat()||GetLimit())break;
}
}
if (MotorFlag == STOP)
{
MotorFlag = CLOSE;
if(GetDirection())
{
SetMotor1();
ClrMotor2();
}
else
{
ClrMotor1();
SetMotor2();
}
}
}//关电机
void StopMotor(void) //停电机停延时0.5S
{
if(MotorFlag == OPEN||MotorFlag == CLOSE)
{
MotorFlag = STOP;
ClrMotor1();
ClrMotor2();
MotorDelayTime = 0;
while(MotorDelayTime<50)
{
if(GetOverheat()||GetLimit())break;
}
}
}
void ProtectMotor() //过热、限位信号保护
{
if(GetOverheat()) StopMotor();
if(GetLimitClose())
{ //开信号时关限位不停
if(GetLocalOpen()||GetRemoteOpen()||MotorFlag == OPEN)return;
StopMotor();
}
if(GetLimitOpen())
{ //关信号时开限位不停
if(GetLocalClose()||GetRemoteClose()||MotorFlag == CLOSE)return;
StopMotor();
}
}
uchar GetLimitClose(void)
{
if(limit_direction == 1)
{
return GetLimit1();
}
else if((limit_direction == 0))
{
return GetLimit2();
}
else
{
return GetLimit1();
}
}
uchar GetLimitOpen(void)
{
if(limit_direction == 1)
{
return GetLimit2();
}
else if((limit_direction == 0))
{
return GetLimit1();
}
else
{
return GetLimit2();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -