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

📄 主程序6.txt

📁 飞思卡儿智能汽车竞赛主程序 包含刹车程序和pmw模块程序
💻 TXT
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

unsigned char sam_atd_g[15];                       //道路检测值
unsigned int table[29];   //方向表  
unsigned char car_speed;            //车速控制
//unsigned int check_v;
byte front1;          //转向值1
byte front;           //转向值
unsigned int strait[3];//直线各区域传感器所对应速度
unsigned int bend[5];//弯道各区域传感器所对应速度
unsigned char drive_flag;             //方向标志,为1表示检测到有效路径
unsigned char start_acc;            //统计检测起跑线次数
unsigned char start_flag;           //起跑线标志位,为1表示检测到起跑线3次
#define ad_limit 153
void crg_init(void);        // 锁相环初始化
void atd_init(void);        // AD转换初始化
void pwm_init(void);        // PWM信号初始化
void sam_position(void);
void delay(void);
void check_start(void);
void check_stop(void);
void table_init(void);
void chang_f(void); 
void drive(void);
void check_v(void);
void c_comp(void);
//void check_va(void);
//void v_comp(void);     

void main(void) {
crg_init();                                      
atd_init();                              
pwm_init();
table_init();
//check_va();         
for(;;) 
       {
        check_start();
        sam_position();
        c_comp();
        check_v();
        drive(); 
       }
  

}
  
void check_start(void) {
       unsigned char i,j=0;
       for(i=0;i<14;i++){
           if(sam_atd_g[i]^sam_atd_g[i+1])  j++;}
       if(j>4) {start_acc++; delay();}
       if (start_acc==3) start_flag=1;
    } 
    void check_stop(void){
    if (start_flag==0)
             PWME=0x00;
    }
      
  
void drive(void){
         
         if (drive_flag==1)
            PWMDTY7=car_speed;   
         else 
            PWMDTY7=0; 
         } 
   void check_v(void){
     drive_flag=0;
       if(sam_atd_g[7]){
         if(sam_atd_g[6]){
         
         car_speed=17;
         }                                                 
         if(sam_atd_g[8]){
       
         car_speed=17;
         }
       
         car_speed=17;
        } else if(sam_atd_g[6]){
        if(sam_atd_g[5]){
        
           car_speed=16;
        }
       
        car_speed=16;
        }else if(sam_atd_g[8]){
        if(sam_atd_g[9]){
     
        car_speed=16;
        }
       
        car_speed=16;
        }else if(sam_atd_g[5]){
        if(sam_atd_g[4]){
    
        car_speed=17;
        }
  
        car_speed=15;
        }else if(sam_atd_g[9]){
        if(sam_atd_g[10]){
     
        car_speed=17;
        }
   
        car_speed=15;
        }else if(sam_atd_g[4]){
        if(sam_atd_g[3]){
     
        car_speed=16;
        }
    
        car_speed=17;
        }else if(sam_atd_g[10]){
        if(sam_atd_g[11]){
   
       car_speed=16;
        }
    
        car_speed=17;
        }else if(sam_atd_g[3]){
        if(sam_atd_g[2]){
   
        car_speed=15;
        }
    
        car_speed=16;
        }else if(sam_atd_g[11]){
        if(sam_atd_g[12]){
    
        car_speed=15;
        }
   
        car_speed=16;
        }else if(sam_atd_g[2]){
        if(sam_atd_g[1]){
      
        car_speed=14;
        }
     
        car_speed=15;
        }else if(sam_atd_g[12]){
        if(sam_atd_g[13]){
     
        car_speed=14;
        }
      
        car_speed=15;
        }else if(sam_atd_g[1]){
          if(sam_atd_g[0]){
       
      
        car_speed=13;
        }
        
      
        car_speed=14;
        }else if(sam_atd_g[13]){
          if(sam_atd_g[14]){            
      
       car_speed=13;
        }
        
     
        car_speed=14;
        }else if(sam_atd_g[0]){
         
       
        car_speed=13;
        }else if(sam_atd_g[14]){
          
      
        car_speed=13;
        }
        drive_flag=1;
       } 

  /* void check_va(void){
      int i;
      unsigned int value1;
       value1=17; 
       for(i=0;i<=2;i++){
        
           strait[i]=value1;
           value1--;
        }
        for(i=0;i<=4;i++){
             bend[i]=value1;
             value1--;
        }
      }
  void v_comp(void) 
     {
     drive_flag=0;
      if(sam_atd_g[7]){
         if(sam_atd_g[6]){
         check_v=strait[0];
         }                                                 
         if(sam_atd_g[8]){
         check_v=strait[0];
         }
         check_v=strait[0];
        } else if(sam_atd_g[6]){
        if(sam_atd_g[5]){
        check_v=strait[1];
        }
        check_v=strait[1];
        }else if(sam_atd_g[8]){
        if(sam_atd_g[9]){
        check_v=strait[1];
        }
        check_v=strait[1];
        }else if(sam_atd_g[5]){
        if(sam_atd_g[4]){
        check_v=bend[0];
        }
        check_v=strait[2];
        }else if(sam_atd_g[9]){
        if(sam_atd_g[10]){
        check_v=bend[0];
        }
        check_v=strait[2];
        }else if(sam_atd_g[4]){
        if(sam_atd_g[3]){
        check_v=bend[1];
        }
        check_v=bend[0];
        }else if(sam_atd_g[10]){
        if(sam_atd_g[11]){
        check_v=bend[1];
        }
        check_v=bend[0];
        }else if(sam_atd_g[3]){
        if(sam_atd_g[2]){
        check_v=bend[2];
        }
        check_v=bend[1];
        }else if(sam_atd_g[11]){
        if(sam_atd_g[12]){
        check_v=bend[2];
        }
        check_v=bend[1];
        }else if(sam_atd_g[2]){
        if(sam_atd_g[1]){
        check_v=bend[3];
        }
        check_v=bend[2];
        }else if(sam_atd_g[12]){
        if(sam_atd_g[13]){
        check_v=bend[3];
        }
        check_v=bend[2];
        }else if(sam_atd_g[1]){
          if(sam_atd_g[0]){
        check_v=bend[4];
        }
        check_v=bend[3];
        }else if(sam_atd_g[13]){
          if(sam_atd_g[14]){            
        check_v=bend[4];
        }
        check_v=bend[3];
        }else if(sam_atd_g[0]){
        check_v=bend[4];
        }else if(sam_atd_g[14]){
        check_v=bend[4];
        }
        drive_flag=0;
     }
       */
  void crg_init(void) 
   {
         SYNR=0x02;                    // mcu core  48MHz,(bus clock 24MHz)                               .
         REFDV=0x01;
         while((CRGFLG & 0x08)==0 );    // wait for PLL clock stabilization
         CLKSEL |=0x80;                // select PLL clock.
    }
  
   void pwm_init(void) 
    { 
         PWMCTL=0x10;      // 通道01级联,7不级联                  
         PWMPRCLK=0x33;    // 设置A-clock和B-clock为24/8=3Mhz
         PWMSCLB=0x26;     //将SA和SB设置成为38Khz
         PWMSCLA=0x26;
         PWMPOL=0xA2;      //起始电平设置为高电平
         PWMCLK=0x80;      // PWM01 select A_CLK,PWM7 select SB_CLK.
         PWMCAE=0x7F;      //设置01通道为中心对齐,7通道为左对齐
         PWMCNT0=0x00;     //将计数器清零
         PWMCNT1=0x00;    
         PWMCNT7=0x00;
         //PWMCNT1=0x00;   
         PWMPER01=0x7530;  //设置01通道周期为20ms
         PWMPER7=0xC3;     //设置7通道的周期为5ms
         //PWMPER1=0x4E;
         PWMDTY7=0x01;     //设置7通道的占空比为1%
         //PWMDTY1=0x01;
         PWMDTY01=2070;    // 设置01通道的占空比为6.9% 则高电平对应时间为1.38ms       
         PWME=0x82;        // 7通道和01通道使能
    }
 void atd_init(void)
    {
     ATD0CTL2=0xC0;    //启动A/D转换
     ATD1CTL2=0xC0;    //当A/D转化结束后自动清除寄存器ATDSTAT1的CCFx位?
     ATD0CTL3=0x02;    //转换序列长度为8;
     ATD1CTL3=0x02;    //结果寄存器没有映射到转换序列;
     ATD0CTL4=0x8A;     //转换精度为8位;
     ATD1CTL4=0x8A;     //采样时间为2个A/D时钟周期;
     ATD0CTL5=0xB0;     //多通道A/D转换;
     ATD1CTL5=0xB0;     //连续A/D转换;
                        //转换结果无符号;
    }//转换结果右对齐 存放在ATD0DRxL中; 

 //方向判断函数
void sam_position(void)
     {
          unsigned char i;
          sam_atd_g[0]=ATD0DR0L;  //These are the values of ATD0
          sam_atd_g[1]=ATD0DR2L;
          sam_atd_g[2]=ATD0DR3L;
          sam_atd_g[3]=ATD0DR4L;
          sam_atd_g[4]=ATD0DR5L;
          sam_atd_g[5]=ATD0DR6L;
          sam_atd_g[6]=ATD0DR7L;   //These the values of ATD1
          sam_atd_g[7]=ATD1DR0L;
          sam_atd_g[8]=ATD1DR1L;
          sam_atd_g[9]=ATD1DR2L;
          sam_atd_g[10]=ATD1DR3L;
          sam_atd_g[11]=ATD1DR4L;
          sam_atd_g[12]=ATD1DR5L;
          sam_atd_g[13]=ATD1DR6L;
          sam_atd_g[14]=ATD1DR7L;
          for(i=0;i<15;i++){
             if(sam_atd_g[i]>ad_limit)
                   sam_atd_g[i]=1;
             else  sam_atd_g[i]=0;
          }
     }
   void c_comp(void){
     drive_flag=0;
       if(sam_atd_g[7]){
         if(sam_atd_g[6]){
         front=13;                
         chang_f();
    
         }                                                 
         if(sam_atd_g[8]){
         front=15;        
         chang_f();
    
         }
         front=14;        
         chang_f();
    
        } else if(sam_atd_g[6]){
        if(sam_atd_g[5]){
          front=11;
          chang_f();
         
        }
        front=12;                      
        chang_f();
    
        }else if(sam_atd_g[8]){
        if(sam_atd_g[9]){
        front=17;
        chang_f();
      
        }
        front=16;        
        chang_f();
     
        }else if(sam_atd_g[5]){
        if(sam_atd_g[4]){
        front=9;
        chang_f();
 
        }
        front=10;
        chang_f();
   
        }else if(sam_atd_g[9]){
        if(sam_atd_g[10]){
        front=19;
        chang_f();
      
        }
        front=18;
        chang_f();
    
        }else if(sam_atd_g[4]){
        if(sam_atd_g[3]){
        front=7;
        chang_f();
        
        }
        front=8;
        chang_f();
     
        }else if(sam_atd_g[10]){
        if(sam_atd_g[11]){
        front=21;
        chang_f();
   
        }
        front=20;
        chang_f();
  
        }else if(sam_atd_g[3]){
        if(sam_atd_g[2]){
        front=5;
        chang_f();
     
        }
        front=6;        
        chang_f();
 
        }else if(sam_atd_g[11]){
        if(sam_atd_g[12]){
        front=23;
        chang_f();

        }
        front=22;
        chang_f();
     
        }else if(sam_atd_g[2]){
        if(sam_atd_g[1]){
        front=3;        
        chang_f();

        }
        front=4;
        chang_f();

        }else if(sam_atd_g[12]){
        if(sam_atd_g[13]){
        front=25;
        chang_f();
    
        }
        front=24;
        chang_f();
     
        }else if(sam_atd_g[1]){
          if(sam_atd_g[0]){
       
        front=1;
        chang_f();
        
        }
        
        front=2;
        chang_f();
     
        }else if(sam_atd_g[13]){
          if(sam_atd_g[14]){            
        front=27;
        chang_f();
    
        }
        
        front=26;
        chang_f();

        }else if(sam_atd_g[0]){
         
        front=0;
        chang_f();
  
        }else if(sam_atd_g[14]){
          
        front=28;
        chang_f();
   
        }
        drive_flag=1;
       }
void table_init(void){//the value of  chuangganqi 不同区域的传感器给予不同的转向值,且赋值间隔逐渐递减.
        int i;
      int value=2070;     // 小车转向中点时的赋值
      for(i=14;i>=10;i--){//-6*15
        table[i]=value;
        value-=20;
      }
       value=1950;
      for(i=9;i>=5;i--){  //-5*30
        table[i]=value;
        value-=40;
      }
      value=1750;
      for(i=4;i>=0;i--){   
        table[i]=value;
        value-=35;
      }
       value=2070;
      for(i=14;i<=18;i++){ //+6*15
        table[i]=value;
        value+=20;
      }
         value=2190;
      for(i=19;i<=23;i++){ //+5*30
        table[i]=value;
        value+=40;
      }
         value=2390;
         for(i=24;i<=28;i++){ 
          table[i]=value;
          value+=35;
         }
     }
     void chang_f(void){
        if(front!=front1){        
         PWMDTY01=table[front];
         front1=front;
         } 
     }
void delay(void) {
  unsigned int i;
  for (i=0;i<65535;i++);
}

⌨️ 快捷键说明

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