利用MSP430G2553搭建蓝牙小车

利用MSP430G2553搭建蓝牙小车

1. 小车硬件

1.1 机械部分

1).直流电机(黄色DC3V-6V)2个;
2).亚克力板;
3).万向轮;
4).用于装配的螺钉与支撑若干。

1.2 电气部分

1).主控MSP430G2553
2).蓝牙模块HC05
3).DC转DC;
4).电机驱动模块TB6612;
5).手机端的蓝牙调试器。

因为电气连接没有画图,所以对于具体的连接说明,也就不再说明了。这部分也确实比较简单。

2. 小车软件

2.1车体上软件

电机驱动头文件:

 #include"msp430G2553.h"
 #define uint unsigned int

 #define CPU_F                               ((double)8000000)
 #define delay_us(x)          __delay_cycles((long)(CPU_F*(double)x/1000000.0))
 #define delay_ms(x)          __delay_cycles((long)(CPU_F*(double)x/1000.0))
 /***********************函数***********************/
 void IOInit();                         //IO初始化
 void TimeAInit();                      //定时器A初始化
 void ForwordMotor(uint speed);         //车体前移
 void LeftMotor(uint speed);            //车体左转
 void RightMotor(uint speed);           //车体右转
 void BackMotor(uint speed);            //=车体后移
 void SpinMotor(uint speed);            //车体旋转
 void StopMotor();                      //电机停止转动
 void PWMA_Delay(uint speed);           //PWM利用简单延时
 void delay(uint time);                 //定义延迟函数,单位为ms
 /***********************全局变量***********************/
 extern uint JudgeRecv;                        //判断当前蓝牙是否有信息发来
 extern unsigned char RX_Buffer;      //定义全局变量RX_Buffer,接收字符
 extern unsigned char TX_Buffer;      //定义全局变量TX_Buffer,发送字符

电机驱动源文件:

#include"MotorDrive.h"

/*****************************IO初始化**************************************/
 void IOInit()
 {
     P1DIR|=BIT7+BIT6+BIT5+BIT4;    //P1.7、P1.6、P1.5、P1.4 设置为双输出口,其中P1.4为PWM输出
     P2DIR|=BIT2+BIT1+BIT0;         //P2.0、P2.1、P2.2设置为输出口,其中P2.2为PWM输出
     P1OUT&=0x0f;                   //P1.7、P1.6、P1.5、P1.4 设置为低电平
     P2OUT&=0xf8;                   //使P2.0、P2.1、P2.2输出低电平
 }
/*******************************车体前移***************************************/
//沿前向指定speed速度运动
 void ForwordMotor(uint speed)
 {
    //P1.7(STBY)、P1.6(AIN2)置1, P1.5(AIN2)置0
    //P2.0(BIN1)置0,P2.1(BIN2)置1
    P1OUT|= BIT7+BIT6;
    P1OUT&=~BIT5;                  // P1.7(STBY)、P1.6(AIN2)置1,P1.5(AIN2)置0
    P2OUT&=BIT0;
    P2OUT|=BIT1;                   //P2.0(BIN1)置0,P2.1(BIN2)置1
    //P1.4(PWMA),P2.2(PWMB)进行设置,即产生PWM信号
    while(JudgeRecv)              //接收标志位非零,循环发送脉冲
    {
         PWMA_Delay(speed);      //电机1和电机2相同的速度
    }
 }
/*******************************车体左转***************************************/
//车体进行左前转弯
void LeftMotor(uint speed)
{
    //P1.7(STBY)、P1.6(AIN2)置1, P1.5(AIN2)置1
    //P2.0(BIN1)置0,P2.1(BIN2)置1
    P1OUT|= BIT7+BIT6+BIT5;      // P1.7(STBY)、P1.6(AIN2)置1,P1.5(AIN2)置1
    P2OUT&=BIT0;
    P2OUT|=BIT1;                 //P2.0(BIN1)置0,P2.1(BIN2)置1
    while(JudgeRecv)             //接收标志位非零,循环发送脉冲
    {
         PWMA_Delay(speed);      //电机1和电机2相同的速度
    }
 }
/********************************车体右转**************************************/
 void RightMotor(uint speed)
 {
    //P1.7(STBY)、P1.6(AIN2)置1, P1.5(AIN2)置0
    //P2.0(BIN1),P2.1(BIN2)置1
    P1OUT|= BIT7+BIT6;
    P1OUT&=~BIT5;                // P1.7(STBY)、P1.6(AIN2)置1,P1.5(AIN2)置0
    P2OUT|=BIT0+BIT1;            //P2.0(BIN1),P2.1(BIN2)置1
    while(JudgeRecv)             //接收标志位非零,循环发送脉冲
    {
         PWMA_Delay(speed);      //电机1和电机2相同的速度
    }
 }
/********************************车体后移**************************************/
 void BackMotor(uint speed)
 {
    //P1.7(STBY)置1、P1.6(AIN2)置0, P1.5(AIN2)置1
    //P2.0(BIN1)置1,P2.1(BIN2)置0
    P1OUT|=BIT7+BIT5;
    P1OUT&=~BIT6;                //P1.7(STBY)置1、P1.6(AIN2)置0, P1.5(AIN2)置1
    P2OUT|=BIT0;
    P2OUT&=~BIT1;                //P2.0(BIN1)置1,P2.1(BIN2)置0
    while(JudgeRecv)             //接收标志位非零,循环发送脉冲
    {
         PWMA_Delay(speed);      //电机1和电机2相同的速度
    }
 }
/******************************车体旋转**************************************/
 void SpinMotor(uint speed)
 {
    //P1.7(STBY)置1、P1.6(AIN2)置1, P1.5(AIN2)置0
    //P2.0(BIN1)置1,P2.1(BIN2)置0
    P1OUT|=BIT7+BIT6;
    P1OUT&=~BIT5;                //P1.7(STBY)置1、P1.6(AIN2)置1, P1.5(AIN2)置0
    P2OUT|=BIT0;
    P2OUT&=~BIT1;                //P2.0(BIN1)置1,P2.1(BIN2)置0
    while(JudgeRecv)             //接收标志位非零,循环发送脉冲
    {
         PWMA_Delay(speed);      //电机1和电机2相同的速度
    }
 }
/******************************电机停止**********************************/
void StopMotor()
{
  //P1.7(STBY)置0、P1.6(AIN2)置0, P1.5(AIN2)置0
  //P2.0(BIN1)置0,P2.1(BIN2)置0
  P1OUT&=~BIT7;
  P1OUT&=~BIT6;
  P1OUT&=~BIT5;
  P2OUT&=~BIT0;
  P2OUT&=~BIT1;
  while(JudgeRecv)             //接收标志位非零,循环发送脉冲
  {
   PWMA_Delay(0);      //电机1和电机2相同的速度
    }
}
/**************************PWMA调速利用延迟******************************/
 void PWMA_Delay(uint speed)
 {
    if(speed>100)     //速度最大值为100
   {
      return;
   }
   else
   {
      //P1.4置1,P2.2置1
      P1OUT|=BIT4;
      P2OUT|=BIT2;
      delay(speed);
      //P1.4置0,
      P1OUT&=~BIT4;
      P2OUT&=~BIT2;
      delay(101-speed);  //控制转速
   }
 }
 /**************************延时函数***************************/
 void delay(uint time)
 {
    for(int i=0;i

利用串口读取蓝牙信息头文件:

 #include"msp430G2553.h"
 #define uint unsigned int

/***********************函数***********************/
void UartInit();              //串口初始化

/***********************全局变量***********************/

extern uint JudgeRecv;                        //判断当前蓝牙是否有信息发来
extern unsigned char RX_Buffer;      //定义全局变量RX_Buffer,接收字符
extern unsigned char TX_Buffer;      //定义全局变量TX_Buffer,发送字符

利用串口读取蓝牙信息源文件:

#include"Uart.h"

/***********************串口初始化***********************/
//串口初始化
void UartInit()
{
    /*
    DCOCTL = 0; // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_1MHZ; // Set DCO
    DCOCTL = CALDCO_1MHZ;
    //将其端口功能选择为串口功能
    P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
    P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
    //时钟选择
    UCA0CTL1 |=UCSWRST;   //复位寄存器配置
    UCA0CTL1 |= UCSSEL_2; // SMCLK
    UCA0BR0 = 104;        // 1MHz 9600
    UCA0BR1 = 0;          // 1MHz 9600
    //调制器配置、完成USCI初始化配置
    UCA0MCTL = UCBRS0;        // Modulation UCBRSx = 1
    UCA0CTL1 &= ~UCSWRST;     // **Initialize USCI state machine**
    //使能接收中断和发送中断
    IE2 |= UCA0RXIE+UCA0TXIE; // Enable USCI_A0 RX,TX interrupt
    //打开全局中断
    _EINT();                  //打开全局中断
    */
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  __bis_SR_register(GIE);                   // Enter LPM0, interrupts enabled
}
/***********************USCI读取中断服务函数***********************/
//USCI读取中断服务函数
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{
   JudgeRecv=0;                //从程序循环跳出
   while (!(IFG2&UCA0TXIFG));  // USCI_A0 RX buffer ready?
   RX_Buffer = UCA0RXBUF;      // TX -> RXed character
   IFG2&=~UCA0RXIFG;           //将标志位置0
}

主函数:

#include"msp430G2553.h"
#include"Uart.h"
#include"MotorDrive.h"
#define uint unsigned int
#define uchar unsigned char
/***********************全局变量***********************/
 uint JudgeRecv;                        //判断当前蓝牙是否有信息发来
 unsigned char RX_Buffer;      //定义全局变量RX_Buffer,接收字符
 unsigned char TX_Buffer;      //定义全局变量TX_Buffer,发送字符
 uint MotorSpeed ;
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  IOInit();              //进行IO初始化
  UartInit();            //串口初始化
  int i=1;
  MotorSpeed=50;          //定义车体移动速度
  while(i)               //进入程序主循环
  {
   JudgeRecv=1;
   switch(RX_Buffer)
   {
      case 'G':    //车体前移
      {
        ForwordMotor(MotorSpeed);
        break;
      }
      case 'H':  //车体左转
      {
        LeftMotor(MotorSpeed);
        break;
      }
      case 'J':  //车体右转
      {
        RightMotor(MotorSpeed);
        break;
      }
      case 'K': //车体后移
      {
        BackMotor(MotorSpeed);
        break;
      }
      case 'I': //车体停止
      {
        StopMotor();
        break;
      }
      case 'A': //车体旋转
       {
         SpinMotor(MotorSpeed);
         break;
        }
      case 'D': //低速设置
       {
         MotorSpeed=30;
         break;
        }
        case 'Z': //中速设置
       {
         MotorSpeed=60;
         break;
        }
        case 'g': //高速设置
       {
         MotorSpeed=95;
         break;
        }
       default:
       {
           break;
         }
    }
   }
    return 0;
  }

2.2手机上软件

手机上推荐大家使用蓝牙调试器这个软件,真的是非常好用,可以自己写界面,也可以直接使用软件自带的界面。下图是我当时使用的界面:
利用MSP430G2553搭建蓝牙小车_第1张图片
整个过程做完感觉不是很难,但是做完感觉很多地方做的都不是很好。等后面自己第二台车吧。

你可能感兴趣的:(嵌入式学习应用)