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

📄 main.c

📁 全国大学飞思卡尔智能小车
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#pragma DATA_SEG DEFAULT
char left_sensor, right_sensor;
char left_temp[5], right_temp[5];
int i=0,j=0;
char dir=0,danger=0;
char speed_bk;
#pragma CODE_SEG DEFAULT
void PLL_INIT(void)  //CPU总线时钟60M
{
  REFDV=0x43;             
  SYNR=0xce;
  POSTDIV=0x00;  //bus period=16Mhz*(SYNR+1)/(REFDV+1)=60M
  while(0==CRGFLG_LOCK);  //wait for VCO to stablize
  CLKSEL=0x80;  //open PLL
}

void delay(int ms)
{
 int i,j;
 for(i=0;i<1000;i++)
    for(j=0;j<60*ms;j++);
}

//////*****************ICO1输入捕捉******************************//////

void ECT_INIT(void)
{
 //TSCR1=0X08;
 TCTL4=0X04;//rising edeg only
 TIE=0X02;//interrupt enable
 TSCR2=0X02;//
 TSCR1_TEN=1;//enable the timer

 
 PACTL=0X40;  //falling edge ,prescaler frequence,intterrupt enable
}


///////********************定时中断产生20ms一次的中断*****************///////
void PTI_INIT(void)
{
 PITCE_PCE0=1;//chanel 0 enable
 PITINTE_PINTE0=1;//interrupt enable;
 PITMTLD0=60;
 PITLD0=5000;//以上两句定义中断时间为:60*5000/60MHZ=5ms      //1000
 PITCFLMT_PITE=1;//PIT enable
 
}

/////*************************************************************/////
/////***AD采样程序,多通道采集,从0通道开始采样在采样1通道后返回*******
//*****************************************************************/////
/////*************************************************************/////



void ATD_INIT()
{ATD0CTL0=0X01;//wrap around after AN1;
 ATD0CTL1=0X00;//8bit,no discharge,AN0 as external source
 ATD0CTL2=0X62;//stop mode,fast clear,falling edge, interrupt enable
 ATD0CTL3=0X90;//right DJ,continue convert under freeze mode,2conv per seq
 ATD0CTL4=0X16;//4 clock,convert frequence=60M/(2*(5+1))=0.5M
 ATD0CTL5=0X30;//start from AN0;
 ATD0DIEN=0X00; //no digital buffer input
 
}
/*void ATD_INIT()
{ATD0CTL0=0X02;//wrap around after AN2;
 ATD0CTL1=0X10;//10bit,no discharge,AN0 as external source
 ATD0CTL2=0X62;//stop mode,fast clear,falling edge, interrupt enable
 ATD0CTL3=0X98;//right DJ,continue convert under freeze mode,2conv per seq
 ATD0CTL4=0X0a;//4 clock,convert frequence=40M/(2*(24+1))=0.5M
 ATD0CTL5=0X30;//start from AN0;
 ATD0DIEN=0X00; //no digital buffer input
 
} */

void PWM_INIT(void)
{
 PWME=0X00;
 PWMPOL=0XFF;
 PWMCLK=0X80;//PP7 select SB as clock
 PWMPRCLK=0X25;//clock A=60/64,clock B=60/4
 PWMSCLB=0x05;//SB频率15M/2/5=1.5M
 PWMCAE=0X00;
 PWMCTL=0X00;
 PWMCTL_CON67=1;
 
 PWMPER67=30000; //T=20MS
 
 PWMDTY67=1400;
 
 PWMPER4=255;
 PWMPER5=255; 
 
 PWMDTY4=0;
 PWMDTY5=65;
 PWME=0Xff;

}
                                      
 /****************SCI初始化*************************/
void SCI_INIT(void)
{
SCI0BD=391;//60MHZ,9600BAUD
SCI0CR1=0X00;//8bit data,no parity,one start _bit,one stop_bit
SCI0CR2=0X20;
}

void sci_send(char ar)
{SCI0CR2_TE=1;
 while(!SCI0SR1_TDRE);
 SCI0DRL=ar;
 SCI0CR2_TE=0;
 
}
/*****************************方向决策函数******************************/
void direction(void)
{
 int diff;
 
 if(left_sensor>right_sensor) 
 {
  dir=0;//整车右偏
  diff=left_sensor-right_sensor;
 
 }
 else 
 {
  dir=1;//整车左偏
  diff=right_sensor-left_sensor;
  
 }
 if(dir==0)
 {
   //if(diff<0X20&&right_sensor>0X70)   PWMDTY67=1400-diff*3;
   //else
     {
    
      if(right_sensor<0X50)                         PWMDTY67=950;
      if(right_sensor>0X50&&right_sensor<0X60)      PWMDTY67=980; //1000
      if(right_sensor>0X60&&right_sensor<0X70)      PWMDTY67=1150; //1150
      if(right_sensor>0X70&&right_sensor<0X80)      PWMDTY67=1250; //1250
      if(right_sensor>0X80&&right_sensor<0X90)      PWMDTY67=1350;
     }
 }
 
 if(dir==1)            //左偏                                       
 {    
   //if(diff<0X20&&left_sensor>0X70)   PWMDTY67=1400+diff*3;
   //else
      {
        
      
      if(left_sensor<0X50)                       PWMDTY67=1800;
      if(left_sensor>0X50&&left_sensor<0X60)       PWMDTY67=1780; //1750
      if(left_sensor>0X60&&left_sensor<0X70)       PWMDTY67=1680; //1680
      if(left_sensor>0X70&&left_sensor<0X80)       PWMDTY67=1550; //1550
      if(left_sensor>0X80&&left_sensor<0X90)       PWMDTY67=1450;
      }                     
     
 }
}



#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC

void interrupt 22 ATD(void)
{   left_temp[i]=ATD0DR0L>>2;            //left sensor 
    right_temp[i]=ATD0DR1L>>2;           //right sensor
    //sci_send(left_temp[i]);
    //sci_send(0xff);
    //sci_send(right_temp[i]);
    i++;
    if(i==4) 
    {
     left_sensor=left_temp[0]+left_temp[1]+left_temp[2]+left_temp[3];
     right_sensor=right_temp[0]+right_temp[1]+right_temp[2]+right_temp[3];
     //sci_send(0Xff);
     sci_send(left_sensor);
     sci_send(0Xff);
     sci_send(right_sensor);
     
     //sci_send(danger);
     //sci_send(dir);
     //sci_send(0Xff);
     i=0;   
    }
    
       
    ATD0STAT0_SCF=1;
    
}

   ////////////20ms时测试得到基本规律为:占空比增加10,速度反馈值增加2,良好线性/////////////////
void interrupt 66 PTI0(void)
{
 
 PITTF_PTF0=1;
 speed_bk=PACNTL;
 //PORTB=PACNTL;
 PACNT=0;
 //sci_send(speed_bk);
 
}

#pragma CODE_SEG DEFAULT
void main(void) {
  /* put your own code here */
  PLL_INIT();
  SCI_INIT();
  ATD_INIT();
  PWM_INIT();
  ECT_INIT();
  PTI_INIT();
  DDRB=0XFF;
  PORTB=0X0f;
  //PWMDTY67=950;   //  950    1400   1800
  PWMDTY4=0;
  PWMDTY5=0;
  delay(200);
  PWMDTY4=0;
  PWMDTY5=115;
  
    
	EnableInterrupts;


  for(;;) {
  direction();
  //sci_send(0XFF);
  
  
  
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

⌨️ 快捷键说明

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