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

📄 main.c

📁 绝对好东西!aduc812AD转换代码,望对大家学习有所帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
	                     IRIS_TgtPos=IRIS_TgtPos<<4; 
						 if(IRIS_TgtPos>IRIS_CurPos)	 //如果目标值大于当前值
						 { 
						   
						   R_IRIS_Run_Flag=0xFF;	//置电机右传标志位
						   L_IRIS_Run_Flag=0x00;	//清楚电机左转标志位
						   Cnt=0;					//电机转动计数清0
						 }
			             else if(IRIS_TgtPos<IRIS_CurPos)	 //如果目标值小于当前值
						 { 						   
						   L_IRIS_Run_Flag=0xFF;	 //置电机左传标志位
						   R_IRIS_Run_Flag=0x00;	 //清楚电机右转标志位
						   Cnt=0;					 //电机转动计数清0
						 } 
						   
						  						  			             	  						     
						 if(ND_VAL&&(Filter_ND_INVAL_Flag!=0xFF))	     //如果ND_VAL=0则目标位置既是当前位置,不转动ND_Filter
						   {			
							 Filter_ND_VAL_Flag=0xFF;
							 Filter_Run_L();	 						 	  
					       }											//在已经有一个标志位被置位的情况下,不设定另一个标志位
							 	                       
					    }
			          break;
	                 case 0x01:		 
	                    {
			             while(!RI)
	                        {}
	                     RI=0; 
						 R_Data=SBUF; 				 
	  		             IRIS_TgtPos=(unsigned int)R_Data;
	                     IRIS_TgtPos=IRIS_TgtPos<<4;
						 if(IRIS_TgtPos>IRIS_CurPos)	 //如果目标值大于当前值
						 { 
						   
						   R_IRIS_Run_Flag=0xFF;	//置电机右传标志位
						   L_IRIS_Run_Flag=0x00;	//清楚电机左转标志位
						   Cnt=0;					//电机转动计数清0
						 }
			             else if(IRIS_TgtPos<IRIS_CurPos)	 //如果目标值小于当前值
						 {
						   L_IRIS_Run_Flag=0xFF;	 //置电机左传标志位
						   R_IRIS_Run_Flag=0x00;	 //清楚电机右转标志位
						   Cnt=0;					 //电机转动计数清0
						 }  
						   
						 		           
					    if(ND_INVAL&&(Filter_ND_VAL_Flag!=0xFF))		//如果ND_INVAL=0则目标位置既是当前位置,不转动ND_Filter
					          {   				       
							    Filter_ND_INVAL_Flag=0xFF;
								Filter_Run_R(); 
							  }	
					    }			   	
			           break;
				      case 0x02:		   //发送的第3组数是0x02时 接着发送的是ABS的调节参数
					    {
					     while(!RI)
	                        {}
						 RI=0; 
						 ABS_M=SBUF;
						 
					   } 
					   break;
					  case 0x03:
					    {
					     while(!RI)
	                        {}
						 RI=0;
						 ABS_N=SBUF;
						 ABS_N=ABS_N<<4;
					    }
					   break;
	                  case 0x04:		   
					  	{
					      while(!RI)
	                        {}
						  RI=0; 
						  AEC_M=SBUF;
						}
					   break;
					  case 0x05:
					  {
					     while(!RI)
	                        {}
						 RI=0;
						 AEC_N=SBUF;
						 AEC_N=AEC_N<<4;
					  }
					  break;  
	            }
	     }	   	 
    }
 EA=1;
}

void IRIS_Moto_Run()		 //光圈电机转动
{
 	unsigned char i=0x00;
	
 	if(IRIS_TgtPos==IRIS_CurPos)
   	{
    	L_IRIS_Run_Flag=0x00;
		R_IRIS_Run_Flag=0x00;
		return; 
   	}
 	else if(IRIS_TgtPos>IRIS_CurPos)	
   	{
		UpdataCurPos();
		IRIS_RUN=1;
	  
     	while(R_IRIS_Run_Flag==0xFF)
	   	{	
	    	IRIS_DIR=0;			 // 目标地址大于当前地址,光圈应减小,电机向右转
			for(i=0;i<unPulseHigh;i++);
			{}		
			
			IRIS_DIR=1;		//停止
			for(i=0;i<unPulseLow;i++);
			{}

		  	UpdataCurPos();
		   	if((IRIS_TgtPos<=IRIS_CurPos)&&(R_IRIS_Run_Flag==0xFF))	
		    {	
				IRIS_RUN=0;
		    	IRIS_DIR=1;			 //反转
				for(i=0;i<unPulseHigh;i++);	 
				{}		
				
				IRIS_RUN=1;		//停止
				//for(i=0;i<unPulseLow;i++);
				//{}	
				R_IRIS_Run_Flag=0x00;
				IRIS_CurPos=IRIS_TgtPos;	 //使当前值等于上次发送的目标值,发送同样的目标值电机不转动
  				return;
			}
			Cnt++;				 //通过j计数,j计数达到预定值后,停止光圈电机转动,,
		    if(Cnt==1500)			 //并清楚转动标志位,防止转死情况的发生
		      {  
				 IRIS_RUN=1;
		    	 IRIS_DIR=1;
		         R_IRIS_Run_Flag=0x00;
				 return;		   
		      }			                                 	 
	   	}
		
   } 
 	else	 
   	{
		UpdataCurPos();
		IRIS_DIR=1;
	   	while(L_IRIS_Run_Flag==0xFF)	    
	   	{	
	    	IRIS_RUN=0;		// 目标地址小于当前地址,光圈应增大,电机向左转
			for(i=0;i<unPulseHigh;i++);
			{}

			IRIS_RUN=1;		//停止
			for(i=0;i<unPulseLow;i++);
			{}
			
			UpdataCurPos();
			if((IRIS_TgtPos>=IRIS_CurPos)&&(L_IRIS_Run_Flag==0xFF))	    
		    {			   	   			    	
				IRIS_RUN=1;
		    	IRIS_DIR=0;			 //反转
				for(i=0;i<unPulseHigh;i++);	   
				{}		
				
				IRIS_DIR=1;		//停止
				//for(i=0;i<unPulseLow;i++);
				//{}
				L_IRIS_Run_Flag=0x00;
				IRIS_CurPos=IRIS_TgtPos;	 //使当前值等于上次发送的目标值,发送同样的目标值电机不转动
				return;
			}
			Cnt++;
		    if(Cnt==1500)		   //通过j计数,j达到预定值后,停止光圈电机转动,
		     {				   //并清楚转动标志位,防止转死情况的发生
			    IRIS_RUN=1;
		    	IRIS_DIR=1;
		        L_IRIS_Run_Flag=0x00;
				return;		   
		     }		                               	 
	   	}	 
	}
}	  

void Filter_Run_L()				   //滤光片电机旋转
{
      
	    FILTER_DIR=1;
		FILTER_RUN=0;
		TR0=1;				 //启动定时器0
		//if(!ND_INVAL)
        // {
		//	  Serial_Port_Trans(0xDDDD);   //当转动到位置时发送0xDDDD 
        //}
      	
}
void Filter_Run_R()
{
   
	    FILTER_DIR=0;
		FILTER_RUN=1;
		TR0=1;			   //启动定时器0
		//if(!ND_VAL)
         //{
			  //Serial_Port_Trans(0xCCCC);   //当转动到位置时发送0xCCCC
         //}         	   
	
  //Serial_Port_Trans(0xFFFF); 
}


void Initial_Filter_Moto() 		
 {
  unsigned int i=0x0000;
  FILTER_DIR=1;
  FILTER_RUN=0;									  
  while(ND_VAL)
     { 
	   i++;
	   if(i==40000)
	     {
		   FILTER_DIR=1;
           FILTER_RUN=1;
		   return;	
		 }
	 }
  FILTER_DIR=1;
  FILTER_RUN=1;							  
  
  //Serial_Port_Trans(0xFFFF);
 }


void ABS_Account()			 //ABS转化输出
 {	
   unsigned int G;						 
   unsigned char *p;      		
   G=(unsigned int)ABS_N;
   p=(unsigned char *)&Y + 2;
   Y=GetADC(ADIN_V_ABS);
   Y=ABS_M*Y;
   if(Y>=0x0FFF)
     {
	    Y=0x0FFF;
	 }
   if(Y<=0x0000)
     {
	    Y=0x0000;
	 }
   V_ABS_H=*p;
   V_ABS_L=*(p+1);
   Put_ABS(V_ABS_H,V_ABS_L);
   
 }

void AEC_Account()
{
   unsigned int G;						 
   unsigned char *p;      		
   
   p=(unsigned char *)&Y;
   Y=(GetADC(ADIN_V_ABS) + GetADC(ADIN_V_ABS)) >> 1;
   G=AEC_M*Y;
   if(G > 0x0FFF)
   {
   		V_AEC_H=0x0F;
   		V_AEC_L=0xFF;	
   }
   else
   {
   		Y = G + AEC_N;
		if(Y>=0x0FFF)
     	{
			V_AEC_H=0x0F;
   			V_AEC_L=0xFF;	
		}
	    else
		{
	    	V_AEC_H=*p;
   			V_AEC_L=*(p+1);	
	 	}

   }
   Put_AEC(V_AEC_H,V_AEC_L);
   
}


void R_Reverse()  //IRIS_Moto向右侧反转 
{
   IRIS_DIR=0;
   IRIS_RUN=1;
   Delay(200);	//反转时间由Delay函数控制
   IRIS_DIR=1;
   IRIS_RUN=1;
   Delay(1000);
}

void L_Reverse()  //IRIS_Moto向左侧反转 
{   
   IRIS_DIR=1;
   IRIS_RUN=0;
   Delay(200);	  //反转时间由Delay函数控制
   IRIS_DIR=1;		   
   IRIS_RUN=1;
   Delay(1000);
}

//--------------------------------------------//
//--2005-11-08                              --//
//--功能:光圈初始化   				        --//
//--说明:	                                --//
//--   光圈在最小最大两个位置运行一次,     --//
//--   然后回到中间位置                     --//
//--作者: 崔志立                           --//
//--------------------------------------------//
void InitIris()
{
	UpdataCurPos(); 
	Delay(100);
	UpdataCurPos();

    //光圈初始化位置1
	R_IRIS_Run_Flag=0xFF;
	L_IRIS_Run_Flag=0xFF;
	IRIS_TgtPos=0x0200;
	IRIS_Moto_Run();	 
	Delay(100);

    //光圈初始化位置2
	R_IRIS_Run_Flag=0xFF;
	L_IRIS_Run_Flag=0xFF;
	IRIS_TgtPos=0x0E00;
	IRIS_Moto_Run();	 
	Delay(100);

    //光圈初始化位置3
	R_IRIS_Run_Flag=0xFF;
	L_IRIS_Run_Flag=0xFF;
	IRIS_TgtPos=0x0800;
	IRIS_Moto_Run();	 
	Delay(100);

	R_IRIS_Run_Flag=0x00;
	L_IRIS_Run_Flag=0x00;
}
//--------------------------------------------//




⌨️ 快捷键说明

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