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

📄 0714.c

📁 自动寻迹小车源码驱动两个步进电机
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -