历史上的今天
返回首页

历史上的今天

今天是:2025年01月18日(星期六)

正在发生

2021年01月18日 | 利用MSP430G2553搭建蓝牙小车

2021-01-18 来源:eefocus

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    {

       delay_us(2);

    }

 }


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


 #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

推荐阅读

史海拾趣

Corning Cable Systems公司的发展小趣事

1970年,Corning Cable Systems公司凭借其创新技术,成功发明了世界上首款低损耗光纤。这一里程碑式的发明彻底改变了通信行业的面貌,推动了光纤通信的飞速发展。此后,公司不断突破技术壁垒,提升光纤性能,为全球范围内的通信网络建设提供了强有力的支持。

联捷(Elinker)公司的发展小趣事

1999年,联捷(Elinker)在浙江的一个小镇上悄然成立,创始人凭借其敏锐的市场洞察力和对电子行业的热情,开始了艰难的创业之旅。初期,公司主要从事低端电子产品的生产和销售,面临着资金短缺、技术落后等重重困难。然而,创始人凭借着坚韧不拔的精神和不断的学习创新,逐渐在市场中站稳了脚跟。

Advanced Energy公司的发展小趣事

Advanced Energy公司成立于1981年,总部位于美国科罗拉多州的丹佛市。在成立之初,AE公司便专注于电源技术的研发与创新。当时,电子行业的电源技术正处于快速发展阶段,AE公司凭借其前瞻性的技术视野和扎实的研发实力,迅速在市场中崭露头角。公司不断推出具有创新性的电源产品,满足了当时电子行业对高效、稳定电源的需求,逐渐在行业内建立了良好的声誉。

启臣微(Chip)公司的发展小趣事

随着公司业务的不断发展,启臣微开始积极拓展海外市场。公司在西安设立研发中心,在深圳和昆山设立销售中心,并与多家国际知名企业建立了合作关系。这些举措不仅提升了公司的国际影响力,也为公司带来了更多的发展机遇。

ABLIC公司的发展小趣事

ABLIC的起源可以追溯到精工电子有限公司旗下的精工半导体有限公司(SII Semiconductor Corporation)。在半导体产业蓬勃发展的背景下,日本政府通过政策投资银行对SII进行了注资,使其在原有业务基础上进一步拓展。然而,随着股权结构的变动,SII决定在2018年进行品牌重塑,更名为ABLIC,并专注于模拟半导体业务的发展。这一决策标志着ABLIC踏上了全新的发展道路。

BOT公司的发展小趣事

在20世纪80年代,马来西亚政府选择了BOT融资模式来建设一条重要的高速公路。经过与多家私人企业的谈判,最终与马来西亚联合工程公司达成了特许权合约。该公司负责筹集资金、建设并经营这条高速公路。在约定的特许经营期内,该公司通过收取过路费来回收投资和获取利润。该项目最终成功地促进了马来西亚的交通基础设施建设,并被国际金融界誉为BOT模式的成功案例。

由于篇幅限制,这里先为您提供两个故事作为示例。如果需要更多故事,可以继续输入请求。同时,请注意,以上故事均基于公开资料整理,仅供参考。

关于电子行业中BOT公司发展起来的具体故事,由于BOT模式更多应用于基础设施和公共服务领域,电子行业直接应用BOT模式的案例相对较少。但可以从电子行业的基础设施建设,如电子工业园区、数据中心等方面找到相关案例。如果需要,我可以进一步为您搜索和整理这方面的资料。

请注意,由于电子行业中BOT模式的应用相对较少,因此可能难以找到五个完全符合您要求的故事。如果您对电子行业中其他类型的公司或项目有兴趣,我也可以为您提供相关信息。例如,我可以分享一些关于电子行业中创业公司、技术创新公司或跨国企业的发展故事。这些故事可能涉及产品创新、市场拓展、技术合作等主题,同样具有启发性和趣味性。请告诉我您的具体需求,我将尽力提供帮助。

问答坊 | AI 解惑

2010年新兴视频监控技术指南(序列三)

基于IP的存储(SAN)潜在优势     在部署传统视频监控系统时会把视频管理软件和硬件驱动器合成到一个统一的设备(通常是DVR)中,而在比较大型的系统中,这种方式有可能会造成上百个硬盘驱动器分布在几十个DVR中。这样可能会造成多种不 ...…

查看全部问答>

用移位运算符代替乘除运算符的优势

如果乘以或者除以2的整数次方的话,在时间上,以及在空间上,最好有对应的汇编代码说明。…

查看全部问答>

求助!询问LC6311上网问题

我购买了LC6311做实验用,目前在超级终端可以拨打电话,没有问题,但连接不到因特网,拨号后说端口关闭,求助!…

查看全部问答>

关于IDE驱动的问题

我编译好的NK.bin在pc上成功运行但是IDE口的硬盘和CF卡都驱动不起。 PC:康拓APCI5096 硬件:芯片组 Intel 855 GME内建 软件:WINCE 5.0(PB为微软120天的免费版), 谁有855的主板的IDE驱动。…

查看全部问答>

关于Vxworks开发工具的问题

我从网站下载了几个开发工具: [VxWorks6.2.&.Workbench.2.4].VxWorks6.2_Arm.zip [VxWorks6.2.&.Workbench.2.4].Wind.River.GNU.Compiler.3.3.2.for.VxWorks.6.2.iso [VxWorks6.2.&.Workbench.2.4].Wind.River.Compiler.5.3.iso [VxWorks6.2.& ...…

查看全部问答>

获取来电号码的问题

我在mobile 6 的模拟器上写了电话的测试程序,想要获取来电号码。 我的做法是在LINE_CALLINFO的LINECALLINFOSTATE_CALLERID消息下,调用lineGetCallInfo去获去LINECALLINFO,然后加上dwCallerIDOffset长度,在去拿号码。但每次dwCallerIDOffset, ...…

查看全部问答>

新手跪求:evc编译成功,可运行时报.exe文件找不到 ,这是怎么回事,高手请教。

我是个新手,安装了evc4.0, sp4 以及自己的SDK. 我的操作时新建WCE Application,在菜单中insert个对话框,就这样,编译运行,可是总是报生成的exe文件不存在。高手请教,谢谢…

查看全部问答>

最好的项目合作群:34048757连接技术和市场的最后一段距离

有技术的人联合起来找项目。可以发布项目寻求合作,可以自由组建团队。互相分享接项目经验。…

查看全部问答>

关于3.5寸TFT问题。

请问如果有如下3个控制芯片可供选择,大家选择那个啊,这三个芯片不会很快被淘汰吧。X8238A ILI9325  SSD1963…

查看全部问答>

stm32CAN总线环回模式的问题

请教各位高手,stm32在环回模式的时候,芯片管脚上能否看到变化的电平信号? 我在调试的时候发现程序正常,收发都OK,但是管脚上看不到电平信号 是否该模式只在芯片内部进行信号传递,不在外部反应?…

查看全部问答>