历史上的今天
返回首页

历史上的今天

今天是: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


推荐阅读

史海拾趣

Aavid Thermalloy公司的发展小趣事

Aavid Thermalloy公司是一家专注于热管理解决方案的公司,以下是关于该公司发展的五个相关故事:

  1. 公司成立和早期发展: Aavid Thermalloy公司成立于1964年,总部位于美国新罕布什尔州。最初,公司主要从事铝材料加工和制造业务,为电子行业提供散热器和热管理解决方案。在成立初期,公司注重产品质量和技术创新,逐渐赢得了客户的信赖和认可。

  2. 技术创新和产品扩展: 随着市场需求的变化和技术的进步,Aavid Thermalloy不断进行技术创新,并逐步扩展产品线。公司不仅提供各种类型的散热器产品,还涉足导热材料、热管、热板等领域,为客户提供全方位的热管理解决方案。

  3. 国际市场拓展: Aavid Thermalloy致力于拓展国际市场,与全球各地的客户建立了广泛的合作关系。公司产品远销美国、欧洲、亚洲等地区,销售网络覆盖了全球主要的电子市场。同时,公司在一些国家设立了分支机构和办事处,加强了对当地市场的服务和支持。

  4. 合并和收购: 为了进一步扩大业务规模和增强竞争力,Aavid Thermalloy进行了一系列的合并和收购活动。公司通过并购具有相关技术和市场资源的企业,扩大了产品线和市场份额,加强了在热管理领域的领先地位。

  5. 可持续发展和未来展望: Aavid Thermalloy公司致力于可持续发展,注重环境保护和社会责任。公司通过采取节能减排、提高资源利用率等措施,努力降低对环境的影响。未来,公司将继续致力于技术创新和产品升级,为客户提供更优质的产品和服务,推动热管理行业的发展和进步。

Hi-Light Electronic Co Ltd公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的关键设备,其专业性与科普性并存。从广义上讲,任何能与电视机连接并处理信号的网络终端设备均可视为机顶盒。随着技术的发展,机顶盒已从早期的模拟频道增补器演变为支持高清、甚至4K超高清内容的数字设备。

机顶盒的核心功能在于接收来自有线电缆、卫星、宽带网络及地面广播的数字电视信号,并通过解码处理,将这些信号转换成适合电视机播放的音视频格式。此外,机顶盒还集成了多种增值服务,如电子节目指南、因特网网页浏览、在线购物、视频点播等,极大地丰富了用户的观看体验。

根据功能和应用场景的不同,机顶盒可分为数字机顶盒和网络机顶盒两大类。数字机顶盒侧重于实现数模转换,让用户能在模拟电视上观看数字电视;而网络机顶盒则能接入互联网,提供更广泛的娱乐内容和互动服务。

在技术不断进步的今天,机顶盒正朝着高清化、智能化方向发展。未来,随着人工智能、云计算等技术的融合应用,机顶盒将能提供更个性化的节目推荐、语音控制等便捷功能,进一步提升用户的观看体验。同时,随着智能电视的普及,机顶盒作为智能电视的有效补充,其市场需求也将持续增长。

BAHCO公司的发展小趣事

随着全球化趋势的加速推进,BAHCO也在积极拓展全球市场。目前,公司已在多个国家和地区设立了分支机构或销售网络,实现了全球范围内的业务覆盖。未来,BAHCO将继续加大在研发、生产、销售等方面的投入力度,不断提升产品质量和服务水平。同时,公司还将积极探索新的商业模式和合作方式,以适应不断变化的市场环境并实现可持续发展。

这些故事虽然不直接涉及BAHCO在电子行业的发展,但它们展示了BAHCO在工具制造领域的辉煌历程和不断进取的精神。作为一家拥有百年历史的知名企业,BAHCO凭借其卓越的品质、创新精神和全球市场布局,成功地在工具制造业中占据了重要地位。未来,随着技术的不断进步和市场需求的不断变化,相信BAHCO将继续保持其领先地位并迎来更加美好的发展前景。

Crydom公司的发展小趣事

一直以来,BAHCO都秉持着创新的设计理念和对品质的极致追求。其鱼和鱼钩的商标不仅代表了公司的品牌形象,更是品质的保证。通过不断的研发和技术创新,BAHCO的产品在功能性、耐用性和舒适性等方面都达到了行业领先水平。这种对品质的不懈追求,使得BAHCO在全球工具市场上获得了广泛的认可和好评。

APC (APC by Schneider Electric)公司的发展小趣事

APC的产品和服务在全球范围内赢得了广泛认可。其InfraStruXure产品线因其集成式的电力、制冷、机架、管理和服务实现了一种开放、具有适应性且集成化的解决方案,赢得了近20个奖项。此外,APC还因其卓越的产品和业务表现,在多个年份赢得了全球100多个奖项。这些奖项不仅证明了APC在电子行业中的领先地位,也反映了其对于创新和质量的不懈追求。

BREL International Components公司的发展小趣事

BREL International Components公司深知合作共赢的重要性。公司积极与上下游企业建立紧密的合作关系,共同开发新产品、拓展新市场。通过与供应商的深度合作,BREL确保了原材料的稳定供应和成本控制;通过与客户的紧密沟通,BREL及时了解市场需求,调整产品策略。此外,BREL还积极参与行业交流和合作,与同行共同推动电子行业的发展。

问答坊 | AI 解惑

DM74LS154N引脚的作用

请问大家DM74LS154N的引脚的作用,我刚开始学单片机,自己买了很多零件,但是有些零件我不知道有什么用。想请教高手。谢谢…

查看全部问答>

陶瓷传感器在汽车中的五大应用

车用传感器作为汽车电子控制系统的信息源,是汽车电子控制系统的关键部件,也是汽车电子技术领域研究的核心内容之一。汽车电子化和自动化程度越高,对传感器的依赖性就越大,因此,国内外都将车用传感器技术列为重点发展的高新技术。目前,电子零部 ...…

查看全部问答>

一个通信协议我怎么还是写不出来

     我上位机给下位机发指令EB 90 EB 90数据头02 要返回字符个数 90 EB 数据尾   下为机接收到指令进行判断 发回EB 90 EB 90 数据头 02 要发送字符个数 AA BB发送两字节字符 90 EB 数据尾   我用的51 ...…

查看全部问答>

嵌入式培训那里OK?

嵌入式培训那里OK?…

查看全部问答>

!!!当发生陷阱操作时(INT 2E),中断的级别是PASSIVE_LEVEL吗?

当Windows从用户态陷入内核态后,在执行内核代码的时候,它的中断级别是什么,是PASSIVE_LEVEL吗?? INT 2E的中断等级是什么? 谢谢~~…

查看全部问答>

开发板和PC可以连接但无法调试???

1、开发板和PC可以连接但无法调试?? 开发班和PC通过交叉网线连接的,可以把NK。BIN下进去,但是无论怎么设置WINCE或 EVC下的 TOOLS\\CONFIGURE 下的DEVICE 属性 都不能进行连接调试 !下载文件 2、另外问题就是在wince5.0 platform manager ...…

查看全部问答>

windows2000如何恢复默认任务栏?

因为win2000没有锁定任务栏一项,任务栏跑到桌面的上方,因为如果恢复到下方去???郁闷中…

查看全部问答>

CPU是怎么找到中断处理程序的SS和SP的?

各位大师,请教一下,中断程序自己的SS和SP存放在中断程序中的什么位置,使得CPU能够迅速找到它,从而能够实现返回位置的压栈操作? 因为中断处理程序的CS和IP可以通过中断向量获得,但是中断向量中并没有SS和SP的值,所以非常奇怪CPU是怎么获得它 ...…

查看全部问答>

TI 书

SysCtlClockSet函数负责设置LM3S处理器的时钟,大家都知道,现在的ARM芯片越来越强大,时钟系统也越来越复杂。到底它的时钟设置会有多复杂呢,还是深入SysCtlClockSet函数来一探究竟吧。 SysCtlClockSet函数只有一个参数,所有的时钟设置都在 ...…

查看全部问答>