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

📄 新建 文本文档.txt

📁 单片机(MC9S12DG128)作为智能小车的检测和控制核心 CMOS传感器 路径识别 智能小车 PWM控制
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	get_offset();
	get_avr();


}

void soft_init(void)
{
	unsigned char i;

/* 初始化全局变量 */
	vspeed=0;

	flagA=LSPEED;
	flagB=NONE;
	flagBLIND=NONE;
	zcount=2000;
	cum_timer=0;

/* 机体初始化 */

	fPWM(0); //正中

	p=0;
																	
	do 
	{
		refresh_vspeed();
		getnewdata();
		repeat_data();
	}while (current.d_dep != NOERROR);
	get_offset();
	get_avr();
	current.step=1;
	arr[p]=current;
}
void PID_func(struct PID sPID)	//通用算法,两个模块的共用算法
{
	double rOut; 
	double rIn; 
	PIDInit ( &sPID ); 
	sPID.Proportion = Kp; // Set PID Coefficients
	sPID.Integral = Kintegral;
	sPID.Derivative = Kderivative
	sPID.SetPoint = Spoint; // Set PID Setpoint
	rIn = pid_input ();
	rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation
}

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

unsigned int d[8] , d_aver , out_f  ;     //存储探头数据,探头平均值
unsigned finder_d , finder_d2 ;             //平均值差值
unsigned int speed , speed_b ;	 //储存小车速度
unsigned int d_state ;           //储存探头状态
unsigned int s_cyc , cycle , suddcyc;             //测速度用计数器
unsigned int keepspeed = 100 , speed_f  ;   //最高速度限制 , 脱离跑道标志
unsigned long distanse = 0  ;          //记录路程
unsigned int distanse_s = 0 , distanse_f ;
unsigned int brake_cyc = 100 , brake_f ;    //刹车
int black , black_temp , black_change ;              //促存黑条位置,黑条标志
void delay (unsigned i)
 { while ( --i ) ;
 }

void distanse_action ( void ) 
{
	   // if ( black < 7 && black > -7 )	 
	 	      distanse_s += black > 0 ? black : -black ;
	   // if ( black == 7 || black == -7 )
	   //     distanse_s += 5 ;
	      if ( black_temp != black )
	           black_change = 1 ;
	      if ( black_temp == black )
	           black_change = 0 ;
	      black_temp = black ;
	   
  	 if ( distanse % 3 == 0 )
  	  {
  	   distanse_f = distanse_s ;
  	   distanse_s = 0 ;
  	  }
  	  
} 
/*-----------电机动作-----------*/

void moto_action ( void ) 
{
	   if ( brake_cyc > 19 )
	   {    
              if ( distanse_f < 10 ) 
	            {    
                  		 keepspeed += 2 ;
                  if ( black < 4 && black > -4 )
                       keepspeed += 2 ;
                  if ( black < 2 && black > -2 )
                       keepspeed += 2 ; 
                  if ( keepspeed > 220 ) keepspeed = 220 ;  
          	  }

          	  if ( distanse_f > 9 ) 
          	  {        
                  		 keepspeed -= 4 ;
                  	if ( keepspeed < 80 )  keepspeed = 80 ;
                  		 FORWARD = 0 ;
							//	if ( black == 7 || black == -7 ) 
							//	 {
							//	     keepspeed = 100 ;
							//	 }
								  
          	  }  
          	  if ( black_change == 1 ) 
          	  { 
          	       keepspeed -= 35 ; 
          	     	if ( keepspeed < 80 )  keepspeed = 80 ; 
          	  		 black_change == 0 ;
          	  }
                  if ( speed < keepspeed )
               	     	if ( FORWARD < FULLPOWER )		 //最高限速
                           FORWARD += 5 ;
              	  if ( speed > keepspeed )   
                      if ( FORWARD > LOWPOWER )		 //最低限速
                           FORWARD = 120 ;  
	     }
    if ( distanse_f > 13 && speed > 110  )		  //刹车
    {
       brake_cyc = 16 ;
       if ( speed > 130 )
            brake_cyc = 14 ;       
       if ( speed > 150 )
            brake_cyc = 14 ;
    }
    if ( brake_cyc < 20 ) 
    {	 
       //  brake_f = 1 ; 
       if ( brake_cyc %4 > 1 ) 	    //防暴死急刹车
       { 
         BELL = BELLON ;
         FORWARD = 0 ;
         RETURN = 205 ;
       }
       if ( brake_cyc %4 < 2 ) 
       {
       	 BELL = BELLON ;
         FORWARD = 0 ;
         RETURN =  0 ;
       }
        
    }
    if ( brake_cyc > 19 ) 
    {		
    		 BELL = BELLOFF ;
         RETURN = 0 ;
       //  brake_f = 0 ;
    }
      						
}
/*-----------舵机动作-----------*/
   

 void helm_action ( void )
 {
		 		          /*31_19		小了向右转,大了向左转	 */
 				 switch ( black ) 
           {     
            case -5 : PWMDTY7 = 30 ; break ;      
            case -4 : PWMDTY7 = 28 ; break ;     
            case -3 : PWMDTY7 = 27 ; break ;      
            case -2 : PWMDTY7 = 26 ; break ;     
            case -1 : PWMDTY7 = 25 ; break ;     
            case 0 : PWMDTY7 = 25 ; break ;
            case 1 : PWMDTY7 = 25 ; break ;
            case 2 : PWMDTY7 = 24 ; break ;
            case 3 : PWMDTY7 = 23 ; break ;
            case 4 : PWMDTY7 = 22 ; break ;
            case 5 : PWMDTY7 = 20 ; break ;           
           }
}
/*-----------速度计算-----------*/
void getspeed ( void )
 {	ulong p ;
    p = TC0H ;

         if ( s_cyc < 210 )   
              s_cyc ++ ;
         if ( PA0H > 0 )
          {  
            if ( s_cyc > 2 ) 
                speed = 4000/s_cyc ;
            s_cyc = 0 ;
            distanse ++ ;   //路程增加
            distanse_action() ;
          }
         if ( s_cyc > 40 )
           speed = 0 ;
         if ( s_cyc > 40 )
           distanse_f = 0 ;
         if ( s_cyc > 40 )
           black_change = 0 ;
   
 }
/*---------计算黑条位置---------*/
void getd_state ( void ) 
{  
	 unsigned int state_count = 0 ;
             if ( d[3] < d_aver - finder_d )			//4探头
                {
                  black = -1 ;
                  state_count ++ ;
                  d_state = 1 ;
                }
              
             if ( d[1] < d_aver - finder_d )			//2探头_优先
                {
                  black = -3 ;
                  state_count ++ ;
                  d_state = 1 ;
                }
                  
             if ( d[5] < d_aver - finder_d )			//6探头
                {
                  black = 2 ;
                  state_count ++ ;
                  d_state = 1 ;
                }
              
             if ( d[6] < d_aver - finder_d )			//7探头
                {
                  black = 3 ;
                  state_count ++ ;
                  d_state = 1 ;
                }
                
             if ( d[0] < d_aver - finder_d )     //1探头_优先
                {
                  black = -4 ;
                  state_count ++ ;
                  d_state = 1 ;
                }
                  
             if ( d[2] < d_aver - finder_d )			//3探头_优先
                {
                  black = -2 ;
                  state_count ++ ;
                  d_state = 1 ;
                } 
                
             if ( d[4] < d_aver - finder_d )			//5探头_优先
                {
                  black = 1 ;
                  state_count ++ ;
                  d_state = 1 ; 
                }             
             if ( d[7] < d_aver - finder_d )			//8探头_优先
                {
                  black = 4 ;
                  state_count ++ ;
                  d_state = 1 ; 
                }          
              if (  4 == black ) 
                {
                  out_f = 1 ;
                } else
                    out_f = 0 ;  
                
              if ( 1 == out_f && 0 == state_count ) 
                {
                  d_state = 0 ;
                  black = 5 ; 
                }
                
              if (  -4 == black ) 
                {
                  out_f = 1 ;
                } else
                    out_f = 0 ;  
                
              if ( 1 == out_f && 0 == state_count ) 
                {
                  d_state = 0 ;
                  black = -5 ; 
                }  		
}
/*--------获取探头数据---------*/
void getnewdata ( void )
{   unsigned char sta0, sta1;
    unsigned int i ;
     sta0 = ATD0STAT0;
     sta1 = ATD0STAT1;

    /*---------ATD0----------*/  
  if (ATD0STAT0 & ATD0STAT0_SCF_MASK) 
  {

    	 d[0] = ATD0DR1;
       d[1] = ATD0DR0;
       d[2] = ATD0DR2;
       d[3] = ATD0DR3;
       d[4] = ATD0DR5;
       d[5] = ATD0DR7;
       d[6] = ATD0DR6;
       d[7] = ATD0DR4;

   }  
        /*------计算平均值--------*/
     for ( i = 0 , d_aver = 0 ; i < 8 ; i++ )
          d_aver += d[i] ;
        d_aver = d_aver/8 ;    //计算出平均值
          
     finder_d = d_aver/2 ;    
     finder_d2 = d_aver/10 ;  
}
 void hardware_init()
{
	/* 硬件初始化,包括启动定时器(放到最后一行)
	 * 此函数结束之后可以马上进入循环 */
	  /*--设置定时器寄存器--*/
     MCCTL = 0xec ;
     MCCNT = 0x5a00 ;
    /*--------------------*/
    /*--设置AD寄存器------*/
     ATD0CTL2 = ATD0CTL2_ADPU_MASK;
     ATD0CTL3 = 0x00;    // 启用1通道转换队列
     ATD0CTL5 = 0xB0;    // 启动10位AD转换,数据右对齐,自动连续转换    
     ATD1CTL2 = ATD0CTL2_ADPU_MASK ;
     ATD1CTL3 = 0x00;    // 启用1通道转换队列
     ATD1CTL5 = 0xB0;    // 启动10位AD转换,数据右对齐,自动连续转换
    /*--------------------*/
    /*--------------------设置PWM寄存器------------------*/
    /*--PWM7控制舵机,PWM5控制探LED,PWM0,PWM1控制驱动电机------*/
     
     PWMPOL = 0x80 ;      /*设置PWM7(舵机)极性*/
     PWMCLK = 0xa0 ;			/*PWM以SB为始终源,PWM5以SA为始终源,PWM4以A为始终源*/
     PWMPRCLK = 0x72 ;    /*设施始终源分频系数*/
     PWMSCLA = 0x10 ;     /*SA为A的三十二分之一倍*/
     PWMSCLB = 0x05;      /*SB为B的四十分之一倍*/        
     PWMPER5 = 0x40 ;     /*设置红外LED频率*/  
     PWMDTY5 = 0x20 ;             
     PWMPER7 = 0xba;			/*设置舵机PWM周期*/
     PWMDTY7 = 12 ;       /*舵机处在中间*/
     PWMPER4 = 0xf0 ;			/*设置电机PWM周期-为了自加时不溢出设为240*/
     PWMPER0 = 0xf0 ;			/*设置电机PWM周期-为了自加时不溢出设为240*/
     PWMPER1 = 0xf0 ;			/*设置电机PWM周期-为了自加时不溢出设为240*/
     //PWMDTY4 =  80;
     PWME = 0xb3;            /*开启通道7,5,4 ,1,0*/
     PWMDTY0 = 0 ;
     PWMDTY1 = 180 ;
    /*-------------------- */
    /*---设置输入捕捉----- */
     TCTL4 = 0xF6 ;
     ICPAR = 0x0f ;   
     ICSYS = 0x02 ;    
     PACTL = 0x02 ;
     /*--------------------*/
     DDRJ = 0xff ;                /*PORTJ口方向定义*/
     DDRA = 0x81 ;				 /*PORTA口方向定义*/
     DDRB = 0xfe ;
     PORTB = 0xff ;
     PUCR_PUPAE = 0x03 ;
     PORTA_BIT0 = 1 ;
     PORTA_BIT1 = 1 ;
}

 /*------1毫秒中断-------*/
interrupt void test() 
{    unsigned int i ;
    // PORTB =~PORTB;            /*用于程序运行指示*/
     MCCNT = 0x5a00 ;            /*定时器寄存器赋初值*/
     MCFLG = 0x80 ;              /*清楚中断标志位*/
     
     cycle ++ ;
 if ( brake_cyc < 100  )
      brake_cyc ++ ;		       //刹车
      
     getspeed () ;
     getnewdata() ;
     getd_state() ;
     helm_action() ;
     moto_action() ;
           
    if ( PORTA_BIT1 == 1 ) 
       {
         if ( suddcyc < 2000 )
              suddcyc ++ ;
         
         if ( suddcyc < 1000 )
              FORWARD = 0 ;
       }
 
      PORTB_BIT0 = 0 ; 
    
    if ( PORTB_BIT0 == 0 ) 
       {  delay ( 1000 ) ;
          if ( PORTB_BIT0 == 0 )
           {
              delay ( 1000 ) ;
             if ( PORTB_BIT0 == 0 )
            {
            
                 FORWARD = 0 ;   //电机不动
            	   suddcyc = 0 ;
            if(cycle > 300 )
               {
                for ( i = 0 ; i < 8 ;i++ )
                   printp("%D " , d[i] ) ;
                   printp("speed:%5D" ,speed ) ;
                   printp("keepspeed:%d" ,keepspeed ) ;
                   printp("d_state:%d black:%d" , d_state , black ) ;
                   printp("FORWARD:%d\n" , FORWARD ) ;
                cycle = 0 ;
                }
           }
           }
       }
}


void main(void)
 {
	unsigned char i;
	soft_init();
	EnableInterrupts;	/*总中断开启*/
	hardware_init();
	printp (" start\n ") ;  
	while (1)
	{
		control_Check();
		parameter_Modify();
#ifdef DESK_DEBUG
		if (current.d_dep==0)
		{
		}
		else
		{	printp("W");
		}
		for (i=0;i<8;i++) printp("%d ",current.d[i]);
		printp("%d%d%d%d[%d]%d%d\n",current.avr,current.vspeed,p,zcount,current.l,current.vspeed , arr[(p+1)%2].vspeed);
#endif
	}
    
  }

⌨️ 快捷键说明

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