×
嵌入式 > 技术百科 > 详情

基于MSP430F5529的金属循迹小车

发布时间:2020-06-10 发布时间:
|

#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;

    }

}





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?