1).直流电机(黄色DC3V-6V)2个;
2).亚克力板;
3).万向轮;
4).用于装配的螺钉与支撑若干。
1).主控MSP430G2553
2).蓝牙模块HC05
3).DC转DC;
4).电机驱动模块TB6612;
5).手机端的蓝牙调试器。
因为电气连接没有画图,所以对于具体的连接说明,也就不再说明了。这部分也确实比较简单。
电机驱动头文件:
#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;
}
手机上推荐大家使用蓝牙调试器这个软件,真的是非常好用,可以自己写界面,也可以直接使用软件自带的界面。下图是我当时使用的界面:
整个过程做完感觉不是很难,但是做完感觉很多地方做的都不是很好。等后面自己第二台车吧。