智能循迹小车程序报告

  • 程序算法 总框图
    程序设计总思路 方法与算法
    程序设计结果
    写一个实验报告

    img

img

2.

****

-


#include <msp430f5529.h>
#define CPU_F ((double)1000000)
#define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))    //定义延时函数

unsigned int DC_motor=142;                    //初始化车速值
unsigned int i=100;
unsigned int j=50;
unsigned int i_20=20;

void Duoji_init()                             //初始化舵机函数
{
    P2DIR |= BIT0;                            // P2.0 output
    P2SEL |= BIT0;                            // P2.0 options select
    TA1CCR0 = 13000;                          // PWM Period = 20ms
    TA1CCTL1 = OUTMOD_7;                      // 选择复位/置位模式
    TA1CCR1 = 1300;                           // CCR1 PWM duty cycle
    TA1CTL = TASSEL_2 + MC_1 + TACLR ;        // SMCLK, up mode, clear TAR.
}

void DC_Motor_init()                           //初始化电机函数
{
    P2DIR |= BIT4 + BIT5;                      // P2.4,P2.5 output.
    P2SEL |= BIT4 + BIT5;                      // P2.4,P2.5 options select
    TA2CCR0 = 200;                             // PWM Period = 0.2ms
    TA2CCTL1 = OUTMOD_7;                       // CCR1 reset/set
    TA2CCR1 = 0;                               // CCR1 PWM duty cycle
    TA2CCTL2 = OUTMOD_7;                       // CCR2 reset/set
    TA2CCR2 = 0;                               // CCR2 PWM duty cycle
    TA2CTL = TASSEL_2 + MC_1 + TACLR ;         // SMCLK, up mode, clear TAR.
}

void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;                  // Stop WDT
    delay_ms(1000);
    Duoji_init();                               //调用初始化舵机和电机的函数
    DC_Motor_init();

    TA0CCTL0 = CCIE;                           // CCR0 interrupt enabled
    TA0CCR0 = 1000;                            //设置定时时间
    TA0CTL = TASSEL_2 + MC_1 + TACLR;          // SMCLK, upmode, clear TAR

    TA2CCR1 = DC_motor;
    TA2CCR2 = DC_motor;                          //设置小车初始化速度


  __bis_SR_register(LPM0_bits + GIE);          // Enter LPM0, enable interrupts
  __no_operation();                            // For debugger
}

#pragma vector=TIMER0_A0_VECTOR                // Timer0 A0 interrupt service routine
__interrupt void TIMER0_A0_ISR(void)
{
    switch(P6IN&0x1f)
      {
        case 0x0f:                            //右1传感器识别到黑线,大右转
           TA1CCR1 = 1570+4*j+3*i_20;
           TA2CCR1 = 157;
           TA2CCR2 = 122;
           break;
        case 0x17:                           //右2传感器识别到黑线,小右转
           TA1CCR1 = 1490+2*j+2*i_20;
           TA2CCR1 = 152;
           TA2CCR2 = 142;
              break;
        case 0x1b:                               //中间传感器识别到黑线,直行
           TA1CCR1 = 1450;
           TA2CCR1 = 161;
           TA2CCR2 = 161;
           break;
        case 0x1d:                             //左2传感器识别到黑线,小左转
           TA1CCR1 = 1330-3*j-5*i_20;
           TA2CCR1 = 152;
           TA2CCR2 = 182;
           break;
        case 0x1e:
           TA1CCR1 = 1260-6*j-10*i_20;               //左1传感器识别到黑线,大左转
           TA2CCR1 = 162;
           TA2CCR2 = 197;
           break;
        case 0:                          //进入十字时,所有传感器都检测到黑线,继续直行
            TA1CCR1 = 1450;
            TA2CCR1 = 161;
            TA2CCR2 = 161;
        default:
           break;
      }
}