📄 34
字号:
/****************************************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 + -