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

📄 mouse_drive.c

📁 周立功电子鼠V1.3内部演示版源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "Mouse_Drive.h"

void Delay(unsigned long d);
void WheelPulseIni(void);
void GPIO_Port_A_ISR(void);
void GPIO_Port_B_ISR(void);
void Timer0Ini(void);
void PwmPercent(int32 percent);
void SendInfrared(uint32 frequency);
void ForbidInfrared(void);
void LeftWheelRun(int sel);
void RightWheelRun(int sel);
void SysTickIni(void);
void SysTick_ISR(void);
void wheeljamcheck(void);
void wheelJamdispose(void);
void MouseRUNIni( int run,int puls,int percent);
void Go_Ahead(uint32 n);
void Turnleft(void);
void Turnright(void);
void Turn180L(void);
void Turn180R(void);
void MouseRUN( int run);
void Timer1Ini(void);
void Timer1A_ISR(void);
void map_xy(void);
void MappulseClear(void);
void Check_Infrared(void);
void Judge(uint32 State);
void MicroMouseInit(void);
uint32 CheckKey(void);
void LEDDisplay(uint32 number,uint32 option);
void DirDisplay(void);
/*PA*/
#define SPEED_PULSE_R		GPIO_PIN_0
#define STATE_L				GPIO_PIN_1
#define STATE_F				GPIO_PIN_2
#define STATE_R				GPIO_PIN_3
#define RWC2				GPIO_PIN_4
#define LWC2				GPIO_PIN_5
/*PB*/
#define PWM					GPIO_PIN_0		//PWM0
#define SPEED_PULSE_L		GPIO_PIN_1
//#define INF_SEND_R			GPIO_PIN_2
#define KEY					GPIO_PIN_3
#define RWC1				GPIO_PIN_4
#define LWC1				GPIO_PIN_5
#define INF_SEND			GPIO_PIN_6		//PWM1
#define LED5				GPIO_PIN_7
//PC
#define LED1				GPIO_PIN_3
#define LED2				GPIO_PIN_0
#define LED3				GPIO_PIN_1
#define LED4				GPIO_PIN_2

RUN_DATA g_Run = {0,0,0,0,0,0,0,STOP,1,0x11,50};
CHECK_MAZE Check_Maze_State[2]={0};
MAZEMAP MAP = {1,1,0,10,10};

uint32 goahead = 0;



//------------------------------------------------------------------------------------
// 函数名称:Delay
// 函数功能:延时数量为 d 个指令周期。
// 输入参数:d,将要延时的时间数。
//------------------------------------------------------------------------------------
void Delay(unsigned long d)
{
	for(;d;d--);
}


//------------------------------------------------------------------------------------
// 函数名称: WheelPulseIni
// 函数功能: 轮子脉冲检测初始化。
//
//------------------------------------------------------------------------------------

void WheelPulseIni(void)
{
	// 配置引脚为输入
   	GPIODirModeSet(GPIO_PORTA_BASE, SPEED_PULSE_R, GPIO_DIR_MODE_IN);	
 	GPIODirModeSet(GPIO_PORTB_BASE, SPEED_PULSE_L, GPIO_DIR_MODE_IN);	
    // 配置引脚下降沿和上升沿触发中断
   	GPIOIntTypeSet(GPIO_PORTA_BASE,SPEED_PULSE_R,GPIO_BOTH_EDGES);
	GPIOIntTypeSet(GPIO_PORTB_BASE,SPEED_PULSE_L,GPIO_BOTH_EDGES);
    // 初始化禁止引脚输入中断
	//GPIOPinIntDisable(GPIO_PORTA_BASE,SPEED_PULSE_R);
 	//GPIOPinIntDisable(GPIO_PORTB_BASE,SPEED_PULSE_L);
	// 使能引脚输入中断
	GPIOPinIntEnable(GPIO_PORTA_BASE,SPEED_PULSE_R);
	GPIOPinIntEnable(GPIO_PORTB_BASE,SPEED_PULSE_L);
   	// 使能GPIO PA口和GPIO PB口中断
	IntEnable(INT_GPIOA);
   	IntEnable(INT_GPIOB);
}
//------------------------------------------------------------------------------------
// 函数名称: GPIO_Port_A_ISR
// 函数功能: 右轮检测脉冲中断处函数
//
//------------------------------------------------------------------------------------
void GPIO_Port_A_ISR(void)
{
	uint8 IntStatus;
	IntStatus = GPIOPinIntStatus(GPIO_PORTA_BASE,true);		// 读PA口中断状态
	if(IntStatus&SPEED_PULSE_R)								// 是否为左轮脉冲中断
	{
		GPIOPinIntClear(GPIO_PORTA_BASE,SPEED_PULSE_R);		// 清中断
		if(g_Run.MouseStop)
			LEDDisplay(5 , 2);					// 车体停止后,如果轮子转动则闪烁LED
			
		g_Run.RightTime = g_Run.SysTick;						// 计录当前系统(相对)时钟
		if(g_Run.COM_Run == GO_ON)
		{
			MAP.rightpulse ++;
		}
 		g_Run.RightPulse++;								// 脉冲加1计数
		if( g_Run.RightPulse>=g_Run.PulseCount)				// 脉冲计数已满或溢出
			if( !(g_Run.WheelStop&0x01))                          // 轮子为转动状态则将其停止
			{
				RightWheelRun(0);			     // 右轮停止
				g_Run.RightPulse -= g_Run.PulseCount;							// 脉冲计数清零
				//g_Run.RightPulse = 0;
			}
	}
}
//------------------------------------------------------------------------------------
// 函数名称: GPIO_Port_B_ISR
// 函数功能: 左轮检测脉冲中断处函数
//
//------------------------------------------------------------------------------------
void GPIO_Port_B_ISR(void)
{
	unsigned char IntStatus;
	IntStatus = GPIOPinIntStatus(GPIO_PORTB_BASE,true);		// 读PA口中断状态
	if(IntStatus&SPEED_PULSE_L)							// 是否为右轮脉冲中断
	{
	  	GPIOPinIntClear(GPIO_PORTB_BASE,SPEED_PULSE_L);	// 清中断
		if(g_Run.MouseStop)
			LEDDisplay(1, 2);					// 车体停止后,如果轮子转动则闪烁LED
			
		g_Run.LeftTime = g_Run.SysTick;						// 计录当前系统(相对)时钟
		if(g_Run.COM_Run == GO_ON)
		{
   			MAP.leftpulse++;
		}
   		g_Run.LeftPulse++;                                   // 脉冲加1计数
		if(g_Run.LeftPulse>=g_Run.PulseCount)				// 脉冲计数已满或溢出
			if(!(g_Run.WheelStop&0x10))						// 轮子为转动状态则将其停止
			{
				LeftWheelRun(0);							// 左轮停止
				g_Run.LeftPulse -= g_Run.PulseCount;							// 脉冲计数清零
				//g_Run.LeftPulse = 0;
			}
	}
}

//------------------------------------------------------------------------------------
// 函数名称: Timer0Ini
// 函数功能: 定时器0初始化。
//
//------------------------------------------------------------------------------------
void Timer0Ini(void)
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); 						// 使能定时器0模块

 	GPIODirModeSet(GPIO_PORTB_BASE, LWC1|RWC1 , GPIO_DIR_MODE_OUT);		// 控制引脚输出
	GPIOPinWrite(GPIO_PORTB_BASE, LWC1|RWC1 , 0xff);					// GPIO输出高电平
	GPIODirModeSet(GPIO_PORTA_BASE, LWC2|RWC2 , GPIO_DIR_MODE_OUT);		// 控制引脚输出
 	GPIOPinWrite(GPIO_PORTA_BASE, LWC2|RWC2 , 0xff);					// GPIO输出高电平

	GPIODirModeSet(GPIO_PORTB_BASE, PWM | INF_SEND, GPIO_DIR_MODE_HW);
 	/* 定时器配置*/
	TimerConfigure(TIMER0_BASE,TIMER_CFG_16_BIT_PAIR
	  				|TIMER_CFG_A_PWM|TIMER_CFG_B_PWM);					// 16位PWM输出
	/*PWM*/
	TimerControlLevel(TIMER0_BASE,TIMER_A,true);						// PWM初始化有效信号为低电平
	TimerLoadSet(TIMER0_BASE,TIMER_A,40000);
	TimerMatchSet(TIMER0_BASE,TIMER_A,20000);				// 设置占空比
	TimerEnable(TIMER0_BASE,TIMER_A);	 								// 使能定时器A
	/*INF_SEND*/
	TimerControlLevel(TIMER0_BASE,TIMER_B,true);						// PWM初始化有效信号为低电平
	TimerDisable(TIMER0_BASE,TIMER_B);							// 禁止定时器
}
//------------------------------------------------------------------------------------
// 函数名称: PwmPercent
// 函数功能: 设置占空比。
//
//------------------------------------------------------------------------------------
void PwmPercent(int32 percent)
{
	int32 LoadValue;
	LoadValue = (int32)400*percent;
	TimerMatchSet(TIMER0_BASE,TIMER_A,LoadValue);				// 设置占空比
	//g_Run.percent = percent;
}
//------------------------------------------------------------------------------------
// 函数名称: SendInfrared
// 函数功能: 发送红外线。
// 输入参数: frequency,红外线调制频率
//------------------------------------------------------------------------------------
void SendInfrared(uint32 frequency)
{
	uint32 LoadValue;
	if(frequency == 38000)
		LoadValue = 263;
	else
		LoadValue = (uint32)10000000/frequency;
	TimerLoadSet(TIMER0_BASE,TIMER_B,LoadValue*2);
	TimerMatchSet(TIMER0_BASE,TIMER_B,LoadValue);				// 设置占空比
	TimerEnable(TIMER0_BASE,TIMER_B);	 						// 使能定时器B
}
//------------------------------------------------------------------------------------
// 函数名称: ForbidInfrared
// 函数功能: 禁止发送调制红外线。
//
//------------------------------------------------------------------------------------
void ForbidInfrared(void)
{
	TimerDisable(TIMER0_BASE,TIMER_B);							// 禁止定时器
}
//------------------------------------------------------------------------------------
// 函数名称: LeftWheelRun
// 函数功能: 左轮控制函数。
// 输入参数: sel,选择轮子的控制方式:0为停止,1为轮子向前,2为轮子向后。
//			 percen,占空比,其最大值为99,最小值为1,对于轮子的停止控制该参数无效。
//------------------------------------------------------------------------------------
void LeftWheelRun(int sel)
{
	switch(sel)
	{
		/*轮子停止转动*/
		case 0:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, 0xff);					// 控制引脚输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,LWC1, 0xff);					// GPIO输出高电平
			g_Run.WheelStop |= 1<<4;									// 标记当前状态为停止
			break;
		/*左轮向前*/
		case 1:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, 0xff);					// PA4输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,LWC1, 0x00);					// GPIO输出高电平
			g_Run.WheelStop &= 0xef;							// 向前运行
			g_Run.WheelStop |= 0x80;
			break;
		/*左轮向后*/
		case 2:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, 0x00);					// PA4输出低电平
			GPIOPinWrite(GPIO_PORTB_BASE,LWC1, 0xff);					// GPIO输出高电平
			g_Run.WheelStop &= 0x6f;							// 向后运行
			break;
		case 3:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, GPIOPinRead(GPIO_PORTA_BASE,LWC2)^LWC2);					// PA4输出低电平
			GPIOPinWrite(GPIO_PORTB_BASE,LWC1, GPIOPinRead(GPIO_PORTB_BASE,LWC1)^LWC1);					// GPIO输出高电平

	}
}
//------------------------------------------------------------------------------------
// 函数名称: RightWheelRun
// 函数功能: 右轮控制函数。
// 输入参数: sel,选择轮子的控制方式:0为停止,1为轮子向前,2为轮子向后。
//			 percen,占空比,其最大值为99,最小值为1,对于轮子的停止控制该参数无效。
// 全局变量: g_Run.WheelStop,标记当前状态。
//------------------------------------------------------------------------------------
void RightWheelRun(int sel)
{
	switch(sel)
	{
		/*轮子停止转动*/
		case 0:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0xff);					// 控制引脚输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0xff);					// GPIO输出高电平
			g_Run.WheelStop |= 1;
			break;
		/*右轮向后*/
		case 2:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0xff);					// 控制引脚输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0x00);					// GPIO输出高电平
			g_Run.WheelStop &= 0xf6;
			break;
		/*右轮向前*/
		case 1:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0x00);					// 控制引脚输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0xff);					// GPIO输出高电平
			g_Run.WheelStop &= 0xfe;
			g_Run.WheelStop |= 0x08;
			break;
		case 3:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2,GPIOPinRead(GPIO_PORTA_BASE,RWC2)^RWC2);					// 控制引脚输出高电平
			GPIOPinWrite(GPIO_PORTB_BASE,RWC1,GPIOPinRead(GPIO_PORTB_BASE,RWC1)^RWC1);					// GPIO输出高电平
	}
}
//------------------------------------------------------------------------------------
// 函数名称: SysTickIni
// 函数功能: 系统节拍定时器初始化。
//
//------------------------------------------------------------------------------------

void SysTickIni(void)
{
	SysTickPeriodSet(SysCtlClockGet()/1000);
 	SysTickEnable();
 	SysTickIntEnable();
}
//------------------------------------------------------------------------------------
// 函数名称: SysTick_ISR
// 函数功能: 定时中断扫描。
// 
//------------------------------------------------------------------------------------

void SysTick_ISR(void)						
{
	static uint32 l = 0,r =0;
	g_Run.SysTick++;					// 系统时钟节拍加1,每中断自加1
   	if((g_Run.WheelStop&0x11)==0x11 )	 	// 如果车已停止
	{
		if(g_Run.MousePulCount)			// 总剩余脉冲数是否为0,否,则分段运行
		{				
			if(g_Run.MousePulCount>MAX_PER_PULS)		// 脉冲数大于分段运行脉冲数
			{						// 运行分段脉冲数
				g_Run.PulseCount = MAX_PER_PULS;
				MouseRUN(g_Run.COM_Run);
				g_Run.MousePulCount -= g_Run.PulseCount;	// 总脉冲数减已走脉数
			}
			else						// 剩余脉冲数少于或等于分段运行脉冲数
			{						// 运行总剩余脉冲数
				g_Run.PulseCount = g_Run.MousePulCount;
				MouseRUN(g_Run.COM_Run);
				g_Run.MousePulCount =0;
			}
			if(g_Run.COM_Run == GO_ON)
			{
				if(Check_Maze_State[0].left_1)
				{
					g_Run.RightPulse++;
					l++;
					Check_Maze_State[0].left_1 = 0;
				}
				else
				{
					if(l)
					{
						if(l<4)
						{
							g_Run.LeftPulse ++;
							l--;
						}

⌨️ 快捷键说明

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