?? motor._c
字號:
///////////////////////////////////////////////////////////////
/**************************************************************
公司名稱: 揚州恒博科技
模塊名 : 點動型STQ執行機構主控程序
創建人 : 章儉文
日期 : 2008/08/19
功能描述: 完成對本地旋鈕和遠程開關量的控制功能
其它說明: 編譯環境為ICCAVR V6.31A
版本 : V1.0
**************************************************************/
///////////////////////////////////////////////////////////////
#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 + -