文章目录
一、获取超声波数据接口
支持GPS模块列表:
- hc-sr04
Cubemx配置界面:
代码结构:
- sensor_hc_sr04.c
- sensor_hc_sr04.h
- main.c
sensor_hc_sr04.c
#include "sensor_hc_sr04.h"
#include "tim.h"
//获取超声波模块的检测距离
void csb_get_distance(void)
{
//给发射引脚一个高电平
Trig_H;
//延时10us以上
HAL_Delay(1);
//给发射引脚一个低电平
Trig_L;
}
sensor_hc_sr04.h
#ifndef _SENSOR_HC_SR04_H_
#define _SENSOR_HC_SR04_H_
#include "main.h"
#include "gpio.h"
#define Trig_H HAL_GPIO_WritePin(CSB_TRIG_GPIO_Port,CSB_TRIG_Pin,GPIO_PIN_SET)
#define Trig_L HAL_GPIO_WritePin(CSB_TRIG_GPIO_Port,CSB_TRIG_Pin,GPIO_PIN_RESET)
#define Echo_Read HAL_GPIO_ReadPin(CSB_ECHO_GPIO_Port,CSB_ECHO_Pin)
uint8_t hc_sr04_getvalue(void);
#endif
main.c
在main.c的最下面加入以下回调函数代码
uint8_t dis_fm = 0; //距离
uint8_t Edge = 0; //上升沿0下降沿1捕获标志
uint16_t HighTime; //高电平时间
uint16_t RisingTime; //捕获上升沿时间点
uint16_t FallingTime; //捕获下降沿时间点
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
/*防止未使用参数编译警告*/
UNUSED(htim);
if(htim->Instance == htim2.Instance) //TIMER2
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) //CHANNEL_1
{
if(Edge == 0) //捕获上升沿
{
RisingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3); //获取上升沿时间点
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING); //切换捕获极性 下降沿
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3); //切换后重启中断
Edge = 1; //捕获极性标值换为下降沿
}
else if(Edge == 1) //捕获下降沿
{
FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3); //获取下降沿时间点
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); //切换捕获极性 上升沿
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3); //切换捕获极性后重启中断
HighTime = FallingTime < RisingTime ? FallingTime + 0xffff - RisingTime + 1 : FallingTime - RisingTime;
//高电平时间=下降沿时间 - 上升沿时间(若下降沿时间<上升沿时间FallingTime + 0xffff - RisingTime + 1)
dis_fm = HighTime * 17/ 100; //距离计算 HighTime*(1/100000)秒*34000厘米/2
// printf("距离 = %dcm \r\n", dis_fm);
Edge = 0; //一次采集完毕,捕获上升沿标志
}
}
}
}
二、使用方法
在需要的地方加入#include "sensor_hc_sr04.h"
,然后调用
csb_get_distance();
注意
:HAL_TIM_IC_CaptureCallback回调函数里面的dis_fm就是你获取到的超声波数值