MCU:获取超声波接口

一、获取超声波数据接口

支持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就是你获取到的超声波数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值