STM32CubeIDE 利用LL库 SysTick简单实现hcsr04超声波测距
一、超声波测距模块简介(网络摘取)
HC-sr04是一款典型的超声波测距模块,升级版的程序和04的差别不大,只是测量范围和精度有所不同。
它是如何工作的?
超声波传感器使用声纳来确定到物体的距离。以下是其工作过程:
1. 发射器(触发引脚)发送信号:一段高频声音。
2. 当信号遇到一个物体时,它会被反射;
3. 然后发射器(回声引脚)接收该信号。
信号发送和接收之间的时间可以告知我们到物体的距离。这个是可以实现的,因为我们知道声音在空气中传播的速度。
传感器引脚图
● VCC:+ 5VDC
● Trig:触发(输入)
● Echo:回声(输出)
● GND:GND
二、CubeMX配置
任选两个GPIO,一个作为输入,一个作为输出。
在Project Manager -- Advanced Settings选项栏内,GPIO后面选择LL库。(忽略其他配置)
三、自动生成的代码
void MX_GPIO_Init(void)
{LL_GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);/**/LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12);/**/GPIO_InitStruct.Pin = LL_GPIO_PIN_12;GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;LL_GPIO_Init(GPIOB, &GPIO_InitStruct);/**/GPIO_InitStruct.Pin = LL_GPIO_PIN_13;GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
四、用户代码
1. <hcsr04.h>
/** hcsr04.h** Created on: 2020年4月29日* Author: zateper*/#ifndef INC_HCSR04_H_
#define INC_HCSR04_H_float HCSR04_GetLength(void);#endif /* INC_HCSR04_H_ */
2. <hcsr04.c>
#include "hcsr04.h"
#include "gpio.h"
#include "delay.h"
#include "usart.h"#define HCSR04_PORT GPIOB
#define HCSR04_TRIG LL_GPIO_PIN_12
#define ECHO_Reci LL_GPIO_IsInputPinSet(HCSR04_PORT,LL_GPIO_PIN_13)void TRIG_pulse()
{LL_GPIO_SetOutputPin(HCSR04_PORT,HCSR04_TRIG);Delay_us(30);LL_GPIO_ResetOutputPin(HCSR04_PORT,HCSR04_TRIG);
}float HCSR04_GetLength(void)
{uint32_t startval,endval,tickn,ticknend,delayt;double delays;uint32_t timeout = 23530;//uSint i = 0;float lengthTemp = 0;float sum = 0;delays = 0;while(i!=5){TRIG_pulse();startval = SysTick->VAL;tickn = HAL_GetTick();while(ECHO_Reci == 0) //等待接收口高电平输出{endval = SysTick->VAL;//读取系统滴答值ticknend = HAL_GetTick();if(ticknend == tickn){if(startval > endval){delayt = (startval - endval);}else//系统滴答进入下一毫秒{delayt = (startval +72000 - endval);}}else{delayt = ((ticknend - tickn) * 72000 + startval - endval);}if(delayt > 360000)//时间超时{printf("s%d,e%d;t%d,d%d\r\n",startval,endval,tickn,ticknend);return delayt;}}startval = SysTick->VAL;//跳出上一循环意味着Echo来了上升沿,读取此时滴答(时间)tickn = HAL_GetTick();i = i + 1;while(ECHO_Reci == 1){endval = SysTick->VAL;ticknend = HAL_GetTick();if(ticknend == tickn){if(startval > endval){delays = (startval - endval)/72.0;}else{delays = (startval +72000 - endval)/72.0;}}else{delays = ((ticknend - tickn) * 72000 + startval - endval)/72.0;}if(delays > timeout)//超时时间{printf("s%d,e%d;t%d,d%d\r\n",startval,endval,tickn,ticknend);return delays;}}endval = SysTick->VAL;//跳出上一循环意味着Echo来了下降沿,读取此时滴答(时间)ticknend = HAL_GetTick();delays = ((ticknend - tickn) * 72000 + startval - endval)/72;//计算时间差lengthTemp = ((float)delays/58.0);//单位cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;
}
此方法利用现成的SysTick计算时间差而没有使用硬件定时器,精度一样很高,适用于没有中断或者中断响应处理比较快的场景。同时加入了超时处理,避免while()死循环。
3. delay_us()
见:HAL库微秒us的延时Delay实现
4. 使用
float length;length = HCSR04_GetLength();
printf("距离为:%.3f\r\n",length);
STM32CubeIDE 利用LL库 SysTick简单实现hcsr04超声波测距相关推荐
- 利用PCL库做简单的三维立体图形
利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...
- 利用pcl库实现简单单帧障碍物检测
利用pcl库实现简单单帧障碍物检测 #include <iostream> #include <pcl/common/common_headers.h> #include &l ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- STM32F103驱动HCSR04超声波测距显示
STM32F103驱动HCSR04超声波测距显示 目录 超声波模块介绍 ①实物图 ②产品说明 ③电气参数 ④超声波工作原理 驱动代码 ①STM32配置初始化代码 ①超声波驱动应用代码 ②超声波距离计算 ...
- 学习并使用HC-SR04超声波测距模块+STM32
** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...
- 最简单的51超声波测距程序
文章目录 前言 一.51超声波测距是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 最简单的51超声波测距程序,注释相当详细,测量出来的值直接显示在数码管上,距离超过20cm就显示三个A, ...
- STM32F103—有关HC-SR04超声波测距模块的代码
关于HC-SR04超声波测距模块(Trig和Echo的引脚可以自定义,我用的TRIG是PBout(11) ECHO是PBin(10)) 硬件连接: Vcc :5V输入(最好不要用3.3V输入) Tri ...
最新文章
- python 去除list 里面的重复元素
- 新趋势:工具赋能企业数字化转型,驱动组织升级!
- Fiddler抓取数据并分析(完整的配置教程)
- P1712-[NOI2016]区间【线段树,尺取法】
- 安装NTOP网络监控工具(wheezy)
- 计算机专业经典书籍强烈推荐
- matlab中load seamout,matlab中的save与load函数
- thinkphp5 接收layui上传的文件
- linux环境做路径左斜杠和右斜杠,不同操作系统下的路径分隔符—反斜杠与斜杠...
- WorkPlus助力“深i企”打造移动数字化底座
- tornodo异步请求
- TSE无线通信(铺垫)
- CTEX中文编辑问题
- python实现抢票github_面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍...
- Unity的C#编程教程_61_委托和事件 Delegates and Events 详解及应用练习
- java模拟网易邮箱登录_使用服务端和客户端两种方法 模拟网易邮箱实现全选,全不选的功能...
- 小米mix2s支持html,小米MIX2S支持无线充电吗?米粉欢呼!
- Redis_保存数据时报错MISCONF Redis is configured to save RDB snapshots, but it is curren
- Oracle的DBMS_JOBS定时
- Zabbix监控华为交换机
热门文章
- 七个千僖年数学难题与希尔伯特二十三个问题
- 2021冬-不靠谱的老板-visa信用卡白paio两台服务器
- 模电——电路中电源地、模拟地、信号地的区别与联系
- 马云的“野心”,阿里的区块链布局
- 图解Transformer
- 数睿数据深度 | 中国软件网对话数睿数据总裁刘超:深挖数据驱动、企业级无代码
- 泛微OA 子表单中文本框设置默认值不显示的问题
- graph classification and drug discovery
- flutter 运行失败 The SDK directory 'xxxxx' does not exist.
- bzoj 4399 魔法少女LJJ