实现功能
第一功能:
小车从A点开始出发,行驶到B点停止。
第二功能:
小车从A点开始出发,然后沿跑道一直行驶。
下图为黑色跑道,跑道为2mm的黑线,A、B、C、D四点为直径4mm的黑圈。
设计方案
小车选用MSP430F5529做为主控芯片,TCRT5000红外循迹模块用来实现小车识别跑道功能,原理为红外发射判断黑白线以及区分黑线宽度,电机使用两个直流电机,电机驱动模块选用TB6612,来实现实时控制电机转动的幅度与转速。
设计电路
接线详解
将MSP430F5529的P3.0、P3.1、P3.2引脚分别与3个TCRT5000模块的DO端相连,芯片实时检测这3个端口的电平,当发生电平跳变时,电机运行就会做出相对应的调整,而控制电机转速的是P1.3与P2.0引脚,它们与TB6612模块的PWMA、PWMB引脚相连,原理是通过改变占空比来实现。P1.2、P1.4、P1.5三个引脚通过拨码开关与GND相连,用来实现对三个行驶模式的分开控制,P2.2需要拉高(启动时)所以图中没画。
模式详解
三个拨码开关分别控制三个模式,第一个模式为第一个实现功能即B点停,第二个模式为第二个实现功能即小车一直行驶,第三个模式为小车定时60秒后开始一直行驶。
设计代码
#include
int liftbi=0,rightbi=0;
unsigned int temp=0;
void GPIO_init(void)
{
P3DIR &=~(BIT0+BIT1+BIT2+BIT3);
P3REN |= (BIT0+BIT1+BIT2+BIT3);
P3OUT &=~(BIT0+BIT1+BIT2+BIT3);
P2DIR &=~(BIT2);
P2OUT &=~(BIT2);
P1DIR |= BIT0;
P1OUT |= BIT0;
P1REN |= (BIT1+BIT2+BIT4+BIT5);
P1OUT |= (BIT1+BIT2+BIT4+BIT5);
P1DIR &=~(BIT1+BIT2+BIT4+BIT5);
P1DIR |= BIT6;
}
void Motor_L(float left)
{
TA0CCR2 = left;
}
void Motor_R(float right)
{
TA1CCR1 = right;
}
void MotorSet(float L, float R)
{
Motor_L(L);
Motor_R(R);
}
void mode_0()
{
long i,j;
if((P3IN|0xf0)==0xf0)
MotorSet(37,23);
if((P3IN|0xf0)==0xf1)
MotorSet(37,0);
if(((P3IN|0xf0)==0xf2))
MotorSet(37,23);
if((P3IN|0xf0)==0xf4)
MotorSet(0,23);
if((P3IN|0xf0)==0xf3)
{
MotorSet(37,23);
for(i=0;i<30000;i++);
MotorSet(0,0);
}
if((P3IN|0xf0)==0xf6)
{
MotorSet(37,23);
for(j=0;j<30000;j++);
MotorSet(0,0);
}
}
void mode_1()
{
while(1)
{
if((P3IN|0xf0)==0xf0)
MotorSet(37,23);
if((P3IN|0xf0)==0xf1)
MotorSet(37,0);
if(((P3IN|0xf0)==0xf2))
MotorSet(37,23);
if((P3IN|0xf0)==0xf4)
MotorSet(0,23);
if((P3IN|0xf0)==0xf3)
MotorSet(38,23);
if((P3IN|0xf0)==0xf6)
MotorSet(38,23);
}
}
void P12_Onclick()
{
while(1)
{
mode_0();
}
}
void P14_Onclick()
{
while(1)
{
mode_1();
}
}
void P15_Onclick()
{
TA2CCR0 = 32760;
TA2CCTL0 = CCIE;
TA2CTL = TASSEL_1 + MC_1 + TACLR;
// _enable_interrupts();
_BIS_SR(LPM3_bits + GIE);
while(1)
{
}
}
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD;
P1DIR |=BIT3;
P1SEL |=BIT3;
P2DIR |=BIT0;
P2SEL |=BIT0;
TA0CCR0 = 50;
TA0CCTL2 = OUTMOD_7;
TA1CCR0 = 50;
TA1CCTL1 = OUTMOD_7;
TA0CTL= TASSEL_2 +MC_1;
TA1CTL= TASSEL_2 +MC_1;
TA0CCR2=liftbi;
TA1CCR1=rightbi;
GPIO_init();
// _bis_SR_register(LPM3_bits);
while(1)
{
if((P2IN|0xFB)==0XFF)
P2OUT &=~BIT2;
if((P1IN&0x04)==0x00)
{
if((P2IN|0xFB)==0XFF)
{
P12_Onclick();
}
}
if((P1IN&0x10)==0x00)
{
if((P2IN|0xFB)==0XFF)
P14_Onclick();
}
if((P1IN&0x20)==0x00)
{
if((P2IN|0xFB)==0XFF)
P15_Onclick();
}
}
}
#pragma vector = TIMER2_A0_VECTOR
__interrupt void Timer_A(void)
{
temp++;
if(temp>=60)
{
mode_1();
}
}
全部0条评论
快来发表一下你的评论吧 !