MSP430系列单片机:G2553循迹

2018.7
还没有进入硕士研究生的生活,就已经被老师拉来给本科大一辅导单片机的入门课程…也是没谁了…
在无聊之余自己也玩起以前玩的TI的MSP430系列,话说自己以前也用这系列搭过蜘蛛机器人,在机器人动起来的时候还是有点成就感的。

7.24
课程结束,本科生用G2搭了一个小车来循迹比赛,赛道是师兄花的,看上去还有点复杂。一些本科生也是厉害,两个红外传感器就搞定地图。估计这就是所谓的运气和实力了。

在课程总结,和老师坐在一起,就感觉事情并没有那么简单。。。
嗯,开始套路我们准研一做循迹小车当复习单片机知识….话说,老师给我的是一种莫名的不能拒绝的感觉。所以…迷迷糊糊就答应下来了。

7.26
花了一天的时间把原来要求控速的小车接上红外来改装,按规则写代码(这里声明,我的印象里,循迹的本质是,走完所有有可能的路线或者按逻辑来走而不是特定规则,这才叫循迹),虽然车还是左摇右摆的走,但也走通了,附上代码,4红外传感。

主函数

#include "Motor.h"

void timer_init()
{
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;
    TA1CTL = TASSEL_2 + MC_1;
    TA1CCR0 = T;
    TA1CCTL1 = OUTMOD_7;
    TA1CCTL2 = OUTMOD_7;

    _EINT();
}

void GPIO_init(void)
{
    P1DIR = 0x00;

    P2DIR |= (BIT1 + BIT2 + BIT3 + BIT4);
    P2OUT &= ~(BIT1+BIT3);
    P2SEL |= (BIT2 + BIT4);
}

/* main.c*/
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    timer_init();
    GPIO_init();
    while(1)
    {
        switch(flag)
        {
        case 0:
            mode_0();
            break;
        case 1:
            mode_1();
            break;
        case 2:
            mode_2();
            break;
        case 3:
            mode_3();
            break;
        case 4:
            mode_4();
            break;
        case 5:
            mode_5();
            break;
        }
    }
}


驱动函数

#ifndef Motor
#define Motor

#include "param.h"
#include "msp430.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

volatile int flag = 0;
volatile int mode5_flag = 0;

void Motor_L(float left)
{
    LeftMotor_Forward
    if(left<0)
    {
        LeftMotor_Back
        left = -left;
    }
    LeftPWMOUT = left*T/100;
}
void Motor_R(float right)
{
    RightMotor_Forward
    if(right<0)
    {
        RightMotor_Back
        right = -right;
    }
    RightPWMOUT = right*T/100;
}
void MotorSet(float L, float R)
{
    Motor_L(L);
    Motor_R(R);
}
void DriveMotor(float PIDout)
{
    float left=BASIC+PIDout;
    float right=BASIC-PIDout;
    if(left>100)
        left=100;
    if(left<-100)
        left=-100;
    if(right>100)
        right=100;
    if(right<-100)
        right=-100;
    Motor_L(left);
    Motor_R(right);//工作正常
}
void mode_0()
{
    while(flag==0)
    {
        if((P1IN|0xf0)==0xff)//1111
            MotorSet(70,68);
        if((P1IN|0xf0)==0xfd)//1101
            MotorSet(-100,100);
        if((P1IN|0xf0)==0xfb)//1011**
            MotorSet(100,-100);
        if((P1IN|0xf0)==0xf3)//0011zuo
        {
            MotorSet(65,0);
            delay_us(500000);
            MotorSet(70,68);
        }
        if((P1IN|0xf0)==0xfc)//1100you
        {
            MotorSet(-20,70);
            delay_us(500000);
            MotorSet(70,68);
            flag++;

        }
    }
}
void mode_1()
{
    if((P1IN|0xf0)==0xff)//1111
        MotorSet(70,68);
    if((P1IN|0xf0)==0xfc)//1100zuo
        MotorSet(70,68);
    if((P1IN|0xf0)==0xf3)//0011
    {
        MotorSet(70,68);
        flag++;
    }
}
void mode_2()
{
    if((P1IN|0xf0)==0xff)//1111
        MotorSet(70,68);
    if((P1IN|0xf0)==0xfc)//1100
    {
        MotorSet(-10,70);
        delay_us(500000);
        MotorSet(70,68);
    }
    if((P1IN|0xf0)==0xf3)//0011
    {
        MotorSet(60,0);
        delay_us(500000);
        MotorSet(70,68);

    }
    if((P1IN|0xf0)==0xf0)//0000
        MotorSet(70,68);
    if((P1IN|0xf0)==0xf9)//1001
    {
        MotorSet(0,0);
        delay_us(5000000);//5s
        MotorSet(-10,50);
        flag++;
    }
}
void mode_3()
{
    if((P1IN|0xf0)==0xff)//1111
        MotorSet(70,68);
    if((P1IN|0xf0)==0xfc)//1100
    {
        MotorSet(-10,70);
        delay_us(500000);
        MotorSet(70,68);
    }
    if((P1IN|0xf0)==0xf3)//0011
    {
        flag++;
        MotorSet(70,68);
    }
}
void mode_4()
{
    if((P1IN|0xf0)==0xff)//1111
        MotorSet(70,68);
    if((P1IN|0xf0)==0xfc)//1100
        MotorSet(70,68);
    if((P1IN|0xf0)==0xf3)//0011
    {
        flag++;
        MotorSet(70,68);
    }
    if((P1IN|0xf0)==0xf0)//0000
    {
        MotorSet(100,-100);
        delay_us(2000000);
        MotorSet(70,68);
        flag++;
    }
}
void mode_5()
{
    if((P1IN|0xf0)==0xff)//1111
        MotorSet(70,68);
    if((P1IN|0xf0)==0xf3)//0011
    {
        MotorSet(60,0);
        delay_us(500000);
        MotorSet(70,68);
    }
    if((P1IN|0xf0)==0xfc)//1100
    {
        MotorSet(-10,70);
        delay_us(500000);
        MotorSet(70,68);
        mode5_flag++;
    }
    while(mode5_flag==2)
    {
        mode5_flag = 0;
        flag = 0;
    }
}
#endif

参数设置

#ifndef param
#define param

#define P 1
#define I 0.01
#define D 0
#define LeftMotor_Forward   {P2OUT &= ~BIT1;}
#define LeftMotor_Back  {P2OUT |= BIT1;}
#define RightMotor_Forward  {P2OUT &= ~BIT3;}
#define RightMotor_Back {P2OUT |= BIT3;}
#define LeftPWMOUT  TA1CCR1
#define RightPWMOUT TA1CCR2
#define F   10000
#define T   (8000000/F)
#define BASIC 100

#endif

猜你喜欢

转载自blog.csdn.net/qq_24182661/article/details/81214784