历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2018年10月17日 | 基于MSP430F5529的金属循迹小车

2018-10-17 来源:eefocus

#include

#include"ldc1314.h"

#include"lcd12864cog.h"

//#include"rtc.h"

#include

unsigned int Just_ch0,Just_ch1,Just_ch2,Just_ch3;

unsigned int Now_ch0,Now_ch1,Now_ch2,Now_ch3;

unsigned int PULSE_NUMBER = 0;

unsigned int beep=0;

int FIVE_DIV_TURNS_NUMBER = 0;//一圈的五分之一

float TURNS_NUMBER = 0;

float   CIRCUM = 0.2041;//轮胎的周长,单位m

float ONE_PULSE_DISTANCE = 0.2041/390;

float   RT_DISTANCE =0;//实时路程

unsigned int half_s=0;

int RTC_SEC=0;

#define BEEP_ON P7OUT|=BIT0;

#define BEEP_OFF P7OUT&=~BIT0;

#define BEEP_DIR P7DIR|=BIT0;

#define Right1  Just_ch0-Now_ch0

#define Right2  Just_ch3-Now_ch3

#define Left1   Just_ch1-Now_ch1

#define Left2   Just_ch2-Now_ch2

#define A_PWM_MOTOR       TA0CCR3   //P1.4

#define B_PWM_MOTOR       TA0CCR4   //P1.5

#define MOTOR_PWM_DUTY    TA0CCR0  //周期长度

#define Normal_speed  3500

#define Turn_S_speed  3500

#define Turn_B_speed  2500

void initalRTC(void)

{

    RTCCTL01 = RTCMODE + RTCBCD + RTCHOLD + RTCTEV_1;

    RTCHOUR = 0x04;

    RTCMIN = 0x30;

    RTCSEC = 0x00;

    RTCDAY = 0x01;

    RTCMON = 0x01;

    RTCYEAR = 0x2011;

    RTCCTL01 &= ~RTCHOLD;//启动实时时钟

    RTCPS1CTL = RT1IP_5 + RT1PSIE;

    RTCPS0CTL = RT0IP_7 + RT0PSIE;

    RTCCTL0 |= RTCRDYIE + RTCTEVIE;

}

void A_MOTOR(A_DIR,A_SPEED)//P1.4

{

    if(A_DIR==1)//正转

    {

        P4OUT |= BIT1;   P4OUT &= ~BIT2;

        A_PWM_MOTOR  = A_SPEED;

    }

    if(A_DIR==2)//反转

    {

        P4OUT |= BIT2;  P4OUT &= ~BIT1;

        A_PWM_MOTOR  = A_SPEED;

    }

    if(A_DIR==3)

    {

        P4OUT |= BIT1+BIT2;

    }

}

void B_MOTOR(B_DIR,B_SPEED)//P1.5

{

    if(B_DIR==1)//正转

    {

        P4OUT |= BIT3;  P3OUT &= ~BIT3;

        B_PWM_MOTOR  = B_SPEED;

    }

    if(B_DIR==2)//反转

    {

        P3OUT |= BIT3;  P4OUT &= ~BIT3;

        B_PWM_MOTOR = B_SPEED;

    }

    if(B_DIR==3)

    {

        P4OUT |= BIT3;  P3OUT |= BIT3;

    }

}

void CAR_WORK_MODE(Status,A_SPEED,B_SPEED)

{

    if(Status==1)//前进

    {    A_MOTOR(1,A_SPEED);  B_MOTOR(1,B_SPEED);   }

    if(Status==2)//后退

    {    A_MOTOR(2,A_SPEED);  B_MOTOR(2,B_SPEED);   }

    if(Status==3)//左转

    {    A_MOTOR(1,A_SPEED);  B_MOTOR(3,B_SPEED);   }

    if(Status==4)//右转

    {    A_MOTOR(3,A_SPEED);  B_MOTOR(1,B_SPEED);   }

    if(Status==5)//停止

    {    A_MOTOR(3,A_SPEED);  B_MOTOR(3,B_SPEED);   }

}

void L298N_IN14_INIT()

{

    P4DIR|=BIT1+BIT2+BIT3;     P3DIR|=BIT3;

    P4OUT|=BIT1+BIT2+BIT3;     P3OUT|=BIT3;

}

void MOTOR_PWM_SET(unsigned int PWM_DUTY)

{

        TA0CCTL2 = CM_1 + SCS + CAP + CCIE;// 上升沿捕获,同步捕获,捕获模式,中断使能

        P1DIR&=~BIT3;

        P1SEL|=BIT3;//上升沿输入捕获引脚

        P1DIR |= BIT4+BIT5;

        P1SEL |= BIT4+BIT5;//电机PWM输出引脚

        MOTOR_PWM_DUTY = PWM_DUTY;

        TA0CCTL3 = OUTMOD_7;

        TA0CCTL4 = OUTMOD_7;

        TA0CTL = TASSEL_2 + MC_1 + TACLR;//增计数计数模式

}

void MOTOR_ENABLE()

{

    P2DIR|=BIT7;

    P2OUT|=BIT7;//电机驱动使能

}

void LCD_PORT_CONFIGRE()

{

    cs_DIR;           //宏定义在LCD头文件

    cd_DIR;

    reset_DIR;

    sclk_DIR;

    sda_DIR;

}

void LDC1314_FIRST_DATA()

{

      LDC1314_INIT();

      _delay_cycles(4000000);//上电延时待ldc1314初始化稳定第一次读值

      LDC1314_Read();

      Just_ch0 = SENSOR_CH[0];

      Just_ch1 = SENSOR_CH[1];

      Just_ch2 = SENSOR_CH[2];

      Just_ch3 = SENSOR_CH[3];

}

void TIMER_INIT(unsigned int TIME)//定时时间 = TIME/32768

{

       P4DIR|=BIT7;//定时时间显示,通过LED亮灭

       TA1CCTL0 = CCIE;

       TA1CCR0 =  TIME;

       TA1CTL = TASSEL_1 + MC_1 + TACLR;

}

void FIXED_DISAPPER()

{

    display_string_8x16(1,70,"SES:");//时间分隔符

    display_string_8x16(5,70,"DST:");//时间分隔符

}

int main(void)

{

    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    MOTOR_PWM_SET(10000);//10KHz的周期

    L298N_IN14_INIT();

    TIMER_INIT(1000);//定时时间 = TIME/32768

    LDC1314_FIRST_DATA();

    MOTOR_ENABLE();

    BEEP_DIR;

    BEEP_OFF;

    LCD_PORT_CONFIGRE();

    LCD_init();

    delay(50);

    clear_screen();   //上电清屏

    FIXED_DISAPPER();

    initalRTC();

    __bis_SR_register(GIE);//总中断打开

  while(1)

  {

      if((Now_ch0>180)||(Now_ch1>180)||(Now_ch2>180)||(Now_ch3>180))

          beep=1;

      if((Now_ch0<170)&&(Now_ch1<170)&&(Now_ch2<170)&&(Now_ch3<170))

          beep=2;

            switch(beep)

            {

            case 1: BEEP_ON;break;

            case 2: BEEP_OFF;break;

            default :break;

            }

      if((Right1==0)&&(Left1==0 )&&( Right2==0)&&(Left2==0))

     {

       CAR_WORK_MODE(1,Normal_speed,Normal_speed);

     }

    //内侧通道-小弯道转弯模式

    if(((Left1==1)||(Right1==1))&&(Left2==0)&&(Right2==0))

    {

      while((Left1==1)&&(Right1==0)&&(Left2==0)&&(Right2==0))

      {

       CAR_WORK_MODE(4,Turn_S_speed ,Turn_S_speed);

      }

      while((Right1==1)&&(Left1==0)&&(Left2==0)&&(Right2==0))

      {

       CAR_WORK_MODE(3,Turn_S_speed ,Turn_S_speed);

      }

    }

    //外侧通道-大弯道转弯模式

    if((Left2==1)||(Right2==1)&&(Left1==0)&&(Right1==0))

    {

      while((Left2==1)&&(Right2==0)&&(Left1==0)&&(Right1==0))

      {

       CAR_WORK_MODE(4,Turn_B_speed,Turn_B_speed);

        while(Right1==0)

          ;//等待转弯完成

       }

       while((Right2==1)&&(Left2==0)&&(Left1==0)&&(Right1==0))

      {

       CAR_WORK_MODE(3,Turn_B_speed,Turn_B_speed);

        while(Left1==0)

        ;//等待转弯完成

       }

     }

    //同侧线圈同时检测到时:

    if(((Right1==1)&&(Right2==1))||((Left1==1)&&(Left2==1)))

    {

      while((Right1==0)&&(Right2==0))

         CAR_WORK_MODE(3,Turn_B_speed,Turn_B_speed);

      while((Left1==0)&&(Left2==0))

         CAR_WORK_MODE(4,Turn_B_speed,Turn_B_speed);

    }

  }

}

#pragma vector=TIMER1_A0_VECTOR

__interrupt void TIMER1_A0_ISR(void)

{

      P4OUT^=BIT7;//定时指示

      _delay_cycles(50);

      LDC1314_Read();

      Now_ch0 = SENSOR_CH[0];    //读取

      Now_ch1 = SENSOR_CH[1];   //右侧通道

      Now_ch2 = SENSOR_CH[2];   //右侧通道

      Now_ch3 = SENSOR_CH[3];    //读取

}

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TIMER0_A1_ISR(void)

{

       PULSE_NUMBER++;

     if(PULSE_NUMBER==195)//1/5圈  整圈390

       {

        PULSE_NUMBER = 0;//清零,重新计数

        //FIVE_DIV_TURNS_NUMBER++;

        TURNS_NUMBER++;

        //实时显示行驶路程:

        RT_DISTANCE = TURNS_NUMBER*CIRCUM;

        display_number_8x16(5,100,RT_DISTANCE,1);//实时路程,两位有效小数

       }

    TA0CCTL2 &=~CCIFG;//清除中断标志位

}

#pragma vector=RTC_VECTOR

__interrupt void RTC_ISR(void)

{

    switch (__even_in_range(RTCIV, RTC_RT1PSIFG))

    {

        case RTC_NONE:

            break;

        case RTC_RTCRDYIFG:

         //   __bic_SR_register_on_exit(LPM3_bits);

            break;

        case RTC_RTCTEVIFG:

            break;

        case RTC_RTCAIFG:

            break;

        case RTC_RT0PSIFG:

         //   P4OUT ^= BIT7;

            break;

        case RTC_RT1PSIFG:

        //    P1OUT ^= BIT0;    //产生0.5s的信号,通过加倍产生1s的信号

             half_s++;

            while(half_s==2)

            {

                half_s=0;

                RTC_SEC++;

               // while(RTC_SEC>delay_time)//RTC模块放在读值之前,需减去读值延时的时间

                display_number_8x16(1,100,RTC_SEC,-1);

                display_number_8x16(1,10,Now_ch0,-1);

            }

            break;

        default:

            break;

    }

}


推荐阅读

史海拾趣

Gravitech公司的发展小趣事

对于电子猜数玩具电路的网友可能提出的问题,我整理了一些常见问题及其回答:

一、电路设计相关问题

  1. 问题:电子猜数玩具电路的基本组成部分有哪些?
    回答:电子猜数玩具电路通常由触摸控制器、多谐振荡器、LED驱动电路和受控声、光电路等部分组成。具体来说,包括时基集成电路(如NE555)、非门集成电路(如CD4069)、计数分配器集成电路(如CD4017)、音乐集成电路、继电器、二极管、发光二极管、电阻器、电容器等元器件。

  2. 问题:如何设计电路以确保游戏能够正确运行?
    回答:设计电路时,需要确保各个部分能够协调工作。例如,触摸控制器负责检测玩家的输入,多谐振荡器产生计数脉冲,LED驱动电路控制LED的显示,受控声、光电路则在玩家猜中数字时发出声音和光信号。设计时还需要注意电路的稳定性和可靠性,避免信号干扰和元件损坏。

  3. 问题:电路中的LED如何布局以实现数字显示?
    回答:LED的布局通常根据要显示的数字范围进行设计。例如,如果要显示0-9的数字,可以使用7段LED数码管或分散的LED灯。7段LED数码管内部含有8个LED小灯(7个用于显示数字段,1个用于小数点或原点),通过控制这些LED的亮灭来显示不同的数字。如果是分散的LED灯,则需要根据数字的形状来布置LED,并通过编程控制它们的亮灭。

二、元件选择与参数设置问题

  1. 问题:如何选择适合的集成电路和元器件?
    回答:选择集成电路和元器件时,需要考虑电路的需求、元器件的性能参数以及成本等因素。例如,时基集成电路可以选择NE555,因为它具有成本低、易于获取和使用的优点;非门集成电路可以选择CD4069,因为它提供了多个非门输出,方便电路设计;发光二极管则需要选择高亮度的型号以确保显示效果良好。

  2. 问题:电阻器和电容器的参数如何设置?
    回答:电阻器和电容器的参数设置需要根据电路的具体需求来确定。电阻器的阻值会影响电流的大小和LED的亮度,因此需要根据LED的电流需求和驱动电压来选择合适的阻值。电容器的容量则会影响多谐振荡器的振荡频率和电路的响应时间,需要根据实际需要进行调整。

三、调试与故障排除问题

  1. 问题:如何调试电子猜数玩具电路?
    回答:调试电路时,可以按照以下步骤进行:首先检查电路连接是否正确,包括电源连接、信号连接和地线连接等;然后使用万用表等工具测试电路中的电压和电流是否正常;最后观察LED的显示和声音输出是否符合预期。如果出现问题,可以逐步排查各个部分,找出故障点并进行修复。

  2. 问题:电路中出现LED不亮或声音不响的故障怎么办?
    回答:如果LED不亮或声音不响,首先需要检查电源是否正常供电;然后检查相关元器件是否损坏或接触不良;最后检查控制信号是否正确传输。如果以上都正常,可能是程序设计或电路布局存在问题,需要进一步检查和调整。

四、拓展与改进问题

  1. 问题:如何增加电子猜数玩具的趣味性和挑战性?
    回答:可以通过增加游戏难度、丰富游戏模式或添加互动元素等方式来增加电子猜数玩具的趣味性和挑战性。例如,可以设置不同的难度等级、增加倒计时功能、设置奖励机制或添加与手机等设备的互动功能等。

  2. 问题:如何对电子猜数玩具电路进行改进以降低成本或提高性能?
    回答:降低成本可以通过选择性价比更高的元器件、优化电路设计、减少不必要的元器件数量等方式实现;提高性能则可以通过升级元器件、改进电路设计、优化算法等方式实现。具体改进方案需要根据实际情况和需求进行制定。

Eska公司的发展小趣事

除了造纸业务外,Eska公司还专注于消防手套的研发与制造。50多年前,Eska就开始研发消防手套,并一直将安全性放在首位。公司严格遵循最大安全性、敏感度、耐火、切割保护、防热和防伤害等标准,确保消防手套在各种环境下都能为消防员提供可靠的保护。Eska的消防手套因其卓越的性能和质量,深受世界和欧洲消防竞技大赛冠军及参赛者的信任和喜爱。

ECLIPSE公司的发展小趣事

尽管Eclipse是一个开源项目,但其背后也有着商业化的运作。一些公司看到了Eclipse的潜力,纷纷推出了基于Eclipse的商业产品。这些产品不仅继承了Eclipse的优秀特性,还加入了一些独特的功能和服务,以满足不同客户的需求。通过商业化运作,Eclipse的影响力得到了进一步扩大。

Capital Advanced Technologies公司的发展小趣事

面对未来电子行业的发展趋势和市场变化,CAT制定了明确的发展战略和布局。公司将继续加大研发投入,推动技术创新和产业升级;同时,积极拓展新的应用领域和市场空间,寻求与更多合作伙伴的共赢发展。此外,CAT还将注重人才培养和团队建设,为公司的长远发展提供坚实的人才保障。

通过以上五个故事,我们可以看到Capital Advanced Technologies公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和战略布局等方面的不断努力,逐渐成为了电子行业的领军企业。

Discera公司的发展小趣事

2001年,位于美国加利福尼亚州圣荷塞市的Discera公司正式成立,由一群热衷于半导体技术的工程师和投资者共同创立。他们看到了CMOS MEMS谐振器技术的巨大潜力,并决定将其作为公司的核心业务。经过数年的研发和测试,Discera终于成功开发出了一款性能优越的CMOS MEMS谐振器,该产品具有防震效果强、温度稳定性好和频率可编程性等显著优势。

Good-Ark公司的发展小趣事
声控报警电路应安装在需要监控的区域附近,并确保声音传感器能够充分接收环境声音。同时,应避免将传感器安装在有强风、机械振动等干扰源的地方。

问答坊 | AI 解惑

ccs有没有函数感应功能,就像VC那样?

ccs有没有函数感应功能,就像VC那样?…

查看全部问答>

大家帮忙给看一个单片机程序哪出错了 4*4键盘+lcd1602

我做的程序的一部分是 从液晶屏显示键盘输入  写完之后发现运行总是出错不管摁一下什么总是显示很多0 但如果一步一步调试的话显示正确 自己看不出来哪错了 大家帮忙给看一下吧 程序如下: key.c #include \"key.h\" #include \"SPCE06 ...…

查看全部问答>

wince 5中IE不能下载大文件?

好像IE把windows目录设置为cache了,下载大的mp3/rar文件出现空间不足。其实我外部有SD卡 修改了registry,设置cache为外部,还是不行 …

查看全部问答>

请问谁有wince5.0正式版的序列号,麻烦共享下,感激不尽啊

请问谁有wince5.0正式版的序列号,麻烦共享下,感激不尽啊 …

查看全部问答>

CD4098消抖电路

现在需要用cd4098——双单稳态触发器搭建一个键盘消抖电路,以前一直是软件消抖的,这个芯片不太会用,望高手赐教!…

查看全部问答>

求助:关于I2C Config

I2C_Config IIC_Configt ={      0,//主模式      0,      (20-5),//scl low time      (20-5),      1,      0,  ...…

查看全部问答>

eZ430-RF2500体验之前奏

  今天上午刚刚收到eZ430-RF2500,上传几张照片,作为一个纪念,另外谢谢寄给我东西的那位同学的精心包装,什么话都不说,先上图,呵呵…

查看全部问答>

2011年全国电子设计大赛基本仪器和主要元器件清单

本帖最后由 paulhyde 于 2014-9-15 09:47 编辑 、基本仪器清单 20MHz普通示波器(双通道,外触发输入,有X轴输入) 60MHz双通道数字示波器 低频信号发生器(1Hz~1MHz) 标准高频信号发生器(1MHz~30MHz,可输出1mV小信号) 函数发生器(10 M ...…

查看全部问答>

微电流放大总结

微电流放大电路,可以放大脉动微电流信号…

查看全部问答>

请您帮我看看这个电路中的两个疑问 谢谢

大家有谁知道发射级的电感作用是什么?另外,还请高手赐教一下这个调幅电路的放大倍数应该是多少,我是新手  这方面还请大家多多给予指导帮助,谢谢您。…

查看全部问答>