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

📄 program.c

📁 北京科技大学二队红外管程序这个是
💻 C
📖 第 1 页 / 共 2 页
字号:
		   }
		}
  }	

	for(i = 8; i >4; i--)
	{
		if(ucAD_Port&(1<<(i-1)))
		{
			sum++;
			temp+=(-((i-3)<<1));
		}
	}
	 
	for(i = 4; i >0; i--)
	{
		if(ucAD_Port&(1<<(i-1)))
		{
			sum++;
			temp+=(12-(i<<1));
		}
	}	 
	/****************************************************************************
	          根据传感器状态算出uiTurnAngel
  ***************************************************************************/			
	if(sum != 0)   
	{
	  scDeparture = (temp / sum);		
	  scLastDeparture = scDeparture;
    /*uiTurnAngle = PWM_Middle + (temp*PWM_ TOTAL)/(sum*10);  */
    
    if((scDeparture>=(-10))&&(scDeparture<(-3)) )
    {
       uiTurnAngle =( 23*scDeparture/7 + 154);// 153+6/7);  
    }  
    if((scDeparture>=(-3))&&(scDeparture<=3)) 
    {
       uiTurnAngle = scDeparture + 147;
    }                                                                           
    if((scDeparture>3)&&(scDeparture<=10))
    {
       uiTurnAngle = ( 23*scDeparture/7 + 139);//+1/7;         
    }      
  }
	else            
	{
	  if(scLastDeparture > 0)  uiTurnAngle = 173;
	  if(scLastDeparture < 0)  uiTurnAngle = 121;
	}
	
	/****************************************************************************/
	
	  if((scLastDeparture<=2)&&(scLastDeparture>=(-2)))   //中间
	  {
	    OutFlag = 0x02;
	  }
	  if(scLastDeparture > 2) //左边
	  {
	    OutFlag = 0x01;
	  }
	  if(scLastDeparture < (-2)) 		//右边
	  {
	    OutFlag = 0x04;
	  }
	  
	  /**************************************************/
	  
	 	temp = 0;    //清除temp	
	 	sum = 0;		 //清除计数值;
		StateB =0;   //清除StateB口的记录值,否则 
	  ucAD_Port = 0;
	  ucSensorState=0;//清除AD转换二值化结果
  return uiTurnAngle;
}

void Car_Electric_Brake(void) 
{
   if(ucDepartureDegree!=0)    //车不正 
    {
      if(uiPulse>=uiMaxSpeed-100) 
      {
         Dir_Back;		//继电器反向刹车
      } 
      if(uiPulse<=uiMinSpeed) //当速度小于最小时
      {
         Dir_Go;			 //继电器使电流正向,车加速
      }
    }
    if(ucDepartureDegree==0) 	 //如果车是正的
    {
      Dir_Go;				 //继电器使电流正向
    }  
}				 

void Car_Machine_Brake() 
{
	  /*  PWMDTY67 :  173-170----165-----147-----130-----124-121  中间147*/   
/*1
    if(PWMDTY67 >= 170) 	
    {
       if(uiPulse>500) 		
       {
         PWME_PWME5 = 0;  
         PTP_PTP5 = 1;		
         LeftBrake;    
       } 
       else
       {
         PWME_PWME5 = 1;  
         Start;				   
       }
    }*/
/*2
    else if((PWMDTY67 <170)&&(PWMDTY67 >= 165))	 
         {
           PWME_PWME5 = 1;  
           LeftBrake;   
         } */ 
/*3
         else if((PWMDTY67 <165)&&(PWMDTY67 >= 129)) 
              {
                 PWME_PWME5 = 1;  
                 Start;				
              }*/ 
/*4               
              else if((PWMDTY67 <129)&&(PWMDTY67 >= 124)) 
                   {
                      PWME_PWME5 = 1;  
                      RightBrake;   
                   }*/
/*5                    
                   else if(PWMDTY67<124) 
                        {
                          
                          if(uiPulse>550) 		
                          {
                            PWME_PWME5 = 0;  
                            PTP_PTP5 = 1;	   
                            RightBrake;        
                          } 
                          else
                          {
                             PWME_PWME5 = 1;  
                             Start;			     	

                          }  						    
                        }

}*/

void Car_Machine_Brake() 
{
	  /*  PWMDTY67 :  173-170----165-----147-----130-----124-121  中间147*/   
/*1*/
    if(scLastDeparture >= 9) 	
    {
       if(uiPulse>(uiMaxSpeed - 100)) 		 
       {
         PWME_PWME5 = 0;  
         PTP_PTP5 = 1;		
         LeftBrake;       
         delay10ms(5); 
         
       } 
       else
       {
         PWME_PWME5 = 1;  
         Start;				   
       }
    }
/*2 */ 
    else if((scLastDeparture <= 8)&&(scLastDeparture >= 6))	 
         {
           if(uiPulse>(uiMaxSpeed - 100)) 		
           {
             PWME_PWME5 = 0; 
             PTP_PTP5 = 1;		
             LeftBrake;      
            // delay10ms(3);  
           } 
           else
           {
             PWME_PWME5 = 1;  
             Start;				   
           }
         }
/*3*/ 
         else if((scLastDeparture <= 5)&&(scLastDeparture >= (-5))) 
              {
                 PWME_PWME5 = 1; 
                 Start;				    
              }
/*4*/               
              else if((scLastDeparture <= (-6))&&(scLastDeparture >= (-8))) 
                   {
                      if(uiPulse>(uiMaxSpeed - 100)) 		
                      {
                         PWME_PWME5 = 0;      
                         PTP_PTP5 = 1;	       
                         RightBrake;       
                         //delay10ms(3);        
                      } 
                      else
                      {
                         PWME_PWME5 = 1;       
                         Start;			     	    
                      } 
                   }
/*5*/                    
                   else if(scLastDeparture <= (-9)) 
                        {
                          
                          if(uiPulse>(uiMaxSpeed - 100)) 		
                          {
                            PWME_PWME5 = 0;       
                            PTP_PTP5 = 1;	        
                            RightBrake;        
                            delay10ms(5);      
                          } 
                          else
                          {
                             PWME_PWME5 = 1;  
                             Start;			     	
                          }           
                        }
}

/***********************************************************
速度控制函数,通过SIN函数实现
**********************************************************
uint Car_Speed_Control(uint max , uint min ,uint angle) 
{
    uint uiSpeed;					//通过计算返回的给PID的需要的速度值
    
    uiSpeed = (max-min)*sin((_M_PI/26)*angle - (136*_M_PI/26))/2 + (max+min)/2 ;
    
    return uiSpeed;
}		*/	

/*****************************************************************
速度控制函数,通过检测传感器偏离程度实现,当 -5~5时较快,ELSE较慢
*****************************************************************/
uint Car_Speed_Control(uint max , uint min) 
{
    uint uiSpeed;					//通过计算返回的给PID的需要的速度值
    if((scLastDeparture >=(-4))&&(scLastDeparture<=4)) 
    {
      uiSpeed = max;
    } 
    else if(((scLastDeparture >=(-7))&&(scLastDeparture<(-4)))||((scLastDeparture >4)&&(scLastDeparture<=7)))
         {
         		uiSpeed = (max + min) / 2;
         }
         else 
         {
            uiSpeed = min;
         }
    
    return uiSpeed;
}


/*===============================================================
主函数																															 
================================================================*/
void main() 
{
  Port_Init();
	PWM23_Init();
	PWM45_Init();
	PWM67_Init();	
 	init_7279();
	PIDInit();
	AD_Init();
	Pulse_Count_Init();
	
																														
	/*输入速度*/
	//输入速度最大值
  write7279(DECODE0+7,1);
	uiMaxSpeed=get_data(0,2);			
	delay10ms(50);
	//输入速度最小值
	write7279(DECODE0+7,2);
	uiMinSpeed=get_data(0,2);			
	delay10ms(50);					 
  //////////输入结束////////// 
  
  while(key);			 //按任意健开始  
	EnableInterrupts;//开总中断
  
  for(;;) 
  {	
		     PWMDTY67 = GetValue();						//控制舵机角度
           // Car_Electric_Brake();
           Car_Machine_Brake();
           sPID.vi_Ref = Car_Speed_Control(uiMaxSpeed,uiMinSpeed);
           dis_data(0,2,sPID.vi_Ref);
           dis_data(5,7,uiTurnAngle);
  }
}

/*===============================================================
定时器中断函数,20ms执行一次此函数
===============================================================*/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void Pulse_Count(void)
{	                 
  MCFLG_MCZF = 1; 
  uiPulse=PACN10;							 //读出脉冲计数值
  PACN10=0;
 // dis_data(0,2,uiSpeed);
 // dis_data(0,2,uiTurnAngle);
 // dis_data(5,7,uiPulse);
  sPID.vi_FeedBack=uiPulse;
  PWMDTY45=v_PIDCalc(&sPID);   
}
#pragma CODE_SEG DEFAULT

⌨️ 快捷键说明

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