当前位置: 首页 > news >正文

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)

超声波测距模块参考资料

1.电路连接及引脚配置

触发信号PA3只需要输出10us的高电平,所以直接设置成 普通的GPIO端口即可;回响信号使用外部中断,上升沿信号产生外部中断,打开定时器,下降沿再产生一次中断,读取定时器的值,就是高电平的时间,测试距离=(高电平时间*声速(340M/S))/2。

调试引脚配置:

配置时钟:

GPIO配置: 

打开中断: 

 定时器设置:配置成最基本的定时器即可

\frac{HCLK}{PCS+1}=\frac{72MHz}{71+1}=1MHz

PSC设置为72时候就是没过1us定时器里面的计数值就加1,我们的计数器是16位的,就是最大可以计数到65535,那我这个定时器最大可以计时到65535us,即0.065535s。所以最大测距范围为:\frac{0.065535\times340}{2}=11.14095m,远远大于这款超声波测距模块的测距范围。

除此之外,我们要设置一下I2C给OLED显示屏使用,用于显示测量值:

2.驱动文件编写

(1)添加两个文件sr04.c和sr04.h

(2)sr04. h

#ifndef _SR04_H
#define _SR04_H#include "stm32f1xx_hal.h"void GET_Distance(void);#endif

(3)sr04.c,超声波测距实现

#include "sr04.h"uint16_t count;
float distance;
extern TIM_HandleTypeDef htim3;/*指令耗时计算延时函数:
在程序里执行若干条空指令,来达到延时效果*/
void RCCdelay_us(uint32_t udelay)
{__IO uint32_t Delay = udelay * 72 / 8;//(SystemCoreClock / 8U / 1000000U)//见stm32f1xx_hal_rcc.c -- static void RCC_Delay(uint32_t mdelay)do{__NOP();}while (Delay --);
}/*测距模块触发信号函数*/
void GET_Distance(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);RCCdelay_us(12);                                          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);    //触发引脚电平拉高12us输出触发信号
}/*中断服务函数,计数定时,解算测量距离*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==GPIO_PIN_SET)  //上升沿中断{__HAL_TIM_SetCounter(&htim3,0);     //定时器清零HAL_TIM_Base_Start(&htim3);         //定时器开始计时}else                                    //下降沿触发中断{HAL_TIM_Base_Stop(&htim3);          //定时器停止计时count=__HAL_TIM_GetCounter(&htim3); //读取定时器计数值distance=count*0.017;               //测试距离:((count/1000000)*340/2)*100,单位CM}
}

(4)main.c

主函数里直接在直接调用GET_Distance()即可。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-39 HDMI视频输入测试
  • 我司使用了两年的高效日志打印工具,非常牛逼!
  • 【C++】优化函数对象:提升性能和内存效率
  • 第十六篇:走入计算机网络的传输层--传输层概述
  • 【Linux 运维知识】Linux 编译后的内核镜像大小
  • elementplus表单位置居中
  • SSH免秘钥问题
  • mac 安装brew并配置国内源
  • Minimax-秋招正式批-面经(SQL相关)
  • EasyExcel实现复杂Excel的导入
  • linux系统中,计算两个文件的相对路径
  • springboot中的请求过滤filter与拦截interceptor分析
  • 如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
  • Windows下Python和PyCharm的应用(一)__第一个测试程序
  • linux 配置 iscsi 存储资源共享
  • JS 中的深拷贝与浅拷贝
  • Cookie 在前端中的实践
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 奇技淫巧
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Vue 2.3、2.4 知识点小结
  • vue.js框架原理浅析
  • webpack4 一点通
  • 多线程 start 和 run 方法到底有什么区别?
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 好的网址,关于.net 4.0 ,vs 2010
  • 简析gRPC client 连接管理
  • 面试总结JavaScript篇
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 十年未变!安全,谁之责?(下)
  • 因为阿里,他们成了“杭漂”
  • 用element的upload组件实现多图片上传和压缩
  • 云大使推广中的常见热门问题
  • ​configparser --- 配置文件解析器​
  • ​secrets --- 生成管理密码的安全随机数​
  • ​如何防止网络攻击?
  • #Java第九次作业--输入输出流和文件操作
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $(selector).each()和$.each()的区别
  • (C++17) optional的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (一)kafka实战——kafka源码编译启动
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • *上位机的定义
  • .ai域名是什么后缀?
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET BackgroundWorker
  • .NET CLR Hosting 简介
  • .Net IOC框架入门之一 Unity