高中生
最后登录1970-1-1
在线时间 小时
注册时间2021-9-25
|
#include "hc_sr04.h"
#include "bsp_systick.h"
#include "usart.h"
#define TRIG_PORT GPIOB //定义TRIG_PORT为PB
#define ECHO_PORT GPIOB //定义ECHO_PORT为PB
#define TRIG_PIN GPIO_Pin_0 //定义TRIG 对应IO口 PB0
#define ECHO_PIN GPIO_Pin_1 //定义ECHO 对应IO口 PB1
/**
* @brief 用于定时计算高电平时间
* @param 无 将定时器6设置为1us记一次数,3000us=3ms一个周期 再测量范围内能满足要求
* @retval 无
*/
static void TIM6_Counter(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM6,ENABLE); //打开定时器时钟
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1 ;
TIM_TimeBaseInitStructer .TIM_Prescaler=71;
TIM_TimeBaseInitStructer.TIM_Period=3000;
TIM_TimeBaseInit (TIM6,&TIM_TimeBaseInitStructer );
TIM_Cmd (TIM6,DISABLE );//先关闭定时器,计算距离时再打开
}
/*
* 函数名:UltrasonicWave_Configuration
* 描述 :超声波模块的初始化
*/
void UltrasonicWave_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructer;//定义相关初始化的结构体
EXTI_InitTypeDef EXTI_InitStructer;
NVIC_InitTypeDef NVIC_InitStructer;
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB ,ENABLE);//打开相应的时钟
//配置相关引脚
GPIO_InitStructer.GPIO_Pin = TRIG_PIN;//超声波触发引脚
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);//先暂时复位超声波触发引脚,防止误发
GPIO_Init(TRIG_PORT,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin = ECHO_PIN;//回收高电平引脚
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式
GPIO_Init(ECHO_PORT,&GPIO_InitStructer);
//对中断进行相关的配置
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1 );
NVIC_InitStructer .NVIC_IRQChannel = EXTI1_IRQn ;
NVIC_InitStructer .NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructer .NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructer .NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructer );//初始化NVIC
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//进行中断线以及中断初始化配置
EXTI_InitStructer .EXTI_Line = EXTI_Line1 ;//选择中断/事件线
EXTI_InitStructer .EXTI_Mode = EXTI_Mode_Interrupt ;//配置为中断模式
EXTI_InitStructer .EXTI_Trigger = EXTI_Trigger_Rising ;//上升沿触发
EXTI_InitStructer .EXTI_LineCmd = ENABLE;//使能外部中断
EXTI_Init (&EXTI_InitStructer );//外部中断初始化
}
/**
* @brief 开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* @param 无
* @retval 无
*/
void UltrasonicWave_StartMeasure(void)
{
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送>10US的高电平
Delay_us(11); //延时11US
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
}
/**
* @brief 中断处理服务函数,计算高电平持续的时间,从而计算距离
* @param 无
* @retval 无
*/
void EXTI1_IRQnHeader(void)
{
int count;
TIM6_Counter();
TIM_Cmd(TIM6,ENABLE);
if(EXTI_GetITStatus (EXTI_Line1 )!=RESET )
{
TIM_Cmd(TIM6,ENABLE);
TIM_SetCounter (TIM6 ,0 );
count=1;
while(count)//等待低电平
{
if(TIM_GetCounter (TIM6)>=1000)
{
TIM_Cmd(TIM6, DISABLE); // 关闭时钟 Tim6
count=0; // 循环数清零
}
else count=GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN );
}
TIM_Cmd (TIM6,DISABLE );
}
EXTI_ClearITPendingBit (EXTI_Line1 );
}
float HCSR04_GetDisatnce(void)
{
float distance;
UltrasonicWave_StartMeasure();
Delay_ms(1000);
printf("%d",TIM_GetCounter(TIM6));
distance=(1.7*(TIM_GetCounter (TIM6)));//计算出来的单位为cm
if(distance>=450)//超出测量范围
{
printf("it is erro");
}
return distance;
}
|
|