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

📄 main.c

📁 “飞思卡尔”比赛用的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  TIOS=(TIOS|0x03);
  TCTL2=(TCTL2&~0x0f)|(TCTL2|0x05);
  TIE=(TIE|0x03);   // TC10 Interrupt Enable
  TFLG1=(TFLG1|0x03);
  PACTL=0x40;       //16-bit,下降沿触发,use prescaler timer clock
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 8 void OC0Isr(void){   //定时0.5s
     TC0=0;
     test_speed=PACN32;
     test_speed=test_speed*2+19;
     PORTB=~0x01;
     //if(kp>=2&&kp<=4)test_speed=test_speed+PACN32;
     PACN32=0;
     TFLG1=(TFLG1|0x01);
     
}
#pragma CODE_SEG DEFAULT 
 
 /*===============PID========================
 unsigned int  PID(unsigned int speed1,unsigned int test_speed,unsigned char s1,unsigned char s2)
{
  unsigned int x;
  unsigned int y;
  unsigned int cspeed;
	if      ( s1==0||s1==11&&s2==0xff)            s1= 3;//3;
	else if ((s1==0&&s2== 1)||(s1==10&&s2==11))   s1= 4;//4;         
	else if ( s1==1||s1==10&&s2==0xff)            s1= 5;//5;
	else if ((s1==1&&s2== 2)||(s1== 9&&s2==10))   s1= 6;//6;    
	else if ( s1==2||s1== 9&&s2==0xff)            s1= 7;//7; 
	else if ((s1==2&&s2== 3)||(s1== 8&&s2== 9))   s1= 8;//8;    
	else if ( s1==3||s1== 8&&s2==0xff)            s1= 9;//9; 
  else if ((s1==3&&s2== 4)||(s1== 7&&s2== 8))   s1= 9;//9;    
	else if ( s1==4||s1== 7&&s2==0xff)            s1= 10;//10;
	else if ((s1==4&&s2== 5)||(s1== 6&&s2== 7))   s1= 11;//11;    
	else if ( s1==5||s1== 6 &&s2==0xff)           s1= 12;//12;
  else if ( s1==5&&s2== 6)                      s1= 13;//13;
	speed1=Set_Speed[s1]*327;  //让满值200的pmw和65535对应
	cspeed=speed1;                 //用于判断用
	ebb=eb;
	eb=e;
	e=speed1-test_speed;
  x=e-eb; //kp=0.11
  x=x>>7; //先整除是为了不溢出,先乘的话,可能溢出(也就是话值大于65535)
  x=x*14;
	y=e-2*eb+ebb; //kd=0.009
	y=y>>10;
	y=y*9;
	speed1=speed1+x+y;
	if((speed1>cspeed&&speed1-cspeed<30) || (speed1<cspeed&&cspeed-speed1<30)){
	  speed1=cspeed;
	}
	test_speed=speed1;
	speed1=speed1/327;
	return speed1;
} */

 /*================PID==========================*/
unsigned int  PID(unsigned int speed1,unsigned int test_speed,unsigned char s1,unsigned char s2)
{                  //kp=0.01,kd=0.005
                   //kp=0.01,kd=0.01 
                   //kp=0.02,kd=0.005 
  unsigned int x;
  unsigned int y;
/*	if      ( s1==0||s1==11&&s2==0xff)            s1= 3;
	else if ((s1==0&&s2== 1)||(s1==10&&s2==11))   s1= 4;         
	else if ( s1==1||s1==10&&s2==0xff)            s1= 5;
	else if ((s1==1&&s2== 2)||(s1== 9&&s2==10))   s1= 6;    
	else if ( s1==2||s1== 9&&s2==0xff)            s1= 7; 
	else if ((s1==2&&s2== 3)||(s1== 8&&s2== 9))   s1= 7;    
	else if ( s1==3||s1== 8&&s2==0xff)            s1= 8; 
  else if ((s1==3&&s2== 4)||(s1== 7&&s2== 8))   s1= 8;    
	else if ( s1==4||s1== 7&&s2==0xff)            s1= 9;
	else if ((s1==4&&s2== 5)||(s1== 6&&s2== 7))   s1= 9;    
	else if ( s1==5||s1== 6 &&s2==0xff)           s1= 10;
  else if ( s1==5&&s2== 6)                      s1= 11;
  */
  if      ( s1==0||s1==11&&s2==0xff)            s1= 5;
	else if ((s1==0&&s2== 1)||(s1==10&&s2==11))   s1= 5;         
	else if ( s1==1||s1==10&&s2==0xff)            s1= 6;
	else if ((s1==1&&s2== 2)||(s1== 9&&s2==10))   s1= 6;    
	else if ( s1==2||s1== 9&&s2==0xff)            s1= 7; 
	else if ((s1==2&&s2== 3)||(s1== 8&&s2== 9))   s1= 7;    
	else if ( s1==3||s1== 8&&s2==0xff)            s1= 8; 
  else if ((s1==3&&s2== 4)||(s1== 7&&s2== 8))   s1= 8;    
	else if ( s1==4||s1== 7&&s2==0xff)            s1= 9;
	else if ((s1==4&&s2== 5)||(s1== 6&&s2== 7))   s1= 9;    
	else if ( s1==5||s1== 6 &&s2==0xff)           s1= 10;
  else if ( s1==5&&s2== 6)                      s1= 11;
	speed1=Set_Speed[s1]*10; 
	ebb=eb;
	eb=e;
	e=speed1-test_speed;
  x=(e-eb)*10;        //kp=0.01     0.02      0.01
  x=x>>10; 
	y=(e-2*eb+ebb)*5;  //kd=0.01     0.005      0.0005
	y=y>>10;
	speed1=speed1+x+y;
	test_speed=speed1;
	speed1=speed1/10;
	return speed1;
} 
 
/*================PID==========================
unsigned int PID(unsigned int speed1,unsigned int test_speed,unsigned char s1,unsigned char s2)
{           //只用PD调节
  //kp= 0.01;
  //kd= 0.13;
  unsigned int x;
  unsigned int y;
  //unsigned int cspeed;
	if      ( s1==0||s1==11&&s2==0xff)            s1= 3;
	else if ((s1==0&&s2== 1)||(s1==10&&s2==11))   s1= 4;         
	else if ( s1==1||s1==10&&s2==0xff)            s1= 5;
	else if ((s1==1&&s2== 2)||(s1== 9&&s2==10))   s1= 6;    
	else if ( s1==2||s1== 9&&s2==0xff)            s1= 6; 
	else if ((s1==2&&s2== 3)||(s1== 8&&s2== 9))   s1= 7;    
	else if ( s1==3||s1== 8&&s2==0xff)            s1= 7; 
  else if ((s1==3&&s2== 4)||(s1== 7&&s2== 8))   s1= 8;    
	else if ( s1==4||s1== 7&&s2==0xff)            s1= 8;
	else if ((s1==4&&s2== 5)||(s1== 6&&s2== 7))   s1= 9;    
	else if ( s1==5||s1== 6 &&s2==0xff)           s1= 9;
  else if ( s1==5&&s2== 6)                      s1=10;
  
	ebb=eb;
	eb=e;
	e=Set_Speed[s1]-test_speed;
  x=e-eb;
  x=x*3;
  x=x/256;
	y=e-2*eb+ebb; 
	y=y*17;
  y=y/128;
	speed1=Set_Speed[s1]+y+x;
	//test_speed=speed1;
	return speed1;
}
   */
  
/*=================Steer=======================*/
unsigned int  rotate(unsigned char s1,unsigned s2)  //有待于改进,只是粗略的处理
{
 
  /*if     (s1==11&&s2==0xff)            return 1835;//Right_5;};    142       144
	else if(s1==10&&s2==11)                return 1830;//Right_5;}; 140   143
	else if(s1==10&&s2==0xff)              return 1786;//Right_4;}	    139       142
	else if(s1==9&&s2==10)                 return 1744;//Right_4;}	 137   141
	else if(s1==9&&s2==0xff)               return 1703;//Right_3;	    136       140
	else if(s1==8&&s2==9)                  return 1662;//Right_3;	 134   130
	else if(s1==8&&s2==0xff)		           return 1623;//Right_2;};    133       125
	else if(s1==7&&s2==8)		               return 1585;//Right_2;}; 131   121
	else if(s1==7&&s2==0xff)		           return 1547;//Right_1;};    130       119
	else if(s1==6&&s2==7)		               return 1511;//Right_1;}; 128   117
	else if(s1==6&&s2==0xff)               return 1503;	
*/if     (s1==11&&s2==0xff)              return 1835;//Right_5;};    142       144
	else if(s1==10&&s2==11)                return 1830;//Right_5;}; 140   143
	else if(s1==10&&s2==0xff)              return 1793;//Right_4;}	    139       142
	else if(s1==9&&s2==10)                 return 1758;//Right_4;}	 137   141
	else if(s1==9&&s2==0xff)               return 1723;//Right_3;	    136       140
	else if(s1==8&&s2==9)                  return 1685;//Right_3;	 134   130
	else if(s1==8&&s2==0xff)		           return 1640;//Right_2;};    133       125
	else if(s1==7&&s2==8)		               return 1595;//Right_2;}; 131   121
	else if(s1==7&&s2==0xff)		           return 1552;//Right_1;};    130       119
	else if(s1==6&&s2==7)		               return 1511;//Right_1;}; 128   117
	else if(s1==6&&s2==0xff)               return 1503;		
	
	else if(s1==5&&s2==6)                  return 1500;//Middle;};  127   116

  else if(s1==5&&s2==0xff)               return 1496;//Middle;};     127       115	
	else if(s1==4&&s2==5)		               return 1487;//Left_1;};  123   114
	else if(s1==4&&s2==0xff)		           return 1446;//Left_1;};     121       112
	else if(s1==3&&s2==4)		               return 1406;//Left_2;};  117   110
	else if(s1==3&&s2==0xff)		           return 1367;//Left_2;};     115       106
	else if(s1==2&&s2==3)		               return 1330;//Left_3;};  111   104
	else if(s1==2&&s2==0xff)		           return 1293;//Left_3;};     109       102
	else if(s1==1&&s2==2)                  return 1258;//Left_4;};  105   100
	else if(s1==1&&s2==0xff)               return 1223;//Left_4;};     103        99
	else if(s1==0&&s2==1)                  return 1190;//Left_5;};    99    98
	else if(s1==0&&s2==0xff)               return 1185;//Left_5;};      97   
	return Middle; 
  /*else if(s1==5&&s2==0xff)             return 1497;//Middle;};     127       115	
	else if(s1==4&&s2==5)		               return 1489;//Left_1;};  123   114
	else if(s1==4&&s2==0xff)		           return 1453;//Left_1;};     121       112
	else if(s1==3&&s2==4)		               return 1419;//Left_2;};  117   110
	else if(s1==3&&s2==0xff)		           return 1386;//Left_2;};     115       106
	else if(s1==2&&s2==3)		               return 1353;//Left_3;};  111   104
	else if(s1==2&&s2==0xff)		           return 1321;//Left_3;};     109       102
	else if(s1==1&&s2==2)                  return 1290;//Left_4;};  105   100
	else if(s1==1&&s2==0xff)               return 1259;//Left_4;};     103        99
	else if(s1==0&&s2==1)                  return 1230;//Left_5;};    99    98
	else if(s1==0&&s2==0xff)               return 1225;//Left_5;};      97   
	return Middle; 
	*/ 	
/*	else if(s1==5&&s2==0xff)               return 1497;//Middle;};     127       115	
	else if(s1==4&&s2==5)		               return 1489;//Left_1;};  123   114
	else if(s1==4&&s2==0xff)		           return 1454;//Left_1;};     121       112
	else if(s1==3&&s2==4)		               return 1420;//Left_2;};  117   110
	else if(s1==3&&s2==0xff)		           return 1388;//Left_2;};     115       106
	else if(s1==2&&s2==3)		               return 1356;//Left_3;};  111   104
	else if(s1==2&&s2==0xff)		           return 1324;//Left_3;};     109       102
	else if(s1==1&&s2==2)                  return 1294;//Left_4;};  105   100
	else if(s1==1&&s2==0xff)               return 1264;//Left_4;};     103        99
	else if(s1==0&&s2==1)                  return 1235;//Left_5;};    99    98
	else if(s1==0&&s2==0xff)               return 1230;//Left_5;};      97   
	return Middle;  */


}  	

void main(void) {
  interrupt_init();
  ADC_init();
  PWM_init();
  num1=0;
  e=0;
  eb=50;
  ebb=50;
  speed=50;
  test_speed=50;
  state[0]=0xff;
  state[1]=0xff;
  state[2]=0xff;
  //kp=0;
  //EnableInterrupts;
  PWM_01(70,200);
  PWM_23(70,200);
  //PWM_45(1190,2000); //middle
for(;;) {
    //if (kp==4) {
       //PORTB=~((unsigned char)test_speed); //测速度程序
       //PWM_01(0,200);
       //PWM_23(0,200);
    //} 
     ADC0_12();
     num1++;  
   /*=======================judge================== */  
   if(num1==1) {
       former_sensor=now_sensor;
	     now_sensor=LED;
	     if(former_sensor==now_sensor&&(state[1]==5||state[1]==6)) //直线加速
	    {
		     steer=Middle;
		     directcount++;
		     if(directcount==0xff)directcount=0xfe;
		     if(directcount>=0x08) 
			    speed=Set_Speed[12];		     
		      PWM_01(speed,200);
          PWM_23(speed,200);
          PWM_45(steer,2000);
		      outcount=0;
      	}
    	else if(now_sensor==0x0fff)	    //十字交叉路线
	    {
		     steer=Middle;
		     directcount++;
		     if(directcount==0xff)directcount=0xfe;
	       if(directcount>=0x08)speed=Set_Speed[12];		  //直线加速
	       PWM_01(speed,200);
         PWM_23(speed,200);
         PWM_45(steer,2000);
         outcount=0;
	     }
	     else if(state[0]==0&&state[1]==0xff&&state[2]==0xff)  //跑出跑道
	    {
	       outcount++;
		     if(outcount>=0x0a)               //冲出去情况还要再考虑
		     {                                 //万一有干扰,出问题,回不去
			     if(steer>=Big_Right) {
			      steer=Big_Right+5;
			     }
		    	 if(steer<=Big_Left) {
		    	  steer=Big_Left-5;
		    	 }
			     speed=Set_Speed[4];//
			     PWM_01(speed,200);
           PWM_23(speed,200);
           PWM_45(steer,2000);
	      	}
		      if(outcount==0xff)outcount=0xfe;
		      directcount=0x00;
	      }
	    else if((state[1]!=0xff&&state[2]!=0xff)||(state[1]!=0xff&&state[2]==0xff))
	    {                                      //弯道
	    	steer=rotate(state[1],state[2]);
	    	speed=PID(speed,test_speed,state[1],state[2]);
	      PWM_01(speed,200);
        PWM_23(speed,200);
        PWM_45(steer,2000);
	    	outcount=0;
	    	directcount=0x00;
	    }
	      if(former_sensor!=now_sensor) state[0]=0;  
	      if(state[0]==0xff) state[0]=state[0]-1;
	      state[1]=0xff;
	      state[2]=0xff; 
     }    
  }
}

⌨️ 快捷键说明

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