HCSR04超声波传感器驱动

2023-11-16

HC_SR04是一款使用较为广泛的超声波测距模块,模块图如下

该模块具有四个引脚,分别为VCC GND TRIG ECHO,其中VCC GND为供电脚

TRIG为测距触发引脚,ECHO为测距输入引脚

该模块的驱动模式为

控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了

 

模块工作原理如下

(1)采用 IO 触发测距,给至少 10us 的高电平信号;

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间

(4计算测试距离测试距离=(高电平时间*声速(340M/S))/2;

 

根据工作原理,我们可以选择两种模式驱动

1.       采用中断+定时器方式,将ECHO定义为上升沿下降沿都能触发中断,trig触发之后,echo高电平进中断打开定时器,echo低电平关闭定时器并统计定时器计数值

2.       采用普通IO+定时器模式,触发之后等待echo响应,响应时打开定时器,直到echo恢复低关闭定时器,获取时间

 

1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响

模块工作。

2:测距时,被测物体的面积不少于0.5平方米且要尽量平整。否则会影响测试结果。

 

详细驱动代码如下所示

Hcsr04.c

#include "hcsr04.h"


#define HCSR04_PORT     GPIOB
#define HCSR04_CLK      RCC_APB2Periph_GPIOB
#define HCSR04_TRIG     GPIO_Pin_5
#define HCSR04_ECHO     GPIO_Pin_6

#define TRIG_Send  PBout(5)
#define ECHO_Reci  PBin(6)

u16 msHcCount = 0;//ms计数

void Hcsr04Init(u32 NVIC_PriorityGroup,u32 PreemptionPriority,u32 SubPriority)
{
	u32 NVICtemp    = 0;        //用于NVIC控制器的变量
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体
	GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
    
    NVICtemp = NVIC_EncodePriority(NVIC_PriorityGroup , PreemptionPriority , SubPriority);    //中断优先级变量解码
    
	//IO初始化
    GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;       //发送电平引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    
    GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;		//返回电平引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);	
	//定时器初始化 使用基本定时器TIM6
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);   //使能对应RCC时钟
	//配置定时器基础结构体
	TIM_TimeBaseStructure.TIM_Period = 1000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到1000为1ms
	TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM_ClearFlag(TIM6, TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断
	TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);    //打开定时器更新中断
	NVIC_SetPriority(TIM6_IRQn,NVICtemp);          //设置中断优先级
	NVIC_EnableIRQ(TIM6_IRQn);                     //使能对应中断
	
}
static void OpenTimerForHc()	//打开定时器
{
	TIM_SetCounter(TIM6,0);//清除计数
	msHcCount = 0;
	TIM_Cmd(TIM6, ENABLE);  //使能TIMx外设
}

static void CloseTimerForHc()	//关闭定时器
{
	TIM_Cmd(TIM6, DISABLE);  //使能TIMx外设
}


//定时器6中断服务程序
void TIM6_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx更新中断标志 
		msHcCount++;
	}
}

u32 GetEchoTimer(void)
{
	u32 t = 0;
	t = msHcCount*1000;//得到MS
	t += TIM_GetCounter(TIM6);//得到US
	return t;
}

//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
void Hcsr04GetLength(u32* length)
{
    u32 t = 0;
    float lengthTemp;
    TRIG_Send = 1;      //发送口高电平输出
    DelayUs(10);
    TRIG_Send = 0;
    while(ECHO_Reci == 0);      //等待接收口高电平输出
	OpenTimerForHc();	//打开定时器
	while(ECHO_Reci == 1);
	CloseTimerForHc();	//关闭定时器
	t = GetEchoTimer();	//获取时间,分辨率为1US
	lengthTemp = ((float)t/58);//cm
    *length = (u32)lengthTemp; 
}

Hcsr04.h

#ifndef __HCSR04_H
#define __HCSR04_H
#include "stm32f10x.h"
#include "delay.h"
#include "ioremap.h"
#include "common.h"





//超声波模块初始化
void Hcsr04Init(u32 NVIC_PriorityGroup,u32 PreemptionPriority,u32 SubPriority);

//超声波模块一次距离获取
//返回0 成功
//返回1 失败
void Hcsr04GetLength(u32* length);

#endif

https://www.cnblogs.com/dengxiaojun/p/4279437.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HCSR04超声波传感器驱动 的相关文章

  • 在stm32上对于火焰模块的应用分析

    在stm32上对于火焰模块的应用分析 一 火焰模块 接线说明 供电 3 3v G 接地 GND AO模拟输入 DO数字输出 以stm32f407举例说明 AO接入 PF7 DO接入 PA4 实际上也可以不接 因为本实例没用到 二 火焰模块的
  • 环境类传感器介绍

    经过前几篇的原理讲解 大家对市面上类似气体 PM2 5 火焰呀这类传感器有一定的了解 但是到采购环节就迷茫了 毕竟市面上的产品五花八门 挑的眼花缭乱 今天给大家介绍几款简单的传感器 如果大家有别的传感器 也可以采用 甲醛检测 ZE08 CH
  • 地图采集车的那些事

    一 背景 高精地图 高精采集车 是做地图和出行领域同学经常挂在嘴上的一些常用词儿 但是 圈外的同学可能会问 到底什么是高精 高精是指高精度定位 高精地图是指包含丰富地理信息数据 具有高精度坐标的地图 当然 高精采集车就是采集制作高精地图数据
  • 无线数据采集器

    背景介绍 近年来 软硬件技术的革新带动了物联网行业的发展 趋使其应用场景不断深化 从工业设备故障诊断到共享经济 再到新能源汽车 调研发现 物联网的核心框架为 通过传感器感知物理世界的状态 后续利用数据采集装置对信息进行量化并上传到云平台 最
  • QML android 采集手机传感器数据 并通过udp 发送

    利用 qt 开发 安卓 app 采集手机传感器数据 并通过udp 发送 ifndef UDPLINK H define UDPLINK H include
  • 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

    雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折 于2022年3月31日的审核再度被中止 这不是比亚迪半导体IPO审核第一次被深交所中止 2021年8月8日 因律师北京市天元律师事务所被中国证监会立案调查 比
  • 基于物联网的视觉暂留风扇设计

    论文下载 知网链接 版权所有 有相关问题或索要完整代码实现请联系作者gzn00417或邮箱gzn00417 foxmail com 基于物联网的视觉暂留风扇设计 郭茁宁1 林亦宁2 何胜阳2 哈尔滨工业大学计算机科学与技术学院 黑龙江 哈尔
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • DS18B20温度传感器简介和1-Wire驱动程序

    目录 DS18B20简介 DS18B20的两种供电方式 64位ROM 温度传感器 1 Wire Bus简介 DS18B20通信时序 初始化 ROM相关命令 后续包含任何数据交换的操作 功能相关命令 后续包含任何数据交换的操作 单个DS18B
  • VL6180X传感器驱动

    vl6180x i2c c I2C通信 获取VL6180x地址 可以知道7位地址为0x29 写 0x52 读 0x53 写入数据 通过I2C总线向某一寄存器写入一个字节数据 成功 0 失败 1 uint8 VL6180X WriteByte
  • 基于nb-iot和arduino的气象站(一)

    基于nb iot和arduino的气象站 一 温湿度和紫外线传感器 上一篇已经介绍了项目的大概情况 这一篇先讲温湿度传感器和紫外线传感器的使用 一 温湿度传感器 我使用的温度传感器为DHT21 DHT21数字温湿度传感器是一款含有已校准数字
  • STM32配合火焰传感器的火灾报警

    实验材料 STM32F03 我这里用的是正点原子的战舰 火焰传感器 还有个蜂鸣器 我这个开发板自带 也是可外接的 火焰传感器介绍 工作原理 传感器模块在环境火焰光谱或者光源达不到设定阈值时 DO 口输出低电平 当外界环境火焰光谱或者光源超过
  • HX711称重模块的使用

    HX711称重模块的使用 先贴一段文字 见多了可以跳过直接看下面 满量程输出电压 激励电压 灵敏度1 0mv v 例如 供电电压是5v 乘以灵敏度1 0mv v 满量程5mv 相当于有5Kg 重力产生时候产生5mV 的电压 2 概述 711
  • 电赛猜题?我觉得没用,还不如做好这些!

    01 前言 大家好 我是张巧龙 转眼又到22年电赛 这个公众号上有很多同学可能都参加过电赛 有毕业的已经工作的 也有没毕业的今年要参加 我第一次接触电赛是在大一暑期 从参加电赛到指导学生参加电赛 转眼快十年了 20年省赛有6个省一等奖 21
  • [附代码]多输入AD模数转换,数据接受模块 Verilog 实现 (授人与渔)

    要素察觉 本文基于 AD7888 八输入通道 模数转换芯片 对转换后的数据在 FPGA 中进行接收 所使用的 HDL 为 Verilog 所有实现步骤依据 AD7888 DataSheet 中给出的相关数据和时序图 对原理和相应 Veril
  • STM32F407基于RT-Thread连接ESP8266WiFi模块

    1 连接规则 STM32F4连接ESP8266无线通信 串口通信 首先 本次用到两个串口 我使用的是普中STM32F407 第一个串口为USART1 PA2 PA3 串口一 就是数据线连接单片机和电脑时用的口 串口三USART3 PB10T
  • IMU的ROS调试开发工具包:imu_tools

    目录 imu tool包 问题 参数配置便利性问题 实例 调试microstrain 3dm gx5 25 imu 问题 发布的imu姿态与实际imu姿态不一致问题 imu tool包 http wiki ros org imu tools
  • HCSR04超声波传感器驱动

    HC SR04是一款使用较为广泛的超声波测距模块 模块图如下 该模块具有四个引脚 分别为VCC GND TRIG ECHO 其中VCC GND为供电脚 TRIG为测距触发引脚 ECHO为测距输入引脚 该模块的驱动模式为 控制口发一个 10U
  • 常用电子元件介绍与功能

    常用电子元件简介及其作用 一 电容 1 种类 1 CBB电容 2 铝电解电容 3 钽电解电容 4 高频瓷片电容 5 低频瓷片电容 2 作用 1 去耦 2 滤波器 3 储能 4 检波 5 无源晶振 6 隔直通交 3 总结 二 电感 1 种类
  • 基于振动传感器数据构建预测性维护AI模型

    预测性维修 Predictive Maintenance 简称PdM 是以状态为依据 Condition Based 的维修 在机器运行时 对它的主要 或需要 部位进行定期 或连续 的状态监测和故障诊断 判定装备所处的状态 预测装备状态未来

随机推荐

  • jvm垃圾回收

    为什么需要垃圾回收 首先这个问题的话 主要因为内存是计算机中比较宝贵的财富 如果堆积的对象过多 可想而知 内存会用尽 出现内存溢出的问题 这也就是为什么需要垃圾回收的原因 对什么区域进行回收 jvm中的内存结构中 虚拟机栈 本地方法栈 程序
  • 模拟蒙特卡罗方法计算圆周率

    使用蒙特卡罗方法计算出圆周率 并输出程序运行的时间 以及画出散点图 import random as r 调用random库 import time as t 调用time库 import math 调用math库 import matpl
  • mysql gtid坑_mysql Statement violates GTID consistency 的坑

    今天项目迁移 重新换了一个数据库版本 然后问题来了 原本运行正常的程序迁移过来之后就是不能正常运行 后台报错如下 update tbl user info set 强制下架 mv count mv count 1 update time n
  • Visual Studio配置c环境

    Visual Studio配置c环境 Visual Studio配置c环境 1 下载Visual Studio 下载Visual Studio软件可以直接在其内进行c的运行 不需要配置 官网 其中社区版免费 2 安装Visual Studi
  • TreeMap用法总结

    public class TreeMap
  • Java项目获取图片时的相对路径

    在eclipse环境下 1 通过new ImageIcon 相对路径 getImage 获取 此时的绝对位置是项目根目录 相对路径从下一级目录写起 如项目名为project 要获取的图片a png在src目录下的pic目录下 则代码为 Im
  • 这个智能家居项目开源了

    今天 推荐一个物联网项目 物美智能 如果你具备硬件 软件知识 这个项目肯定符合你的胃口 物美智能是一套软硬件结合的开源项目 该系统可助你快速搭建自己的智能家居系统 你可以学习到设备的集成和软硬件交互 PC 端或者手机与服务端通信 单片机可以
  • spark-shell 加载本地文件报错 java.io.FileNotFoundException

    学习spark shell 时候发现一个问题 从本地文件加载数据生成RDD 报错 文件找不到 原因 spark shell 如果启动了集群模式 真正负责计算的executor会在 该executor所在的 worker节点上读取文件 并不是
  • Element plus 表单验证功能

    以下是官网提供的例子
  • [QT_046]Qt学习之网格布局器(QGridLayout)

    本文转自 Qt编程指南 作者 奇先生 Qt编程指南 Qt新手教程 Qt Programming Guide 6 3 网格布局器 本节介绍网格布局器 QGridLayout 当控件分布的行 列都比较有规律时 可以不用一行行设置布局器 而是直接
  • Linux下文件操作命令练习

    1 创建目录 home hadoop work1 home hadoop work2 mkdir home hadoop work1 mkdir home hadoop work2 2 将当前目录切换到 home hadoop work1
  • Hbuilder+PhPstudy配置PHP环境走过的坑

    由于比较喜欢用Hbuilder写前端 所以选择在这上面写PHP 在网上看到许多搭建环境的方法 最后选择了通俗易懂的PhPstudy 1 在PhPstudy官网上下载 注意 安装的路径不能出现中文和空格 这里我装在d盘 netstat ano
  • safari5.1 进程死掉的故障

    某个网页 在其他版本的safari包括safari mobile都可用 唯独升级到5 1后页面打不开了 用safari自带调试功能发现 解析css时进程死掉了 部分样式出现了 但其他样式没有出现 故障初步定在css上 一个多月过去了 后来将
  • Beyond Compare 3 许可证密钥被撤销

    最近在使用 Beyond Compare 3 时突然出现 许可证密钥被撤销 问题 现象截图以下 自己清除注册表并重新安装后还是出现相同的问题 没办法只能求助于百度 找到解决方法 删除 C Users Administrator AppDat
  • 当我问 ChatGPT 能否推荐一下好用的 API 管理工具时?

    近期围绕 ChatGPT 的话题 真的太多了 我们就知道了 ChatGPT 简单说就是搜索引擎 社交工具 这个解释最简单明了 出于好奇 我也用 ChatGPT 测试了一下 我 在中国 最好的 API 管理工具是什么 ChatGPT 我无法确
  • 剑指 Offer 09. 用两个栈实现队列

    题目链接 09 用两个栈实现队列 思路分析 用两个栈实现队列 首先把1 gt 2然后逐个弹出顶端元素 class CQueue public stack
  • 【华为OD机试真题】单向链表中间节点(寻找链表的中间结点)(C++&java&python)100%通过率 超详细代码注释 代码深度解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 寻找链表的中间结点 知识点链表数组 时间限制 1s空间限制 256MB限定语言 不限 题目描
  • 2021美赛成绩查询证书下载

    下载证书地址为 http www comap math com mcm 2021Certs pdf 链接中的6个 替换为自己队的编号 如 http www comap math com mcm 2021Certs 123456 pdf
  • 中央循环管式蒸发器总图

    中央循环管式蒸发器属于自然循环型的蒸发器 它是工业生产中广泛使用且历史悠久的大型蒸发器 至今在化工 轻工 环保等行业中仍被广泛采用 它的加热室由管径为25mm 75mm 长度为1m 2m 长径之比约为20 40 的直立管束组成 在管束中央安
  • HCSR04超声波传感器驱动

    HC SR04是一款使用较为广泛的超声波测距模块 模块图如下 该模块具有四个引脚 分别为VCC GND TRIG ECHO 其中VCC GND为供电脚 TRIG为测距触发引脚 ECHO为测距输入引脚 该模块的驱动模式为 控制口发一个 10U