📄 main.c
字号:
iL = 0;
}
if (iL >= 500) {
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
0x00);
}
/*
* 如果右电机长时间停止,则断电
*/
if (GmRight.cState == MOTORSTOP) {
iR++;
} else {
iR = 0;
}
if (iR >= 500) {
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
0x00);
}
/*
* 红外线检测
*/
irCheck();
}
/*********************************************************************************************************
** Function name: wallCheck
** Descriptions: 根据传感器检测结果判断是否存在墙壁
** input parameters: 无
** output parameters: 无
** Returned value: ucWall: 低三位从左到右一次代表左前右。1为有墙,0为没墙。
*********************************************************************************************************/
uint8 wallCheck (void)
{
uint8 ucWall = 0;
if (GucDistance[LEFT] & 0x01) {
ucWall |= 0x04;
}else {
ucWall &= ~0x04;
}
if (GucDistance[FRONT] & 0x01) {
ucWall |= 0x02;
}else {
ucWall &= ~0x02;
}
if (GucDistance[RIGHT] & 0x01) {
ucWall |= 0x01;
}else {
ucWall &= ~0x01;
}
return(ucWall);
}
/*********************************************************************************************************
** Function name: sensorInit
** Descriptions: 传感器控制初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sensorInit (void)
{
/*
* 设置连接到传感器信号输出脚的I/O口为输入模式
*/
GPIODirModeSet(GPIO_PORTB_BASE,
LEFTSIDE |
FRONTSIDE_L |
FRONTSIDE |
FRONTSIDE_R |
RIGHTSIDE,
GPIO_DIR_MODE_IN);
/*
* 用PWM驱动红外线发射头产生调制的红外线信号
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模块 */
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频 */
/*
* 初始化PWM2,该PWM驱动斜角红外发射头
*/
GPIOPinTypePWM(GPIO_PORTB_BASE, IRSEND_BEVEL); /* PB0配置为PWM功能 */
PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加计数,立即更新 */
PWMOutputState(PWM_BASE, PWM_OUT_2_BIT, true); /* 使能PWM2输出 */
PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM发生器1 */
/*
* 初始化PWM4,该PWM驱动左前右正方向红外发射头
*/
GPIOPinTypePWM(GPIO_PORTE_BASE, IRSEND_SIDE); /* PE0配置为PWM功能 */
PWMGenConfigure(PWM_BASE, PWM_GEN_2, /* 配置PWM发生器2 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加计数,立即更新 */
PWMOutputState(PWM_BASE, PWM_OUT_4_BIT, true); /* 使能PWM4输出 */
PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM发生器2 */
}
/*********************************************************************************************************
** Function name: stepMotorIint
** Descriptions: 步进电机控制初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void stepMotorIint (void)
{
uint16 n = 0;
/*
* 设置驱动步进电机的八个I/O口为输出模式
*/
GPIODirModeSet(GPIO_PORTD_BASE,
PHRA1 |
PHRA2 |
PHRB1 |
PHRB2 |
PHLA1 |
PHLA2 |
PHLB1 |
PHLB2,
GPIO_DIR_MODE_OUT);
/*
* 对左右电机转动的位置初始化
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA1 | PHRA2 | PHRB1 | PHRB2);
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1 | PHLA2 | PHLB1 | PHLB2,
PHLA1 | PHLA2 | PHLB1 | PHLB2);
/*
* 初始化加速/减速时定时器加载值的数据表
*/
GuiAccelTable[0] = 2236068;
GuiAccelTable[1] = 926179;
for(n = 2; n < 300; n++) {
GuiAccelTable[n] = GuiAccelTable[n - 1] - (2 * GuiAccelTable[n - 1] / (4 * n + 1));
}
/*
* 初始化定时器0,用来控制右电机的转速
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); /* 使能定时器0模块 */
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); /* 配置为32位周期计数模式 */
TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[0]); /* 设置定时时间 */
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 设置为溢出中断 */
IntEnable(INT_TIMER0A); /* 使能定时器0中断 */
TimerEnable(TIMER0_BASE, TIMER_A); /* 使能定时器0 */
/*
* 初始化定时器1,用来控制电机的转速
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); /* 使能定时器1模块 */
TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); /* 配置为32位周期计数模式 */
TimerLoadSet(TIMER1_BASE, TIMER_A, GuiAccelTable[0]); /* 设置定时时间 */
TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); /* 设置为溢出中断 */
IntEnable(INT_TIMER1A); /* 使能定时器1中断 */
TimerEnable(TIMER1_BASE, TIMER_A); /* 使能定时器1 */
}
/*********************************************************************************************************
** Function name: keyInit
** Descriptions: 对连接按键的GPIO口初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void keyInit (void)
{
GPIODirModeSet(GPIO_PORTC_BASE, KEY, GPIO_DIR_MODE_IN); /* 设置按键口为输入 */
}
/*********************************************************************************************************
** Function name: sysTickInit
** Descriptions: 系统节拍定时器初始化。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sysTickInit (void)
{
SysTickPeriodSet(SysCtlClockGet() / 1600); /* 设置定时时钟为625us */
SysTickEnable(); /* 使能系统时钟 */
SysTickIntEnable(); /* 使能系统时钟中断 */
}
/*********************************************************************************************************
** Function name: SensorDebug
** Descriptions: 用数码管显示出传感器状态,方便调试
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sensorDebug (void)
{
zlg7289Download(2, 0, 0, GucDistance[LEFT ]);
zlg7289Download(2, 1, 0, GucDistance[FRONTL]);
zlg7289Download(2, 2, 0, GucDistance[FRONT ]);
zlg7289Download(2, 3, 0, GucDistance[FRONTR]);
zlg7289Download(2, 4, 0, GucDistance[RIGHT ]);
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
main (void)
{
uint8 ucWall;
SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ ); /* 使能PLL,50M */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB ); /* 使能GPIO B口外设 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC ); /* 使能GPIO C口外设 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD ); /* 使能GPIO D口外设 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOE ); /* 使能GPIO E口外设 */
zlg7289Init(); /* 显示模块初始化 */
keyInit(); /* 按键初始化 */
sysTickInit(); /* 系统时钟初始化 */
sensorInit(); /* 传感器初始化 */
stepMotorIint(); /* 步进电机初始化 */
while (keyCheck() == false) { /* 等待按键 */
delay(20000);
sensorDebug(); /* 传感器状态显示 */
}
zlg7289Reset(); /* 复位数码显示 */
while(1){
ucWall = wallCheck(); /* 检测挡板信息 */
switch (ucWall) {
case 0x00: /* 三边都没有挡板,右转弯 */
mouseTurnright();
break;
case 0x01: /* 只有右边存在挡板,不转弯 */
break;
case 0x02: /* 只有前边存在挡板,右转弯 */
mouseTurnright();
break;
case 0x03: /* 只有左边没有挡板,左转弯 */
mouseTurnleft();
break;
case 0x04: /* 只有左边存在挡板,右转弯 */
mouseTurnright();
break;
case 0x05: /* 只有前边没有挡板,不转弯 */
break;
case 0x06: /* 只有右边没有挡板,右转弯 */
mouseTurnright();
break;
case 0x07: /* 三边都存在挡板,向后转 */
mouseTurnback();
break;
default:
break;
}
mazeSearch(); /* 搜索前进 */
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -