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

📄 0714.c

📁 自动寻迹小车源码驱动两个步进电机
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: time1.c
** Last modified Date: 
** Last Version: v1.0						    
** Description: 
** 
**------------------------------------------------------------------------------------------------------
** Created By: 
** Created date: 
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified date: 
** Version:
** Description:
**
********************************************************************************************************/
#include "hw_memmap.h"
#include "hw_ints.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "timer.h"
typedef unsigned char  uint8;             	// 无符号8位整型变量
typedef unsigned int   uint32;            	// 无符号32位整型变量

/*PA*/
#define PULSE_R				GPIO_PIN_0		// 右侧红外测速脉冲输入
#define OUT_L				GPIO_PIN_1		// 左侧红外测挡板信号输入
#define OUT_F				GPIO_PIN_2		// 前方红外测挡板信号输入
#define OUT_R				GPIO_PIN_3		// 右侧红外测挡板信号输入
#define RWC2				GPIO_PIN_4		// 右侧电机控制信号
#define LWC2				GPIO_PIN_5		// 左侧电机控制信号

/*PB*/
#define RWC1				GPIO_PIN_0		// PWM0,控制右侧电机
#define PULSE_L				GPIO_PIN_1		// 左侧红外测速脉冲输入
#define KEY2				GPIO_PIN_3		// 按键
#define SEND				GPIO_PIN_4		// 发射调制红外信号控制
#define PULSE				GPIO_PIN_5		// 输出38KHz频率脉冲
#define LWC1				GPIO_PIN_6		// PWM1,控制左侧电机
#define DRR					GPIO_PIN_7		// LED,D1

//PC
#define DLL					GPIO_PIN_3		// LED,D7
#define DL					GPIO_PIN_0		// LED,D5
#define DF	 				GPIO_PIN_1		// LED,D4
#define DR					GPIO_PIN_2		// LED,D2


uint32	LeftPulse = 0,RightPulse = 0;		// 设定运行目标脉冲
uint32	PulCount_L = 0,PulCount_R = 0;		// 中断脉冲计数
uint8	WheelStop_L = 0,WheelStop_R = 0;	// 电机运行/停止状态

//------------------------------------------------------------------------------------
// 函数名称: Timer1A_ISR
// 函数功能: 定时器1中断处理程序。翻转PULSE。
// 全局变量: PULSE,产生驱动红外的调制信号。
//------------------------------------------------------------------------------------


void Timer1A_ISR(void)
{

	TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);			// 清除定时器1中断

	GPIOPinWrite(GPIO_PORTB_BASE, PULSE,GPIOPinRead(GPIO_PORTB_BASE, PULSE) ^ PULSE);
															// 翻转GPIO B5 端口
}
//------------------------------------------------------------------------------------
// 函数名称: LeftWheelRun
// 函数功能: 左轮控制函数。
// 输入参数: sel,选择轮子的控制方式:0为停止,1为轮子向前,2为轮子向后。
//			 percen,占空比,其最大值为99,最小值为1,对于轮子的停止控制该参数无效。
//------------------------------------------------------------------------------------
void LeftWheelRun(int sel,unsigned char percen)
{
	switch(sel)
	{
		/*轮子停止转动*/
		case 0:
			TimerDisable(TIMER0_BASE,TIMER_B);							// 禁止定时器
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2,0xff);					// 控制引脚输出高电平
			GPIODirModeSet(GPIO_PORTB_BASE, LWC1, GPIO_DIR_MODE_OUT);	// 禁止PWM引脚输出,改为GPIO输出 
			GPIOPinWrite(GPIO_PORTB_BASE,LWC1, 0xff);					// GPIO输出高电平
			break;
		/*左轮向后*/
		case 1:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, 0xff);					// PA4输出高电平
			TimerControlLevel(TIMER0_BASE,TIMER_B,false);				// PWM有效电平方向
			GPIODirModeSet(GPIO_PORTB_BASE, LWC1, GPIO_DIR_MODE_HW);	// 禁止GPIO引脚输出,改为PWM输出	
			TimerMatchSet(TIMER0_BASE,TIMER_B,percen*600);				// 设置占空比
			TimerEnable(TIMER0_BASE,TIMER_B);	 						// 使能定时器
			break;
		/*左轮向前*/
		case 2:
			GPIOPinWrite(GPIO_PORTA_BASE,LWC2, 0);						// PA4输出低电平
			TimerControlLevel(TIMER0_BASE,TIMER_B,true);				// PWM有效电平方向
			GPIODirModeSet(GPIO_PORTB_BASE, LWC1, GPIO_DIR_MODE_HW);	// 禁止GPIO引脚输出,改为PWM输出
			TimerMatchSet(TIMER0_BASE,TIMER_B,percen*600);				// 设置占空比
			TimerEnable(TIMER0_BASE,TIMER_B);	 						// 使能定时器
			break;
	}
}
//------------------------------------------------------------------------------------
// 函数名称: RightWheelRun
// 函数功能: 右轮控制函数。
// 输入参数: sel,选择轮子的控制方式:0为停止,1为轮子向前,2为轮子向后。
//			 percen,占空比,其最大值为99,最小值为1,对于轮子的停止控制该参数无效。
// 全局变量: g_Run.WheelStop,标记当前状态。
//------------------------------------------------------------------------------------
void RightWheelRun(int sel,unsigned char percen)
{
	switch(sel)
	{
		/*轮子停止转动*/
		case 0:
			TimerDisable(TIMER0_BASE,TIMER_A);							// 禁止定时器
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0xff);					// 控制引脚输出高电平
			GPIODirModeSet(GPIO_PORTB_BASE, RWC1, GPIO_DIR_MODE_OUT);	// 禁止PWM引脚输出,改为GPIO输出 
			GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0xff);					// GPIO输出高电平
			break;
		/*右轮向后*/
		case 2:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2, 0xff);					// PA4输出高电平
			TimerControlLevel(TIMER0_BASE,TIMER_A,false);				// PWM有效电平方向
			GPIODirModeSet(GPIO_PORTB_BASE, RWC1, GPIO_DIR_MODE_HW);	// 禁止GPIO引脚输出,改为PWM输出	
			TimerMatchSet(TIMER0_BASE,TIMER_A,percen*600);				// 设置占空比
			TimerEnable(TIMER0_BASE,TIMER_A);	 						// 使能定时器
			break;
		/*右轮向前*/
		case 1:
			GPIOPinWrite(GPIO_PORTA_BASE,RWC2, 0);						// PA4输出低电平
			TimerControlLevel(TIMER0_BASE,TIMER_A,true);				// PWM有效电平方向
			GPIODirModeSet(GPIO_PORTB_BASE, RWC1, GPIO_DIR_MODE_HW);	// 禁止GPIO引脚输出,改为PWM输出
			TimerMatchSet(TIMER0_BASE,TIMER_A,percen*600);				// 设置占空比
			TimerEnable(TIMER0_BASE,TIMER_A);	 						// 使能定时器
			break;
	}
}

//------------------------------------------------------------------------------------
// 函数名称: GPIO_PA_ISR
// 函数功能: 右轮检测脉冲中断处函数
//
//------------------------------------------------------------------------------------
void GPIO_PA_ISR(void)
{
	unsigned char  IntStatus;
	IntStatus = GPIOPinIntStatus(GPIO_PORTA_BASE,true);	// 读PA口中断状态
	if(IntStatus&PULSE_R)								// 是否为左轮脉冲中断
	{
		PulCount_R++;									// 脉冲计数
		if(PulCount_R >= RightPulse)					// 判断是否达到设定值
		{
			RightWheelRun(0, 1);						// 停止电机
			WheelStop_R= 1;								// 置电机停止标志
		}
		GPIOPinIntClear(GPIO_PORTA_BASE,PULSE_R);		// 清中断
	}
}
//------------------------------------------------------------------------------------
// 函数名称: GPIO_PB_ISR
// 函数功能: 左轮检测脉冲中断处函数
//
//------------------------------------------------------------------------------------
void GPIO_PB_ISR(void)
{
	unsigned char IntStatus;
	IntStatus = GPIOPinIntStatus(GPIO_PORTB_BASE,true);	// 读PA口中断状态
	if(IntStatus&PULSE_L)								// 是否为右轮脉冲中断
	{
		PulCount_L++;									// 脉冲计数
		if(PulCount_L>= LeftPulse)						// 判断是否达到设定值
		{
			WheelStop_L= 1;								// 置电机停止标志
			LeftWheelRun(0, 1);							// 停止电机
			
		}
	  	GPIOPinIntClear(GPIO_PORTB_BASE,PULSE_L);		// 清中断
	}
}

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


//------------------------------------------------------------------------------------
// 函数名称: PWMTimer0AIni
// 函数功能: 定时器PWM初始化。
//
//------------------------------------------------------------------------------------
void PWMTimer0AIni(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输出高电平
 	
 	/* 定时器配置*/
	TimerConfigure(TIMER0_BASE,TIMER_CFG_16_BIT_PAIR
	  				|TIMER_CFG_A_PWM|TIMER_CFG_B_PWM);					// 16位PWM输出
	TimerControlLevel(TIMER0_BASE,TIMER_A,false);						// PWM初始化有效信号为低电平
	TimerControlLevel(TIMER0_BASE,TIMER_B,false);
	TimerLoadSet(TIMER0_BASE,TIMER_A,60000);							// 设定PWM频率
	TimerLoadSet(TIMER0_BASE,TIMER_B,60000);
}
//------------------------------------------------------------------------------------
// 函数名称: PULSEIni
// 函数功能: 红外调制信号初始化。
//
//------------------------------------------------------------------------------------
void PULSEIni(void)
{
	GPIODirModeSet(GPIO_PORTB_BASE, SEND | PULSE, GPIO_DIR_MODE_OUT);	// 设置 GPIO 为输出口
	GPIOPinWrite( GPIO_PORTB_BASE,SEND | PULSE,0);       				// 红外线初始时停止发射
	
	SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 );						// 使能定时器1外设
	TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER);					// 设置定时器1为周期触发模式

⌨️ 快捷键说明

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