實現功能
第一功能:
小車從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();
}
}
-
電機
+關注
關注
139文章
8317瀏覽量
142183 -
引腳
+關注
關注
16文章
1045瀏覽量
48985 -
小車
+關注
關注
0文章
49瀏覽量
20529 -
驅動模塊
+關注
關注
0文章
57瀏覽量
14008 -
MSP430F5529
+關注
關注
12文章
52瀏覽量
19959
發布評論請先 登錄
相關推薦
評論