第一功能:
第二功能:
下圖為黑色跑道,跑道為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 <msp430f5529.h>
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; _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();
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(); }}轉發、關注、點在看都是我最大的動力
做個俗人,貪財好色!