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