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

📄 主程序 .txt

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

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

  byte sam_atd_g[15];   //道路检测值
  unsigned int table[29];   //方向表
  byte front1;          //转向值1
  byte front;           //转向值
  unsigned int check_v;
  unsigned int start_cnt;
  unsigned int start_flag;
  unsigned int drive_flag;
  unsigned int strait[3];//直线各区域传感器所对应速度
  unsigned int bend[5];//弯道各区域传感器所对应速度
  #define adc_limit 153 
  void crg_init(void);
  void atd_init(void);
  void pwm_init(void);
  void sam_position(void);
  void table_init(void);
  void chang_f(void); 
  void v_comp(void);
  void c_comp(void);
  void delay(void);
  void check_start(void);
  void check_stop(void);
  void check_va(void);
  void drive(void);
void main(void) {
     crg_init();
     atd_init();
     pwm_init();
     table_init();
     check_va();
     start_flag=1;
     for(;;) {
     check_start();
     sam_position();
     c_comp();
     v_comp();
     drive();
     check_stop();     
     }
  
}

 void check_start(void) {
     int   i=0,j=0;
       for(i=0;i<14;i++){
           if(sam_atd_g[i]^sam_atd_g[i+1]) j++;}
       if(j>4) {start_cnt++; delay();}
       if (start_cnt==3) start_flag=0;
    } 
void check_stop(void)
{  
 if (start_flag==0)
     PWME=0x00;
}
void drive(void){
         int i;
         for(i=0;i<=14;i++){          
             if(sam_atd_g[i])
            PWMDTY7=check_v;
                   else 
            PWMDTY7=0;
         }             
    }

           
void crg_init(void){
         SYNR=0x02;                      // mcu core clock 48MHz(bus clock 24MHz).
         REFDV=0x01;
         while((CRGFLG & 0x08)==0 ){  }  // wait for PLL clock stabilization
         CLKSEL |=0x80;                  // select PLL clock.
    }

/*------------------------------------PWM_INIT-----------------------------------------

    the function pwm_init() is used for preparing for the two motors work.   
    see port.h for details of pins connection.
 -------------------------------------------------------------------------------------*/
 
  void pwm_init(void) 
    { 
         PWMCTL=0x40;      // 通道4,5级联,7和1不级联                  
         PWMPRCLK=0x33;    // 设置A-clock和B-clock为24/8=3Mhz
         PWMSCLB=0x26;     //
         PWMSCLA=0x26;
         PWMPOL=0xA2;      // PWM45 select A_CLK,PWM7 select SB_CLK.
         PWMCLK=0x80;
         PWMCNT4=0x00;
         PWMCNT5=0x00;
         PWMCNT7=0x00;
         PWMPER45=30000;   // init_period(20ms)
         PWMPER7=0xC3;
         PWMCAE=0x7D;
         PWMDTY7=0x01;
         PWMDTY45=2070;    // init_pulse(us)         
         PWME=0xA2;        // for PWM7,PWM(4)5 output enable.
    }
      
      
      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]=ATD0DR1L;
          sam_atd_g[2]=ATD0DR2L;
          sam_atd_g[3]=ATD0DR3L;
          sam_atd_g[4]=ATD0DR4L;
          sam_atd_g[5]=ATD0DR5L;
          sam_atd_g[6]=ATD0DR6L;
          sam_atd_g[7]=ATD0DR7L;   
          sam_atd_g[8]=ATD1DR0L;  //These the values of ATD1
          sam_atd_g[9]=ATD1DR1L;
          sam_atd_g[10]=ATD1DR2L;
          sam_atd_g[11]=ATD1DR3L;
          sam_atd_g[12]=ATD1DR4L;
          sam_atd_g[13]=ATD1DR5L;
          sam_atd_g[14]=ATD1DR6L;
          for(i=0;i<15;i++){
             if(sam_atd_g[i]>adc_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 chang_f(void){
        if(front!=front1){        
         PWMDTY45=table[front];
         front1=front;
         } 
                          
          
    }
    
    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 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) 
     {
      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];
        }

     }
     
     void delay(void) {
  unsigned int i;
  for (i=0;i<65535;i++);
}

⌨️ 快捷键说明

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