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

📄 vehicle.c

📁 dsp2812小车控制
💻 C
📖 第 1 页 / 共 2 页
字号:
/*2812A板:
使用直连的串口通信电缆;
启动串口调试助手.exe;
PC机发送一个"."为结束标志
*/
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"

////////////////////////////////////////////////////////////
unsigned int MaxCmpare=0xF000,LeftIndex=7,RightIndex=7;//cKey,OldSpeed,nDIR,StepLength=0x5000,nDIR=1,,temp
unsigned int Maxstep=7,Mindistance=50,distance=100;//,GPF1,GPF3
unsigned int a[15]={0,0x1000,0x2000,0x3000,0x4000,0x5000,0x6000,0x0F000,0x0F000,0x0F000,0x0F000,0x0F000,0x0F000,0x0F000,0x0F000};//
unsigned int ajust_num=0x1200,zhuangtai=0,mov_key=0;
//Prototypestatementsforfunctionsfoundwithinthisfile.
void init_eva(void );
void init_evb(void );
void Delay(unsigned int );
void Swap(unsigned int *,unsigned int *);
unsigned int mean(unsigned int* );
void adjust_speed(void);

void Stop();
void LinearMotion(unsigned int );
void LeftMotor(unsigned int ,unsigned int );
void RightMotor(unsigned int ,unsigned int );
void TurnAround(unsigned int ,unsigned int );
void vehicle_self_control(void);

void SaMotor1(unsigned int ,unsigned int );//,unsigned int 
void SaMotor2(unsigned int ,unsigned int );//,unsigned int 

void ReadDistance(void );
//Prototypestatementsforfunctionsfoundwithinthisfile.
void scia_loopback_init(void );
void scib_loopback_init(void );
void scia_fifo_init(void );
void scib_fifo_init(void );
void scia_xmit(int a);



interrupt void scia_rx_isr(void );
interrupt void scia_tx_isr(void );
interrupt void CAPINT4_ISR(void );
interrupt void CAPINT5_ISR(void );
//Globalcountsusedinthisexample
//Uint16LoopCount;
//Uint16ErrorCount;
char cString[6]={"Hello!"},cBuffer[7],cAnswer[5]={"HUC:"};//,ReceivedChar="";//,cReceive
char ReceivedChar='0';
void main(void )
{
  unsigned int ZIZHU=0;//自主控制位,全局变量,默认不自主
  unsigned int Step,time1=0,time2=0;//Direction,
  int i,k=0,bReceive=0;//,nLen
  //Step1.InitializeSystemControlregisters,PLL,WatchDog,Clockstodefaultstate:
  //ThisfunctionisfoundintheDSP281x_SysCtrl.cfile.
  InitSysCtrl();
  
  //Step2.SelectGPIOforthedeviceorforthespecificapplication:
  //ThisfunctionisfoundintheDSP281x_Gpio.cfile.
  //InitGpio();skipthisasthisisexampleselectstheI/OforSCIinthisfileitself
  EALLOW;
  GpioMuxRegs.GPAMUX.all=0x00FF;//EVAPWM1-6pinsCAP123
  GpioMuxRegs.GPBMUX.all=0x00FF;//EVBPWM7-12pinsCAP456
  GpioMuxRegs.GPDMUX.all=0x0000;//GPIODIOpin
  GpioMuxRegs.GPEMUX.all=0x0000;//GPIODIOpin
  GpioMuxRegs.GPFMUX.all=0x0030;//SelectGPIOstobeScipins
  //PortFMUX-x000000000110000
  GpioMuxRegs.GPGMUX.all=0x0030;//SCIB
  EDIS;
  
  //Step3.InitializePIEvectortable:
  //ThePIEvectortableisinitializedwithpointerstoshellInterrupt
  //ServiceRoutines(ISR).TheshellroutinesarefoundinDSP281x_DefaultIsr.c.
  //InsertuserspecificISRcodeintheappropriateshellISRroutinein
  //theDSP28_DefaultIsr.cfile.
  
  //DisableandclearallCPUinterrupts:
  DINT;
  IER=0x0000;
  IFR=0x0000;
  
  //InitializePieControlRegistersToDefaultState:
  //ThisfunctionisfoundintheDSP281x_PieCtrl.cfile.
  InitPieCtrl();//PIEisnotusedforthisexample
  
  //InitializethePIEVectorTableToaKnownState:
  //ThisfunctionisfoundinDSP281x_PieVect.c.
  //ThisfunctionpopulatesthePIEvectortablewithpointers
  //totheshellISRfunctionsfoundinDSP281x_DefaultIsr.c.
  InitPieVectTable();
  
  //EnableCPUandPIEinterrupts
  //ThisexamplefunctionisfoundintheDSP281x_PieCtrl.cfile.
  EnableInterrupts();
  //Step4.InitializealltheDevicePeripheralstoaknownstate:
  //ThisfunctionisfoundinDSP281x_InitPeripherals.c
  //InitPeripherals();skipthisforSCItests
  
  //Step5.Userspecificfunctions,Reassignvectors(optional),EnableInterrupts:
  
  //LoopCount=0;
  //ErrorCount=0;
  PieCtrlRegs.PIEIER5.bit.INTx5=1;
        IER |= M_INT5;
        EINT;   // Enable Global interrupt INTM
        ERTM;        // Enable Global realtime interrupt DBGM
  scia_fifo_init();//InitializetheSCIFIFO
  scia_loopback_init();//InitalizeSCIfordigitalloopback
  scib_fifo_init();//InitializetheSCIFIFO
  scib_loopback_init();//InitalizeSCIfordigitalloopback
  //InitializeonlyGPAMUXandGPBMUXforthistest
  
  init_eva();
  init_evb();
  EALLOW;
  //接近开关
  GpioMuxRegs.GPADIR.bit.GPIOA15=0;//右
  GpioMuxRegs.GPADIR.bit.GPIOA14=0;//左
  GpioMuxRegs.GPADIR.bit.GPIOA13=0;//后
  
  //SAMoter1底盘
  GpioMuxRegs.GPFDIR.bit.GPIOF14=1;//output方向
  GpioMuxRegs.GPFDIR.bit.GPIOF13=1;//output脉冲
  GpioMuxRegs.GPFDIR.bit.GPIOF9=0;//input边界
  //SAMoter2机械臂
  GpioMuxRegs.GPFDIR.bit.GPIOF12=1;//output方向
  GpioMuxRegs.GPFDIR.bit.GPIOF11=1;//output脉冲
  GpioMuxRegs.GPFDIR.bit.GPIOF10=0;//input边界
  //轮子霍尔开关
  GpioMuxRegs.GPFDIR.bit.GPIOF3=0;//后左接近
  GpioMuxRegs.GPFDIR.bit.GPIOF2=0;//后右接近
  GpioMuxRegs.GPFDIR.bit.GPIOF1=1;
  //GpioMuxRegs.GPFDIR.bit.GPIOF0=0;//左后轮
  
  GpioMuxRegs.GPFDIR.bit.GPIOF0=1;//output枪
  EDIS;
  GpioDataRegs.GPFDAT.bit.GPIOF0=0;
  GpioDataRegs.GPFDAT.bit.GPIOF1=0;
  //Note:Autobaudlockisnotrequiredforthisexample
  
  //Sendacharacterstartingwith0
  
  
  //while(1)
  //{
  ////Step=1;SaMotor2(1,Step);
  ////Step=20;SaMotor1(0,Step);
  //Stop();
  //LinearMotion(1);
  ////RightMotor(0,2);
  ////LeftMotor(0,2);    
  //}



  //Step6.SendCharactersforeverstartingwith0x00andgoingthrough
  //0xFF.Aftersendingeach,checktherecievebufferforthecorrectvalue
  for(i=0;i<6;i++)
  {
  scia_xmit(cString[i]);
  while(SciaRegs.SCIFFTX.bit.TXFFST!=0){}
  //Delay(1024);
  
  }

  for(;;)
  {
    if(bReceive==1)
    {
      for(i=0;i<4;i++)
      {
        scia_xmit(cAnswer[i]);
        while(SciaRegs.SCIFFTX.bit.TXFFST!=0){}
      }
      scia_xmit(cBuffer[1]);
      while(SciaRegs.SCIFFTX.bit.TXFFST!=0){}
      scia_xmit('.');
    }
    
    if((cBuffer[2]>0x30)||(cBuffer[2]<0x3A))
      Step=cBuffer[2]-0x30;//3;
    else
      Step=1;
    
    switch(cBuffer[1])
    {
      case'L':
        zhuangtai=3;TurnAround(1,5*Step);
        break;
      case'R':
        zhuangtai=4;TurnAround(0,5*Step);
        break;
      //(unsigned int Direction,unsigned int delaytime);
      
      case'A':
        zhuangtai=1;LinearMotion(0);
        break;
      case'D':
        zhuangtai=2;LinearMotion(1);
        break;
      //(unsigned int cKey,unsigned int StepLength);
      
      case'T':
        zhuangtai=0;Stop();
        break;
      ///////////////////////////
      case'Z':
        SaMotor1(1,Step);
        break;
      case'Y':
        SaMotor1(0,Step);
        break;
      case'X':
        SaMotor2(1,Step);
        break;
      case'S':
        SaMotor2(0,Step);
        break;
      case'F':
        GpioDataRegs.GPFDAT.bit.GPIOF0=1;
        break;
      case'f':
      //Delay(1024);
        GpioDataRegs.GPFDAT.bit.GPIOF0=0;
        break;
      case'V':
        ZIZHU=1;
        //scia_loopback_init();
        break;
      case'U':
        ZIZHU=0;
        //scia_loopback_init();
        break;
      case'r':
        time1=0;
        time2=0;
        break;
      default:break;
    }
    
    //测试
    //LinearMotion(0);zhuangtai=1;
    
    k=0;bReceive=0;
  
    while(1)
    {
      //while((SciaRegs.SCIFFRX.bit.RXFIFST==0)&&ZIZHU )// 

        while((SciaRegs.SCIFFRX.bit.RXFIFST==0))// && (ZIZHU==0)  
        {
            if ( (zhuangtai==1)||(zhuangtai==2) )
            adjust_speed();
          time1+=1;
          if (time1==0x0812D)// 100 
              {
                  time2+=1;
                  time1=0;
              }
          if (time2==30)
              {
                  time2=0;
                  ZIZHU=1;
              }
          if (ZIZHU==1)
          {
          //为零则自动运行,避障
          
          //左面的接近开关和右面的接近开关所用GPIO分别为GPIOA14和GPIOA13
            vehicle_self_control();
              //if ( (zhuangtai==1)||(zhuangtai==2) )
              //adjust_speed();
          }
          //else
          //;
        }//END"while((SciaRegs.SCIFFRX.bit.RXFIFST==0)&&ZIZHU)"如果SCIa接受寄存器不为0则跳出
     
    //无线指令 
    //ReceivedChar='0';
        ReceivedChar=SciaRegs.SCIRXBUF.all; 
        //cBuffer[k]='0';
        cBuffer[k]=ReceivedChar;
        
        if(ReceivedChar=='d')
        {
          cBuffer[k+1]='\0';
         // nLen=k+1;
          bReceive=1;
          break;//break"while(1)"
        }
        k++;
        k%=6;
    
    }//end"while(1)"
  
  }//end"for(;;)"

}//END"MAIN"


//Test1,SCIADLB,8-bitword,baudrate0x000F,default,1STOPbit,noparity
void scia_loopback_init()
{
  //Note:ClockswereturnedontotheSCIAperipheral
  //intheInitSysCtrl()function
  
  SciaRegs.SCICCR.all=0x0007;//1stopbit,Noloopback
  //Noparity,8charbits,
  //asyncmode,idle-lineprotocol
  SciaRegs.SCICTL1.all=0x0003;//enableTX,RX,internalSCICLK,
  //DisableRXERR,SLEEP,TXWAKE
  SciaRegs.SCICTL2.all=0x0003;
  SciaRegs.SCICTL2.bit.TXINTENA=1;
  SciaRegs.SCICTL2.bit.RXBKINTENA=1;
  SciaRegs.SCIHBAUD=0x0001;
  SciaRegs.SCILBAUD=0x00e7;
  SciaRegs.SCICCR.bit.LOOPBKENA=0;//disableloopback
  SciaRegs.SCICTL1.all=0x0023;//RelinquishSCIfromReset
}
void scib_loopback_init()
{
  //Note:Clockswereturnedontothescibperipheral
  //intheInitSysCtrl()function
  
  ScibRegs.SCICCR.all=0x0007;//1stopbit,Noloopback
  //Noparity,8charbits,
  //asyncmode,idle-lineprotocol
  ScibRegs.SCICTL1.all=0x0003;//enableTX,RX,internalSCICLK,
  //DisableRXERR,SLEEP,TXWAKE
  ScibRegs.SCICTL2.all=0x0003;
  ScibRegs.SCICTL2.bit.TXINTENA=1;
  ScibRegs.SCICTL2.bit.RXBKINTENA=1;
  ScibRegs.SCIHBAUD=0x0001;
  ScibRegs.SCILBAUD=0x00e7;
  ScibRegs.SCICCR.bit.LOOPBKENA=0;//disableloopback
  ScibRegs.SCICTL1.all=0x0023;//RelinquishSCIfromReset
}
//TransmitacharacterfromtheSCI'
void scia_xmit(int a)
{
  SciaRegs.SCITXBUF=a;
}
//void scib_xmit(int a)
//{
//  ScibRegs.SCITXBUF=a;
//}
//InitalizetheSCIFIFO
void scia_fifo_init()
{
  SciaRegs.SCIFFTX.all=0xE040;
  SciaRegs.SCIFFRX.all=0x204f;
  SciaRegs.SCIFFCT.all=0x0;
}

void scib_fifo_init()
{
  ScibRegs.SCIFFTX.all=0xE040;
  ScibRegs.SCIFFRX.all=0x204f;
  ScibRegs.SCIFFCT.all=0x0;
}

void ReadDistance(void )
{
  unsigned int k,usBuffer[4];//ReceivedChar,
  distance=0;
//读取超声传感器的值
  for(k=0;k<=3;k++)
  {
    ReceivedChar=ScibRegs.SCIRXBUF.all;
    usBuffer[k]=ReceivedChar;//-0x30
    Delay(0x10);
  }
  for(k=0;k<=3;k++)
  {
    if(usBuffer[k]!=10)
    {
      distance=distance*10+usBuffer[k];
    }
  }

//return(distance);
}
/*
void FindPath()
{
  int i=0,j,K;
  ReadDistance();
  for(j=0;(j<3)&(distance<Mindistance);i++)
  {
    for(i=0;(i<12)&(distance<Mindistance);i++)
    {
      TurnAround(0,0x2000);//TurnAround0
      ReadDistance();
    //if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
    //break;
    }
    if(distance<Mindistance)
      LinearMotion(1);//后退一点
    else
    {
      Stop();
      break;
    }
    for(K=0;K<3;K++)
    {
      for(i=0;i<0x0FFFF;i++)
      {
        if((SciaRegs.SCIFFRX.bit.RXFIFST!=0)||(GpioDataRegs.GPADAT.bit.GPIOA13==0))
        {
          Stop();
          break;
        }
      }
    }
    Stop();
  }
  if(distance>=Mindistance)
  LinearMotion(0);//加速
//Delay(0x50);
//Stop();
}
*/

//步进电机1底盘
void SaMotor1(unsigned int Direction,unsigned int Step)//,unsigned int FREE
{
  int i,temp;//aa=1,
//GpioDataRegs.GPFDAT.bit.GPIOF15=FREE;
  GpioDataRegs.GPFDAT.bit.GPIOF14=Direction;
  for(i=0;i<Step;i++)
  {
    if(GpioDataRegs.GPFDAT.bit.GPIOF9==0)
    {break;}
    {
      GpioDataRegs.GPFDAT.bit.GPIOF13=0;
      Delay(10);
      GpioDataRegs.GPFDAT.bit.GPIOF13=1;
      Delay(20);
      for(temp=0;temp<5000;temp++)
      {
      if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
        break;
      }
    }
  }
  while(GpioDataRegs.GPFDAT.bit.GPIOF9==0)
  {
    GpioDataRegs.GPFDAT.bit.GPIOF14=1-Direction;
    GpioDataRegs.GPFDAT.bit.GPIOF13=0;
    Delay(10);
    GpioDataRegs.GPFDAT.bit.GPIOF13=1;
    Delay(20);
    for(temp=0;temp<5000;temp++)
    {
    if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
      break;
    }
  }
}

//步进电机2机械臂
void SaMotor2(unsigned int Direction,unsigned int Step)//,unsigned int FREE
{
  int i,temp;
  //GpioDataRegs.GPFDAT.bit.GPIOF12=FREE;
  GpioDataRegs.GPFDAT.bit.GPIOF12=Direction;

  for(i=0;i<Step;i++)
  {
    {
      GpioDataRegs.GPFDAT.bit.GPIOF11=0;
      Delay(10);
      GpioDataRegs.GPFDAT.bit.GPIOF11=1;
      Delay(20);
      for(temp=0;temp<280;temp++)
      {
      if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
        break;
      }
    }
  if(GpioDataRegs.GPFDAT.bit.GPIOF10==0)
    {break;}
  }
//i=0;
//while(GpioDataRegs.GPFDAT.bit.GPIOF10==0)
//{
//GpioDataRegs.GPFDAT.bit.GPIOF12=Direction;
//GpioDataRegs.GPFDAT.bit.GPIOF11=0;
//Delay(10);
//GpioDataRegs.GPFDAT.bit.GPIOF11=1;
//Delay(390);
////i=(i+1)%3;
////if(i==2)
////Direction=1-Direction;
//}
}



void TurnAround(unsigned int Direction,unsigned int delaytime)//速度为零时转弯
{
  unsigned int temp,StepLength;
  //delaytime=0x3000;
  StepLength=0x0F000;
  Stop();
  if(Direction)
  {
  //for(temp=0;temp<2;temp++)//三次变速
  //{
    StopCpuTimer0();
    EvaRegs.CMPR1-=StepLength;
    EvaRegs.T2CMPR-=StepLength;
    StartCpuTimer0();
    for(temp=0;temp<delaytime;temp++)
    {
    //if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
    //break;
        ;
    }
  //}
  //for(temp=0;temp<2;temp++)//三次变速
  //{
    StopCpuTimer0();
    EvaRegs.CMPR1+=StepLength;
    EvaRegs.T2CMPR+=StepLength;
    StartCpuTimer0();
    for(temp=0;temp<delaytime;temp++)
    {
      if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
        break;
    }
  //}
  }

  else
  {
  //for(temp=0;temp<2;temp++)//三次变速
  //{
    StopCpuTimer0();
    EvaRegs.CMPR2-=StepLength;
    EvaRegs.CMPR3-=StepLength;
    StartCpuTimer0();
    for(temp=0;temp<delaytime;temp++)
    {
    //if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
    //break;
        ;
    }
  //}
  //for(temp=0;temp<2;temp++)//三次变速
  //{
    StopCpuTimer0();
    EvaRegs.CMPR2+=StepLength;
    EvaRegs.CMPR3+=StepLength;
    StartCpuTimer0();
    for(temp=0;temp<delaytime;temp++)
    {
        if(SciaRegs.SCIFFRX.bit.RXFIFST!=0)
        break;
    }
  //}

⌨️ 快捷键说明

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