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

📄 小车.txt

📁 飞思卡儿智能汽车竞赛主程序 包含刹车程序和pmw模块程序
💻 TXT
字号:
//

//起跑位置识别
//能实现跑两圈停车的功能  
 
  #include <hidef.h>             /* common defines and macros */
  #include <mc9s12dg128.h>       /* derivative information */
  #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/*------------------------------------public variable----------------------------------------------------*/        
  unsigned char sam_atd_g[15];                       //道路检测值
  unsigned int adc_limit;                   //电压比较阀门值
  unsigned int angle_data;             //舵机转角
  unsigned char car_speed;            //车速控制
  unsigned char dir_flag;             //方向标志,为1表示检测到有效路径
  unsigned char start_acc;            //统计检测起跑线次数
  unsigned char start_flag;           //起跑线标志位,为1表示检测到起跑线3次
/*_____________________________________________________________________________________________________*/    
     void crg_init(void);        // 锁相环初始化
     void atd_init(void);        // AD转换初始化
     void pwm_init(void);        // PWM信号初始化
     
     void data_init(void);
     void sam_position(void);       //读adc结果
     void check_direction(void);     // 方向检测函数
     void driver(void);
     void delay(void);
     void check_start(void);       //起跑线检测函数   
/*------------------------------------------MAIN---------------------------------------------------------*/     
void main(void)
  {
       data_init();           //设置基本数据  比较电压值为51
       crg_init();            //锁向环初始化                          
       atd_init();            //初始化AD转化                   
       pwm_init();            //初始化PWM                          
       for(;;) 
       {
        check_start();
        sam_position();
        check_direction();
        driver(); 
       }
   }
//----------------------------data_init------------------------------
void data_init(void) 
{
       adc_limit=51;
       start_acc=0;
       start_flag=0;
}

/*-------------------------------------------CRG_INIT-----------------------------------------------------*/     
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.
    }

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

void pwm_init(void) 
    { 
         PWMCTL=0x10;      // 设置通道10级连;
         PWME=0x82;        // 通道7 and 1输出使能;
         PWMPRCLK=0x72;    // 预分频:B_CLK=A_CLK=busclk/2^2
         PWMSCLA=0x01;     //SA_CLK=A_CLK/(2*1)==3MHz
         PWMSCLB=0X01;     //SB_CLK=B_CLK/(2*1)==96KHz            //        
         
         PWMPOL=0x02;      //极性选择起始为高电平;
         
         PWMCLK=0x82;      // PWM01 选择 SA_CLK
                           // pwm7  选择 SB_CLK
         PWMCNT0=0x00;     //
         PWMCNT1=0x00;     //
         PWMCNT7=0x00;     //
            
         PWMPER01=60000;  // 周期==(1/3M)*(60000)=20ms;
         PWMPER7= 192;     // 周期==(1/96K)*(192)=2ms;
         PWMCAE=0x00;      //左对齐方式

    }
      
/*--------------------------------------------ATD_INIT-------------------------------------------------*/
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 check_direction(void) 
     {
      int i,j;
      dir_flag=0;
      for (i=0;i<15;i++) { 
        if((sam_atd_g[i]))
        {
         j=i-7;      
         angle_data=4500+j*200;
         if (j>0)        
           car_speed=140-j*5;
         else
           car_speed=140+j*5;
         dir_flag=1;
         }          
      }
     } 
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;
    }        
/*--------------------------------------------control----------------------------------------------------*/ 
void driver(void){
         PWMDTY01=angle_data;
         if (start_flag==1)
            PWME=0x00;
         if (dir_flag==1)
            PWMDTY7=car_speed;   
         else 
            PWMDTY7=0; 
         }
/*-------------------------------------------SAM_POSITION-----------------------------------------------*/

  // the function is used for sampling the actual position of cruisecar.
  // notice:
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]>adc_limit)
                   sam_atd_g[i]=1;
             else  sam_atd_g[i]=0;
          }
     }

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

⌨️ 快捷键说明

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