📄 0714.c
字号:
/****************************************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 + -