⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 34

📁 电脑鼠走迷宫程序
💻
📖 第 1 页 / 共 4 页
字号:
/****************************************Copyright (c)****************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name:           Mouse_Drive.c
** Last modified Date: 
** Last Version: 
** Description:         电脑鼠底层驱动
** 
**--------------------------------------------------------------------------------------------------------
** Created By: 
** Created date: 
** Version: 
** Descriptions: 
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/


/*********************************************************************************************************
  包含头文件
*********************************************************************************************************/
#include "Mouse_Drive.h"


/*********************************************************************************************************
  定义全局变量
*********************************************************************************************************/
MAZECOOR          GmcMouse                        = {0,0};              /*  保存电脑鼠当前位置坐标      */

uint8             GucMouseDir                     = UP;                 /*  保存电脑鼠当前方向          */

uint8             GucMapBlock[MAZETYPE][MAZETYPE] = {0};                /*  GucMapBlock[x][y]           */
                                                                        /*  x,横坐标;y,纵坐标;          */
                                                                        /*  bit3~bit0分别代表左下右上   */
                                                                        /*  0:该方向无路,1:该方向有路  */

static __MOTOR  __GmLeft                          = {0, 0, 0, 0, 0};    /*  定义并初始化左电机状态      */
static __MOTOR  __GmRight                         = {0, 0, 0, 0, 0};    /*  定义并初始化右电机状态      */

static uint8    __GucMouseState                   = __STOP;             /*  保存电脑鼠当前运行状态      */
static uint32   __GuiAccelTable[400]              = {0};                /*  电机加减速各阶段定时器值    */
static int32    __GiMaxSpeed                      = SEARCHSPEED;        /*  保存允许运行的最大速度      */
static uint8    __GucDistance[5]                  = {0};                /*  记录传感器状态              */


/*********************************************************************************************************
** Function name:       __delay
** Descriptions:        延时函数
** input parameters:    uiD :延时参数,值越大,延时越久
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __delay (uint32  uiD)
{
    for (; uiD; uiD--);
}


/*********************************************************************************************************
** Function name:       __rightMotorContr
** Descriptions:        右步进电机驱动时序
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __rightMotorContr (void)
{
    static int8 cStep = 0;                                              /*  保存电机当前位置            */
    
    switch (__GmRight.cDir) {

    case __MOTORGOAHEAD:                                                /*  向前步进                    */
        cStep = (cStep + 1) % 8;
        break;

    case __MOTORGOBACK:                                                 /*  向后步进                    */
        cStep = (cStep + 7) % 8;
        break;

    default:
        break;
    }
    
    switch (cStep) {

    case 0:                                                             /*  A2B2                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2);
        break;

    case 1:                                                             /*  B2                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA1 | __PHRA2);
        break;

    case 2:                                                             /*  A1B2                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA1 | __PHRA2 | __PHRB2);
        break;

    case 3:                                                             /*  A1                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRB2);
        break;

    case 4:                                                             /*  A1B1                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA2 | __PHRB2);
        break;

    case 5:                                                             /*  B1                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA2);
        break;

    case 6:                                                             /*  A2B1                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRA2 | __PHRB1 | __PHRB2);
        break;

    case 7:                                                             /*  A2                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHRA1 | __PHRA2 | __PHRB1 | __PHRB2,
                     __PHRB1 | __PHRB2);
        break;

    default:
        break;
    }
}


/*********************************************************************************************************
** Function name:       __leftMotorContr
** Descriptions:        左步进电机驱动时序
** input parameters:    __GmLeft.cDir :电机运行方向
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __leftMotorContr (void)
{
    static int8 cStep = 0;                                              /*  保存电机当前位置            */
    
    switch (__GmLeft.cDir) {
        
    case __MOTORGOAHEAD:                                                /*  向前步进                    */
        cStep = (cStep + 1) % 8;
        break;
        
    case __MOTORGOBACK:                                                 /*  向后步进                    */
        cStep = (cStep + 7) % 8;
        break;
        
    default:
        break;
    }
    
    switch (cStep) {

    case 0:                                                             /*  A2B2                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2);
        break;

    case 1:                                                             /*  B2                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLB1 | __PHLB2);
        break;

    case 2:                                                             /*  A1B2                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA2 | __PHLB1 | __PHLB2);
        break;

    case 3:                                                             /*  A1                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA2);
        break;

    case 4:                                                             /*  A1B1                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA2 | __PHLB2);
        break;

    case 5:                                                             /*  B1                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLB2);
        break;

    case 6:                                                             /*  A2B1                        */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA1 | __PHLA2 | __PHLB2);
        break;

    case 7:                                                             /*  A2                          */
        GPIOPinWrite(GPIO_PORTD_BASE,
                     __PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
                     __PHLA1 | __PHLA2);
        break;

    default:
        break;
    }
}


/*********************************************************************************************************
** Function name:       __speedContrR
** Descriptions:        右电机速度调节
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __speedContrR (void)
{
    int32 iDPusle;
    
    iDPusle = __GmRight.uiPulse - __GmRight.uiPulseCtr;                 /*  统计电机还剩余的步数        */
    if (iDPusle <= __GmRight.iSpeed) {
        __GmRight.iSpeed--;
    } else {                                                            /*  非减速区间,则加速到最大值  */
        if (__GmRight.iSpeed < __GiMaxSpeed) {
            __GmRight.iSpeed++;
        } else {
            __GmRight.iSpeed--;
        }
    }
    if (__GmRight.iSpeed < 0) {                                         /*  设置速度下限                */
        __GmRight.iSpeed = 0;
    }
    TimerLoadSet(TIMER0_BASE,TIMER_A,__GuiAccelTable[__GmRight.iSpeed]);/*  设置定时时间                */
}


/*********************************************************************************************************
** Function name:       __speedContrL
** Descriptions:        左电机速度调节
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __speedContrL (void)
{
    int32 iDPusle;
    
    iDPusle = __GmLeft.uiPulse - __GmLeft.uiPulseCtr;                   /*  统计电机还剩余的步数        */
    if (iDPusle <= __GmLeft.iSpeed) {
        __GmLeft.iSpeed--;
    } else {                                                            /*  非减速区间,则加速到最大值  */
        if (__GmLeft.iSpeed < __GiMaxSpeed) {
            __GmLeft.iSpeed++;
        }
    }
    if (__GmLeft.iSpeed < 0) {                                          /*  设置速度下限                */
        __GmLeft.iSpeed = 0;
    }
    TimerLoadSet(TIMER1_BASE,TIMER_A,__GuiAccelTable[__GmLeft.iSpeed]); /*  设置定时时间                */
}


/*********************************************************************************************************
** Function name:       Timer0A_ISR
** Descriptions:        Timer0中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Timer0A_ISR(void)
{
    static int8 n = 0,m = 0;
    
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);                     /*  清除定时器0中断。           */
    switch (__GmRight.cState) {
        
    case __MOTORSTOP:                                                   /*  停止,同时清零速度和脉冲值  */
        __GmRight.iSpeed     = 0;
        __GmRight.uiPulse    = 0;
        __GmRight.uiPulseCtr = 0;
        break;

    case __WAITONESTEP:                                                 /*  暂停一步                    */
        __GmRight.cState     = __MOTORRUN;
        break;

    case __MOTORRUN:                                                    /*  电机运行                    */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -