/***********************************************************************************************************************
------------------------------------------------------------------------------------------------------------------------
|| 使用须知:这是一个普适的驱动文件,您可以定义多个驱动句柄作为参数传递给功能函数,完成距离信息的采集.
||
|| 编码风格:所有接口均以函数指针进行传递,数据类型不作重定义,大多采用8bit数据类型进行数据传输,逻辑变量均以类型开头命
|| 名,一般符合驼峰命名.(eg:unsigned char ucValue;signed int siValue;float fValue;struct sValue;enum eValue;)
||
|| 文件说明:本驱动文件基于STM32F103系列实现,内部使用MCU的一个通用定时器资源,用户可以根据ultrasonic_ranging.h中的宏
|| 进行修改,默认使用了TIM2作为时间依据。本驱动文件为用户提供了3个接口以供使用:初始化句柄,获取距离,释放资源。
||
|| 使用说明:UltrasonicRanging sUltrasonicRanging;//声明接口
|| UltrasonicRangingState eState = UltrasonicRangingInitialization(&sUltrasonicRanging,GPIOB,GPIO_Pin_7,GPIOB,GPIO_Pin_6);//初始化接口
|| if(eState == URS_ERROR){错误处理}//初始化结果判断
|| float fDistance = UltrasonicRangingGetDistance(&sUltrasonicRanging);//获取距离信息
|| UltrasonicRangingClose(&sUltrasonicRanging);//关闭资源
||
|| 作者:蒋才有
||
|| 版本:V1.0
||
|| 开发时间:2021.10.26 - xxxx.xx.xx
||
|| 注意事项:本超声波测距基于HC-SR04实现,STM32F1系列测试有效,如需移植其他平台或使用请自行完成并注明出处!
|| Tips:When you encounter an exception, you can define "ULTRASONIC_RANGING_DEBUG" to help you find the error.
||
|| 联系方式:1932857334@qq.com By Email
________________________________________________________________________________________________________________________
************************************************************************************************************************/
#ifndef __ULTRASONIC_RANGING_H__
#define __ULTRASONIC_RANGING_H__
#include "stm32f10x.h"
/* 调试配置宏,正常使用请注释该宏,在调试模式下将输出更多日志信息,影响系统运行效率 */
//#define ULTRASONIC_RANGING_DEBUG
#include "stm32f10x.h"
/* 定时器硬件资源宏 */
#define ULTRASONIC_RANGING_TIM TIM2
#define ULTRASONIC_RANGING_TIM_RCC RCC_APB1Periph_TIM2
#define ULTRASONIC_RANGING_TIM_RCC_CMD RCC_APB1PeriphClockCmd
/* 超声波测距状态 */
typedef enum {
URS_ERROR = 0, //错误
URS_SUCCEED = 1, //成功
}UltrasonicRangingState;
/* 超声波结构体 */
typedef struct{
unsigned char ucState;
GPIO_TypeDef* sTrigGpio;
GPIO_TypeDef* sEchoGpio;
unsigned short usTrigPin;
unsigned short usEchoPin;
}UltrasonicRanging;
/* 对外接口 */
void UltrasonicRangingClose(UltrasonicRanging *sUltrasonicRanging);
float UltrasonicRangingGetDistance(UltrasonicRanging *sUltrasonicRanging);
UltrasonicRangingState UltrasonicRangingInitialization(UltrasonicRanging *sUltrasonicRanging,
GPIO_TypeDef* sTrigGpio,unsigned short usTrigPin,GPIO_TypeDef* sEchoGpio,unsigned short usEchoPin);
/* 测试接口 */
#ifdef ULTRASONIC_RANGING_DEBUG
void* UltrasonicRangingTestApi(unsigned int event,void *obj);
#endif /* ULTRASONIC_RANGING */
#endif /* __ULTRASONIC_RANGING_H__ */
相对于激光测距效果
整体来说数据可以稳定在mm级,这样的一个精度是非常棒的了。