智能车制作

标题: 飞思卡尔状态机模板 请多指点 [打印本页]

作者: vireague    时间: 2015-3-4 08:56
标题: 飞思卡尔状态机模板 请多指点
/***************************************************************
名称: 飞思卡尔 主文件
输入:
输出:
描述:
    :
****************************************************************/

/***************************************************************
名称:宏包含语句
输入:
输出:
描述:
    :
****************************************************************/
#include "common.h"              //常用类型声明和宏定义
#include "include.h"             //基本包含

/***************************************************************
名称:变量定义
输入:
输出:
描述:
    :
****************************************************************/
uint8 SEND_time_count = 5;           //车辆数据无线发送周期


uint8 SENSOR_time     = 0;           //传感器数据更新控制变量
uint8 CCD_time        = 0;           //CCD中断时间控制变量
uint8 CODE_time       = 0;           //编码器采集时间变量

uint8 SENSOR_get_time = 0;           //获取传感器数据控制变量
uint8 CCD_get_time    = 0;           //获取CCD数据控制变量
uint8 CODE_get_time   = 0;           //获取编码器数据控制变量

uint8 CONTROL_time    = 0;           //控制计算时间变量
uint8 MOTOR_time      = 0;           //电机控制时间变量

uint8 LED_time        = 0;           //LED闪烁时间变量

uint8 INF_time        = 0;           //灯塔采集时间变量
uint8 KEY_time        = 0;           //按键采集时间变量

uint8 SEND_time       = 0;           //车辆信息发送时间变量

uint16 count_time     = 0;           //运行时间计数变量

char LED_change       = 0;

uint16 SPEED_CODE[8] = {40,90,200,30,150,100,200,220};
char SPEED_change     = 0;
/***************************************************************
名称:定时器中断初始化变量
输入:
输出:
描述:
    :
****************************************************************/
void PIT0_IRQHandler(void);


/***************************************************************
名称:main函数
输入:

输出:
描述:
    :
****************************************************************/
void main(void)
{

    DisableInterrupts;                      //禁止总中断
    NVIC_SetPriority(PIT0_IRQn,0);          //配置优先级

    /***************************************************************
    名称:相关函数初始化
    输入:
    输出:
    描述:
        :
    ****************************************************************/
    led_init(LED_MAX);                      //初始化LED0,PIT0中断用到LED0
    led_turn(LED3);
    pit_init_ms(PIT0, 1);                   //初始化PIT0,定时时间为: 1ms
    LCD_init();                             //初始化屏幕
    CCD_init();                             //初始化CCD

    tsl1401_led_en(TSL1401_MAX);            //开启补光灯

    BAT_init();                             //初始化电池采集AD
    MMA8451_init();                         //初始化加速度计
    L3G4_init();                            //初始化陀螺仪
    CODE_Init();                            //初始化编码器采集
    MOTOR_init();                           //初始化电机PWM
    Key_Init();                             //初始化按键扫描

    /***************************************************************
    名称:
    输入:
    输出:
    描述:
        :
    ****************************************************************/  
    set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);           //设置PIT0的中断复位函数为 PIT0_IRQHandler
    enable_irq (PIT0_IRQn);                                      //使能PIT0中断
    set_vector_handler(UART4_RX_TX_VECTORn,uart4_test_handler);  //设置中断复位函数到中断向量表里


    START_LOGO();                            //启动页面
    VIEW_LOGO();                             //基本菜单

    EnableInterrupts;                        //总中断允许   

    /***************************************************************
    名称:循环函数
    输入:
    输出:
    描述:
        :
    ****************************************************************/   
    while(1)
    {
      CCD_hand();                            //CCD数据采集与处理
      BAT_get();                             //电池信息采集
      Serive_Key();                          //按键服务函数
      DATA_view();                           //界面数据显示
      //UART_send();                           //串口发送数据
    }
}

/***************************************************************
名称:定时器中断函数
输入:
输出:
描述:
    :
****************************************************************/
void PIT0_IRQHandler(void)
{

    /*********************************************
     *名称:各控制变量自增运算
     ********************************************/  
     SENSOR_time ++;                         //传感器数据更新控制变量
     CCD_time ++;                            //CCD中断时间控制变量
     CODE_time ++;                           //编码器采集时间变量

     SENSOR_get_time ++;                     //获取CCD数据控制变量   
     CCD_get_time ++;                        //获取传感器数据控制变量
     CODE_get_time ++;                       //获取编码器数据控制变量     


     CONTROL_time ++;                        //控制计算时间变量
     MOTOR_time ++;                          //电机控制时间变量

     LED_time ++;                            //LED闪烁时间变量

     INF_time ++;                            //灯塔采集时间变量
     KEY_time ++;                            //按键采集时间变量
     SEND_time ++;                           //车辆信息发送时间变量

     count_time ++;                          //运行时间计数变量   

    /*********************************************
     *名称:传感器数据更新时间
     ********************************************/
    if(SENSOR_time >= SENSOR_time_count)
    {
      MMA8451_read_value();                  //采集加速度计
      L3G4_read_value();                     //采集陀螺仪

      ANGLE_read();                          //直立数据采集

      SENSOR_time = 0;                       //变量清零
    }  

    /*********************************************
     *名称:CCD曝光时间
     ********************************************/
    if(CCD_time >= CCD_time_count)
    {
      tsl1401_time_isr();                    //控制CCD曝光

      DIR_middle_read();                     //方向数据采集

      CCD_time = 0;                          //变量清零
    }

    /*********************************************
     *名称:编码器统计时间
     ********************************************/
    if(CODE_time >= CODE_time_count)
    {
      CODE_measure();                        //采集编码器

      GO_read();                             //速度数据采集

      CODE_time = 0;                         //变量清零
    }

    /*********************************************
     *名称:直立相关计算
     ********************************************/
    if(SENSOR_get_time >= SENSOR_get_time_count)
    {
      ANGLE_linear();                        //直立数据线性化

      ANGLE_Calaulate(MMA8451_ANGLE_now,L3G4_ANGLE_now);
                                             //直立姿态计算
      SPEED_ANGLE_calculate();               //直立速度计算

      SENSOR_get_time = 0;                   //变量清零
    }

    /*********************************************
     *名称:方向相关计算
     ********************************************/
    if(CCD_get_time >= CCD_get_time_count)
    {

      DIR_middle_linear();                   //方向数据线性化

      DIR_middle_Calaulate(DIR_middle_now);     
                                             //方向姿态计算

      SPEED_DIR_middle_calculate();          //方向速度计算

      CCD_get_time = 0;                      //变量清零
    }

     /*********************************************
     *名称:速度相关计算
     ********************************************/
    if(CODE_get_time >= CODE_get_time_count)
    {

      GO_linear();                           //速度数据线性化

      GO_Calaulate(GO_L_now,GO_R_now);       //速度姿态计算

      SPEED_GO_calculate();                  //前进速度计算

      CODE_get_time = 0;                     //变量清零
    }

    /*********************************************
     *名称:控制数据计算
     ********************************************/
    if(CONTROL_time >= CONTROL_time_count)
    {


      SPEED_AFINAL_calculate();              //全局速度计算

      CONTROL_time = 0;                      //变量清零
    }
    /*********************************************
     *名称:电机控制
     ********************************************/
    if(MOTOR_time >= MOTOR_time_count)
    {  
      PWM_reverse();                         //PWM数据反向
      MOTOR_control();                       //电机控制

      MOTOR_time = 0;                        //变量清零
    }

    /*********************************************
     *名称:LED闪烁
     ********************************************/
    if(LED_time >= LED_time_count)
    {

       LED_change ++;

       switch(LED_change)
       {
         case 1:led_turn(LED3);led_turn(LED0);break;          //翻转LED
         case 2:led_turn(LED0);led_turn(LED1);break;          //翻转LED
         case 3:led_turn(LED1);led_turn(LED2);break;          //翻转LED
         case 4:led_turn(LED2);led_turn(LED3);break;          //翻转LED
       }

       if(LED_change == 4)
       {
         LED_change = 0;
       }

       LED_time = 0;                         //变量清零
    }

    /*********************************************
     *名称:灯塔检测
     ********************************************/     
    if(INF_time >= INF_time_count)
    {

      if(INF_static == 8)                     //如果灯塔标志位为停止位
      {
        RUN_static = 0;                       //则车辆停止(目前仅为停止控制PWM 应该为滑行)
      }

      INF_time = 0;                           //变量清零
    }      
    /*********************************************
     *名称:按键检测
     ********************************************/
    if(KEY_time >= KEY_time_count)
    {
      Check_Key();                            //按键扫描

      KEY_time = 0;                           //变量清零
    }

     /*********************************************
     *名称:车辆信息无线发送
     ********************************************/

    if(SEND_time >= SEND_time_count)
    {
      UART_send();                                //发送车辆状态信息

      SEND_time = 0;                           //变量清零
    }   


    /*********************************************
     *名称:运行状态设定
     ********************************************/     
    if(count_time >= count_time_count)
    {
      if(start_static == 1)                    //如果开始允许位为 1  
      {
        RUN_start_time--;                      //倒计时开始自减

        if(RUN_start_time < 0)                 //判断倒计时是否 < 0
        {
          RUN_start_time = 0;                  //则 设置倒计时为 0
        }

        if(RUN_start_time == 0)                //若倒计时为0
        {
          RUN_time = 0;                        //运行时间设置为 0
          RUN_static = 1;                      //运行允许位设置为 1
          start_static = 0;                    //开始允许位设置为 0
          RUN_start_time = 5;                  //倒计时归 0
        }
      }

      if(RUN_static == 1)                      //若运行允许位为 1   
      {

        RUN_time ++;                           //运行时间自加

        if(RUN_time%3 == 0)
        {

//            SPEED_goal = SPEED_CODE[SPEED_change];
//            SPEED_change++;
//            if(SPEED_change == 8)
//            {
//              SPEED_change = 0;
//            }

        }
      }

      count_time = 0;
    }

    /*********************************************
     *名称:清除标志位
     ********************************************/      
    PIT_Flag_Clear(PIT0);                      //清除中断标志位         
}



/***************************************************************
名称:main.h
输入:
输出:
描述:
    :
****************************************************************/
#ifndef _MAIN_H_
#define _MAIN_H_

#define SENSOR_time_count      1          //传感器数据更新时间
#define CCD_time_count         10         //CCD数据更新时间   !!! 未使用
#define CODE_time_count        50         //编码器数据更新时间

#define SENSOR_get_time_count  5          //传感器计算周期
#define CCD_get_time_count     10         //CCD计算周期
#define CODE_get_time_count    50         //编码器计算周期

#define CONTROL_time_count     5          //姿态计算周期
#define MOTOR_time_count       5          //电机控制周期

#define LED_time_count         100        //LED闪烁周期

#define INF_time_count         10         //灯塔检测周期
#define KEY_time_count         10         //按键检测周期



#define count_time_count       1000       //计时计数周期

extern uint8 SEND_time_count ;           //车辆数据无线发送周期

extern uint8 SENSOR_time     ;           //传感器数据更新控制变量
extern uint8 CCD_time        ;           //CCD中断时间控制变量
extern uint8 CODE_time       ;           //编码器采集时间变量

extern uint8 SENSOR_get_time ;           //获取传感器数据控制变量
extern uint8 CCD_get_time    ;           //获取CCD数据控制变量
extern uint8 CODE_get_time   ;           //获取编码器数据控制变量

extern uint8 CONTROL_time    ;           //控制计算时间变量
extern uint8 MOTOR_time      ;           //电机控制时间变量

extern uint8 LED_time        ;           //LED闪烁时间变量

extern uint8 INF_time        ;           //灯塔采集时间变量
extern uint8 KEY_time        ;           //按键采集时间变量

extern uint8 SEND_time       ;           //车辆信息发送时间变量

extern uint16 count_time     ;           //运行时间计数变量


#endif




个人能力有限,请多指点。


作者: 一心一境14    时间: 2015-3-4 17:10
:hug::hug:
作者: 我们的故事很多    时间: 2015-3-4 18:00
                                             
作者: [JACE]    时间: 2015-3-5 11:40
这是要干嘛呢~




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2