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

📄 main.c

📁 飞思卡尔智能车竞赛程序飞思卡尔智能车竞赛程序飞思卡尔智能车竞赛程序
💻 C
📖 第 1 页 / 共 2 页
字号:


#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#include "../../header/s12/s12.h"

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b	"

#include "main_asm.h" /* interface to the assembly module */


#define PING 1
#define PONG 0
#define SAMPLENUM 93 //97
#define VIDEO_LEFT   8
#define VIDEO_RIGHT 92
#define SAMPLELINE 15
#define TOTALNUM 1164
#define VALVE 17
#define VIDEO_CENTER 52
#define VIDEO_CENTER_TOP 52
#define SERVO_CENTER 1510
#define SERVO_RIGHT 1320//1900  //1300
#define SERVO_LEFT  1720//1250  //1700
#define PROPOTION0 2
#define PROPOTION1 3
#define PROPOTION2 6
#define DERIVATIVE 1
//#define _DEBUG
//#define _SEND
//#define _AUTOSTOP
//#define _REGULATER
//#define _CENTER
//#define _LEFT
//#define _RIGHT  

void Init_ADC(void);
void Init_Capture(void);
void GetImage(void );
unsigned char  scan(register unsigned char *p);
unsigned char  scan2(register unsigned char *p);
unsigned char  GetLine(void);
void  Init_servo(void);
void  Init_motor(void);
void Car_control(void);
void filter(void);
void sci_init(void);
void sci_send(unsigned char ch);
void send(unsigned char *p) ;
void Speed_init(void);
void Speed_Control(void);
void find_Cur(void);
unsigned char find_S(void);

 static unsigned char x,y,SkipNum;
 static  unsigned char ImagePing[SAMPLELINE][SAMPLENUM];
 static unsigned char ImagePong[SAMPLELINE][SAMPLENUM];
 static  char ImagePar[SAMPLELINE];
 static char ImagePar2[SAMPLELINE];
 static char TimeCount=0;
 static char ImageGood[SAMPLELINE];
 unsigned char *ImageRDY;
 unsigned char PingOrPong;
 unsigned char PingSampling;
 unsigned char PongSampling;
 unsigned char Sampling=1;
 unsigned int  Sample_speed=0;
 char  Set_speed=0;
 unsigned int servoScale=SERVO_CENTER;
 unsigned int Last_servoScale=SERVO_CENTER;
 unsigned char Porpotion;
 unsigned char Sample_time=0;
 unsigned char Image_good=0;
 signed char top=0;
 unsigned char Front=0;
 unsigned char ON_THE_LINE=0;
 unsigned char ON_THE_S=0;
 
 static unsigned char const Speed_Tab[23]={
 23, //0
 22, //1
 10, //2
 10, //3
 10, //4
 10, //5
 20, //6
 19,//7
 18,//8
 18,//9
 18,//10
 17,//11
 17,//12
 17, //13
 17,//14
 15, //15
 10, //16
 5,  //17
 10,  //18
 10,   //19
 10,   //20
 10,   //21
 10  // 22
 } ;
 /*
 static unsigned char const P_Tab[12]= {
 5,//0
 5,//1
 5,//2
 5,//3
 5,//4
 6,//5
 6,//6
 6,//7
 6,//8
 6,//9
 5,//10
 5//11 
 }  ;
   */
 int Speed=0;
 int err_speed=0;
 int err=0;
 int LastErr=0;
 int errTop=0;	   
 int cur=0;   //curvature
 #ifdef _AUTOSTOP
  unsigned char errCount=0;
 #endif 
 
#pragma CODE_SEG __NEAR_SEG  NON_BANKED
/*******************************************/
interrupt void GetImageIsr(void) {  //CAPTURE ISR、场中断
     
     
     TCTL4_EDG0B^=1;	 //场同步捕捉信号翻转
     TCTL4_EDG0A^=1;
     
     TIE_C1I^=1;
    // PORTB_BIT0^=1;   //PING PONG INDICATOR  PORTB_BIT0位每采集一场数据翻转一下,这信号拔掉BDM后用示波器观察正常
    
     
    if (Sampling==1) {
     Sample_speed=PACN32;
     PACN32=0;
      x=0;y=0; SkipNum=0;Sampling=0; TFLG1_C1F=1;		//START ONE FRAME 
    } else {
      Sampling=1;
      if (PingOrPong==PING) {
        
          PingOrPong=PONG;		 //END OF ONE FRAME 
          PingSampling=0;
          PongSampling=1; 
         }else{
          PingOrPong=PING;
          PingSampling=1;
          PongSampling=0; 
         
         }
          #ifdef _DEBUG
          TIE_C1I=0;
          TIE_C0I=0;
         #endif 
        TFLG1_C1F=1;
        

    }
    TFLG1_C0F=1;			 //clear场同步interrupt flag 
    
}
/*******************************************/
interrupt void ReadLine(void) {    //IRQ 行中断
 register unsigned char i;
 register unsigned char *p;
 
 SkipNum++  ;
 if(SkipNum==20) {
  

 ATD0CTL5=0XA0;
 //PORTB_BIT1=1;   //AD开始采集数据时输出一个高电平
 if (PingOrPong==PING)
   p=&ImagePing[y][0];
 else
    p=&ImagePong[y][0];
 for (i=0;i<SAMPLENUM;i++) {
     while(ATD0STAT0_SCF==0);
      *p++= ATD0DR0L;
 }
 //PORTB_BIT1=0; //采集完后输出一个低电平,这些信号在拔掉BDM后也能正常出来的
 ATD0CTL5=0X00;
 SkipNum=0;

 y++;
 }
  TFLG1_C1F=1;//清除行中断标志
}

#pragma CODE_SEG DEFAULT


/*******************************************/
void main(void) {
  /* put your own code here */
  #ifdef _DEBUG
    unsigned char i;
  #endif 
  asm_main();
  DDRB=0XFF;
  Delay1ms(1000);
  DDRB=0X00;
  Delay1ms(1000);
  DDRB=0XFF;
  Delay1ms(1000); 
  DDRB=0Xff;
  PORTB=0XFF;
  INTCR_IRQEN=0; //DISABLE IRQ  
  TIE_C0I=0; //DISABLE CAPTURE INTERRUPT
 // LCD_LcmInit();
  Speed_init();
  Init_servo();  
  Init_motor();
  #ifdef _DEBUG
    sci_init();
  #endif 
 
  EnableInterrupts;
  
  #ifndef _DEBUG
  GetImage(); 
  for(;;) {}
  #else
    for(;;){
     TFLG1_C0F=1;
      TFLG1_C1F=1;
        
     GetImage();
     		 for (i=0;i<SAMPLELINE;i++)
 			    ImagePing[i][ImagePar[i]]=0;
 			#ifdef _SEND   
      send(&ImagePing[0][0]);
      #endif 
    }
  #endif 
  /* wait forever */
  /* please make sure that you never leave this function */
}
/*******************************************/
void Init_ADC(void) {
   
  ATD0CTL2=0XC0;  //POWER UP ADC ,DISABLE INTERRUPT 
  asm("nop");      //warm up 
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  ATD0CTL3=0X08; 
  ATD0CTL4=0X80; 
  ATD0DIEN=0X00;
}
/*******************************************/
void Init_Capture(void) {
 TIOS_IOS0=0;  //INPUT CAPTURE ,VS INPUT
 TIOS_IOS1=0;  //INPUT CAPTURE ,HS INPUT
 TSCR1_TEN=1; //ENABLE TIMER 

 TCTL4_EDG0A=1; //  capture rising edge first
 TCTL4_EDG0B=0;
 
 TCTL4_EDG1A=1;
 TCTL4_EDG1B=0;
 
  x=0;y=0;
  TIE_C0I=1;  //ENABLE  CAPTURE INTERRUPT 
}
/*******************************************/
void GetImage(void) {

PingOrPong=PING; //SAMPLING PING FIRST 
Sampling=1;
PingSampling=1;
PongSampling=0;
Init_ADC();
Init_Capture();   //START SAMPLING 
#ifndef _DEBUG
for(;;) 
#endif 
{

 if (PingOrPong==PING) {
    // PORTB_BIT3=1; 
  while(PingSampling==1);
// control code
  //PORTB_BIT4=1;    
 	ImageRDY=&ImagePing[0][0];

 }
 else
 {
   // PORTB_BIT3=0;  
 
  while(PongSampling==1);
  //control code 								 //等待一场信息采集完
   //PORTB_BIT4=1;
   ImageRDY=&ImagePong[0][0];
 }
    Car_control();//控制舵机
    Speed_Control();
   // PORTB_BIT4=0;
}
  
}          
/******************************************/
  
unsigned char   GetLine(void) {
  unsigned char *p;
  volatile char i=0;
  unsigned int tc=0;
  char d=0;
  i=0;
  p=ImageRDY+VIDEO_LEFT;
  for (i=0;i<SAMPLELINE;i++) {
  *p=75;
  p+=SAMPLENUM;
  }
   p=ImageRDY+VIDEO_RIGHT;
  for (i=0;i<SAMPLELINE;i++) {
  *p=63;
  p+=SAMPLENUM;
  }
  p=ImageRDY;
  for (i=0;i<SAMPLELINE;i++) {
    ImagePar[i]=scan(p);								//比较从右向左和从左向右扫描获得的黑线位置的差异,如果大于2则认为此行数据有误,否则的话则认为没有
    ImagePar2[i]=scan2(p);
    if ((ImagePar2[i]>ImagePar[i]+2||ImagePar[i]>ImagePar2[i]+2)||ImagePar[i]==0) {
   
      ImagePar[i]=0;
      ImageGood[i]=0;
    } else {
      ImageGood[i]=1;
    }
       
    
    p=p+SAMPLENUM;
   }
 
 filter();
 
  top=0;
  i=SAMPLELINE-1;
  
  while(!(ImagePar[i]>0&&ImagePar[i-1]>0)&&i>0) i--;
  
  if (i==0) {
    
    return 0 ;
  } 
 // top=i;

  top=SAMPLELINE-1;
   
  do  {  //还原底部
     i++ ;  
      if (ImagePar[i]==0)
      {
        ImagePar[i]=2*ImagePar[i-1]-ImagePar[i-2];
      
        if (ImagePar[i]<0) ImagePar[i]=0;
        if (ImagePar[i]>VIDEO_RIGHT) ImagePar[i]=VIDEO_RIGHT;
      } 
      //tc+=ImagePar[i++];
  }   while (i<SAMPLELINE); 
    
     i=SAMPLELINE-2;
   if (ImagePar[i]>0) {
        
      do{
      i--;
         if (ImagePar[i]==0)
          ImagePar[i]=2*ImagePar[i+1]-ImagePar[i+2];
        
       } while (i>0 &&ImagePar[i]>VIDEO_LEFT&&ImagePar[i]<VIDEO_RIGHT) ;
       top=i;
   }
   if (ImagePar[top]>VIDEO_RIGHT||ImagePar[top]<VIDEO_LEFT) 
    ImagePar[top++]=0;
 /*
  if (top>0&&top<SAMPLELINE-1)   //还原顶部
     do {
      ImagePar[top-1]=2*ImagePar[top]-ImagePar[top+1];
      top--;
     }  while(top>0&&ImagePar[top]>VIDEO_LEFT&&ImagePar[top]<VIDEO_RIGHT) ;

⌨️ 快捷键说明

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