📄 0714.c
字号:
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/76000); // 设置定时器装载值
TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
TimerEnable(TIMER1_BASE, TIMER_A);
IntEnable(INT_TIMER1A);
}
//------------------------------------------------------------------------------------
// 函数名称: WheelPulseIni
// 函数功能: 轮子脉冲检测初始化。
//
//------------------------------------------------------------------------------------
void WheelPulseIni(void)
{
// 配置引脚为输入
GPIODirModeSet(GPIO_PORTA_BASE, PULSE_R, GPIO_DIR_MODE_IN);
GPIODirModeSet(GPIO_PORTB_BASE, PULSE_L, GPIO_DIR_MODE_IN);
// 配置引脚下降沿触发中断
GPIOIntTypeSet(GPIO_PORTA_BASE,PULSE_R,GPIO_FALLING_EDGE);
GPIOIntTypeSet(GPIO_PORTB_BASE,PULSE_L,GPIO_FALLING_EDGE);
// 使能引脚输入中断
GPIOPinIntEnable(GPIO_PORTA_BASE,PULSE_R);
GPIOPinIntEnable(GPIO_PORTB_BASE,PULSE_L);
// 使能GPIO PA口和GPIO PB口中断
IntEnable(INT_GPIOA);
IntEnable(INT_GPIOB);
}
//------------------------------------------------------------------------------------
// 函数名称: Check_Infrared
// 函数功能: 红外检测函数
// 入口参数: option,选择检测的参数。
// 0,检测所有参数
// 1,检测左侧挡板
// 2,检测前方挡板
// 3,检测右侧挡板
// 4,检测左侧安全距离
// 5,检测右侧安全距离
// 出口参数: State,反应传感器状态。State每四位代表一个参数状态。从左至右20位(0xXXXXX)
// 分别表示五个参数:左侧远距,左侧近距,前方,右侧近距,右侧远距。如值为0x11100表示左
// 侧有挡板,且太靠近左侧挡板,前方有挡板,右方没有挡板。
//------------------------------------------------------------------------------------
unsigned long Check_Infrared(unsigned char option)
{
unsigned long State = 0;
unsigned char j = 0,i = 0;
if(option == 4 || option == 5)// 如果只需测近距,直接跳到装载定时器为35KHz的程序处
goto jinju;
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/76000); // 设置定时器装载值
if(option==0||option==1)
{
GPIOPinWrite( GPIO_PORTB_BASE,SEND , SEND); // 发送调制信号
Delay(150);
//GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND); // 停止发送
for(i=0,j=0;i<10;i++) // 检测传感器输出信号
{
if(GPIOPinRead(GPIO_PORTA_BASE, OUT_L)==0)
j++;
}
GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND); // 停止发送
if(j>5) // 左边存在挡板
{
if(option == 1) // 只测此一个参数
return 1; // 返回
GPIOPinWrite(GPIO_PORTC_BASE, DLL, 0); // 点亮DLL
State |= 1 << 16; // 置标志位
}
else // 左边存在支路
{
if(option == 1)
return 0;
GPIOPinWrite(GPIO_PORTC_BASE, DLL, DLL); // 熄灭DLL
State |= 0 << 16;
}
}
if(option==0||option==2)
{
GPIOPinWrite( GPIO_PORTB_BASE,SEND , SEND);
Delay(150);
//GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
for(i=0,j=0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, OUT_F)==0)
j++;
}
GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
if(j>5) // 前面存在挡板
{
if(option == 2)
return 1;
GPIOPinWrite(GPIO_PORTC_BASE, DF, 0);
State |= 1 << 8;
}
else // 前面没有挡板
{
if(option == 2)
return 0;
GPIOPinWrite(GPIO_PORTC_BASE, DF, DF);
State |= 0 << 8;
}
}
if(option==0||option==3)
{
GPIOPinWrite( GPIO_PORTB_BASE,SEND , SEND);
Delay(150);
//GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
for(i=0,j=0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, OUT_R)==0)
j++;
}
GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
if(j>5) // 右边存在挡板
{
if(option == 3)
return 1;
GPIOPinWrite(GPIO_PORTB_BASE, DRR, 0);
State |= 1 << 0;
}
else // 右边存在支路
{
if(option == 3)
return 0;
GPIOPinWrite(GPIO_PORTB_BASE, DRR, DRR);
State |= 0 << 0;
}
}
jinju:
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/70000); // 设置定时器装载值
if(option == 0||option == 4)
{
GPIOPinWrite( GPIO_PORTB_BASE,SEND , SEND);
Delay(150);
//GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
for(i=0,j=0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, OUT_L)==0)
j++;
}
GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
if(j>8) // 左边太靠近挡板,应向右调整
{
if(option == 4)
return 1;
GPIOPinWrite(GPIO_PORTC_BASE, DL, 0);
State |= 1 << 12;
}
else // 左边正常
{
if(option == 4)
return 0;
GPIOPinWrite(GPIO_PORTC_BASE, DL, DL);
State |= 0 << 12;
}
}
if(option ==0 || option == 5)
{
GPIOPinWrite( GPIO_PORTB_BASE,SEND , SEND);
Delay(150);
//GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
for(i=0,j=0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, OUT_R)==0)
j++;
}
GPIOPinWrite( GPIO_PORTB_BASE,SEND , ~SEND);
if(j>8) // 右边太靠近挡板,应向左调整
{
if(option == 5)
return 1;
GPIOPinWrite(GPIO_PORTC_BASE, DR, 0);
State |= 1 << 4;
}
else // 右边正常
{
if(option == 5)
return 0;
GPIOPinWrite(GPIO_PORTC_BASE, DR, DR);
State |= 0 << 4;
}
}
return(State); // 返回State
}
//------------------------------------------------------------------------------------
//
//
//------------------------------------------------------------------------------------
int main(void)
{
SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ ); // 设定晶振为时钟源
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA ); // 使能GPIO A口外设
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB ); // 使能GPIO B口外设
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC ); // 使能GPIO C口外设
GPIODirModeSet(GPIO_PORTB_BASE, KEY2, GPIO_DIR_MODE_IN); // 设定按键为输入
if(GPIOPinRead(GPIO_PORTB_BASE, KEY2)==0) // 是否恢复JTAG功能判断
{
while(1);
}
/* 设定JTAG口为GPIO口 */
GPIODirModeSet(GPIO_PORTC_BASE, DLL | DL | DF | DR, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTB_BASE, DRR , GPIO_DIR_MODE_OUT);
/* 设定测挡板的红外信号端口为输入 */
GPIODirModeSet(GPIO_PORTA_BASE, OUT_L | OUT_R | OUT_F, GPIO_DIR_MODE_IN);
PWMTimer0AIni(); // PWM初始化
PULSEIni(); // 调制信号初始化
WheelPulseIni(); // 测速初始化
while(1)
{ LeftPulse = 10; // 设定电机运行任务
RightPulse = 10;
WheelStop_L = 0; // 清零电机停止标志位
WheelStop_R = 0;
LeftWheelRun(1, 99); // 启动左右电机
RightWheelRun(1, 99);
while(!(WheelStop_L && WheelStop_R)) // 等待运行结束,状态在中断中改变
Check_Infrared(0); // 等待过程中进行红外检测
PulCount_L -= LeftPulse; // 误差补偿到下一次运动中
PulCount_R -= RightPulse;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -