历史上的今天
今天是:2025年02月04日(星期二)
2021年02月04日 | MSP430系列单片机:G2553循迹
2021-02-04 来源:eefocus
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;
}
}
}
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
驱动函数
#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
史海拾趣
|
车用传感器作为汽车电子控制系统的信息源,是汽车电子控制系统的关键部件,也是汽车电子技术领域研究的核心内容之一。汽车电子化和自动化程度越高,对传感器的依赖性就越大,因此,国内外都将车用传感器技术列为重点发展的高新技术。目前,电子零部 ...… 查看全部问答> |
|
我上位机给下位机发指令EB 90 EB 90数据头02 要返回字符个数 90 EB 数据尾 下为机接收到指令进行判断 发回EB 90 EB 90 数据头 02 要发送字符个数 AA BB发送两字节字符 90 EB 数据尾 我用的51 ...… 查看全部问答> |
|
!!!当发生陷阱操作时(INT 2E),中断的级别是PASSIVE_LEVEL吗? 当Windows从用户态陷入内核态后,在执行内核代码的时候,它的中断级别是什么,是PASSIVE_LEVEL吗?? INT 2E的中断等级是什么? 谢谢~~… 查看全部问答> |
|
1、开发板和PC可以连接但无法调试?? 开发班和PC通过交叉网线连接的,可以把NK。BIN下进去,但是无论怎么设置WINCE或 EVC下的 TOOLS\\CONFIGURE 下的DEVICE 属性 都不能进行连接调试 !下载文件 2、另外问题就是在wince5.0 platform manager ...… 查看全部问答> |
|
各位大师,请教一下,中断程序自己的SS和SP存放在中断程序中的什么位置,使得CPU能够迅速找到它,从而能够实现返回位置的压栈操作? 因为中断处理程序的CS和IP可以通过中断向量获得,但是中断向量中并没有SS和SP的值,所以非常奇怪CPU是怎么获得它 ...… 查看全部问答> |




