|
利用两个超声波模块进行定位判断坐标位置
STM32单片机源程序如下:
#include "csbcj.h"
#include "tim.h"
#include "delay.h"
#include "Systick.h"
extern float time; //X接收时间
extern float UltrasonicWave_Distance; //X距离
extern float Ytime; //Y接收时间
extern float YUltrasonicWave_Distance; //Y距离
static void BASIC_CSBC_NVIC_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOX,GPIO_PinSourcex); //GPIOC.7 中断线以及中断初始化配置
EXTI_InitStructure.EXTI_Line=EXTI_Linex; //外部中断线7
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置输入线路 上升沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断组为2
NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn ; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 设置主优先级为 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 设置抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
//Y轴
GPIO_EXTILineConfig(YGPIO_PortSourceGPIOX,YGPIO_PinSourcex); //GPIOC.7 中断线以及中断初始化配置
EXTI_InitStructure.EXTI_Line=YEXTI_Linex; //外部中断线7
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置输入线路 上升沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断组为2
NVIC_InitStructure.NVIC_IRQChannel = YEXTIx_IRQn ; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 设置主优先级为 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 设置抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}
/*
* 函数名:UltrasonicWave_Configuration
* 描述 :超声波模块的初始化
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APBxPeriphClockCmd(RCC_GPIO_Clock, ENABLE);
//X
GPIO_InitStructure.GPIO_Pin = TRIG_PIN; //PC8接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure); //初始化外设GPIO
GPIO_InitStructure.GPIO_Pin = ECHO_PIN; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设为输入
GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化GPIOA
//Y
GPIO_InitStructure.GPIO_Pin = YTRIG_PIN; //PC8接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(YTRIG_PORT, &GPIO_InitStructure); //初始化外设GPIO
GPIO_InitStructure.GPIO_Pin = YECHO_PIN; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设为输入
GPIO_Init(YECHO_PORT,&GPIO_InitStructure); //初始化GPIOA
BASIC_CSBC_NVIC_Config();
}
/*
* 函数名:UltrasonicWave_StartMeasure
* 描述 :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_StartMeasure(void)
{
//X
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送>10US的高电平
SysTick_Delay_us(20); //延时20US高电平触发模块工作
GPIO_ResetBits(TRIG_PORT,TRIG_PIN); //开始工作关闭高电平置低电平
}
void YUltrasonicWave_StartMeasure(void)
{
//Y
GPIO_SetBits(YTRIG_PORT,YTRIG_PIN); //送>10US的高电平
SysTick_Delay_us(20); //延时20US高电平触发模块工作
GPIO_ResetBits(YTRIG_PORT,YTRIG_PIN); //开始工作关闭高电平置低电平
}
//中断服务函数
//X轴
//中断服务函数用来接收信息的处理
void EXTIX_IRQHandler(void)
{
SysTick_Delay_us(10); //延时10us
if(EXTI_GetITStatus(EXTI_Linex) != RESET) //中断发生
{
TIM_SetCounter(TIMX,0); //计数器清零
TIME_X_Y=0; //溢出次数清零
TIM_Cmd(TIMX, ENABLE); //开启时钟
while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待低电平
TIM_Cmd(TIMX, DISABLE); //定时器2失能
UltrasonicWave_Distance=TIM_GetCounter(TIMX)*5*34/2000; //距离
EXTI_ClearITPendingBit(EXTI_Linex); //清除EXTI7线路挂起位
TIM_SetCounter(YTIMX,0);
}
SysTick_Delay_ms(50);
YUltrasonicWave_StartMeasure();
}
//TIMx的中断服务函数
// TIME_x_y为中断次数
void BASE_TIMX_IRQHandle(void )
{
if (TIM_GetITStatus(TIMX,TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
// TIME_X_Y++; //记录发生了多少次中断,一次中断为60000us
TIM_ClearITPendingBit(TIMX,TIM_FLAG_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
//Y轴
//中断服务函数用来接收信息的处理
void YEXTIX_IRQHandler(void)
{
SysTick_Delay_us(10); //延时10us
if(EXTI_GetITStatus(YEXTI_Linex) != RESET) //中断发生
{
TIM_SetCounter(YTIMX,0); //计数器清零
YTIME_X_Y=0; //溢出次数清零
TIM_Cmd(YTIMX, ENABLE); //开启时钟
while(GPIO_ReadInputDataBit(YECHO_PORT,YECHO_PIN)); //等待低电平
TIM_Cmd(YTIMX, DISABLE); //定时器2失能
YUltrasonicWave_Distance=TIM_GetCounter(YTIMX)*5*34/2000; //距离
EXTI_ClearITPendingBit(YEXTI_Linex); //清除EXTI7线路挂起位
TIM_SetCounter(YTIMX,0);
}
}
//TIMx的中断服务函数
// TIME_x_y为中断次数
void YBASE_TIMX_IRQHandle(void )
{
if (TIM_GetITStatus(YTIMX,TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(YTIMX,TIM_FLAG_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
硬件宏定义
#ifndef __CSBCJ_H
#define __CSBCJ_H
#include "tim.h"
#define RCC_APBxPeriphClockCmd RCC_APB2PeriphClockCmd
#define RCC_GPIO_Clock (RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)
//X轴
//发送启动脉冲大于10us
#define TRIG_PORT GPIOC //TRIG
#define TRIG_PIN GPIO_Pin_8 //TRIG
//接受到回波信号引脚
#define ECHO_PORT GPIOC //ECHO
#define ECHO_PIN GPIO_Pin_7 //ECHO
//利用中断接收超声波回波信号
#define GPIO_PortSourceGPIOX GPIO_PortSourceGPIOC
#define GPIO_PinSourcex GPIO_PinSource7
#define EXTI_Linex EXTI_Line7
#define EXTIx_IRQn EXTI9_5_IRQn
#define EXTIX_IRQHandler EXTI9_5_IRQHandler
//Y轴
//发送启动脉冲大于10us
#define YTRIG_PORT GPIOC //TRIG
#define YTRIG_PIN GPIO_Pin_14 //TRIG
//接受到回波信号引脚
#define YECHO_PORT GPIOC //ECHO
#define YECHO_PIN GPIO_Pin_4 //ECHO
//利用中断接收超声波回波信号
#define YGPIO_PortSourceGPIOX GPIO_PortSourceGPIOC
#define YGPIO_PinSourcex GPIO_PinSource4
#define YEXTI_Linex EXTI_Line4
#define YEXTIx_IRQn EXTI4_IRQn
#define YEXTIX_IRQHandler EXTI4_IRQHandler
static void BASIC_CSBC_NVIC_Config(void);
void UltrasonicWave_Configuration(void); //对超声波模块初始化
void UltrasonicWave_StartMeasure(void); //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
void YUltrasonicWave_StartMeasure(void);
#endif /*__CSBCJ_H*/
|
评分
-
查看全部评分
|