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

📄 motor.c

📁 avr单片机ATMega16对三相异步电机的智能控制源码
💻 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 + -