STM32实现HC-SR04超声波传感器测距详解
创作时间:
作者:
@小白创作中心
STM32实现HC-SR04超声波传感器测距详解
引用
CSDN
1.
https://m.blog.csdn.net/qq_44016222/article/details/142132802
HC-SR04超声波传感器是一种常用的测距传感器,通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。本文将详细介绍HC-SR04超声波传感器的工作原理及其在STM32微控制器上的应用,并提供完整的代码示例。
一、介绍
HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等领域。
以下是超声波传感器的主要参数:
参数 | 规格 |
|---|---|
型号 | HC-SR04 |
工作电压 | DC 5V |
工作电流 | 3.3mA |
工作温度 | -40~85℃ |
输出方式 | GPIO |
探测距离 | 2cm~600cm |
探测精度 | 3mm |
二、传感器原理
1. 原理图
模块包括超声波发射器、接收器与控制电路。
2. 引脚描述
引脚名称 | 描述 |
|---|---|
VCC | 供给电压DC 5V |
GND | 地线 |
TRIG | 触发控制信号输入 |
ECHO | 回响信号输出 |
3. 工作原理介绍
传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为t。根据速度距离公式,结合超声波的传播速度与时间t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2
- 采用IO口TRIG触发测距,给最少10us的高电平
- 模块自动发送8个40khz的方波,自动检测是否有信号返回
- 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(343M/S))/2;
distance_cm=(us)/58
注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果
三、程序设计
使用STM32F103C8T6读取HC-SR04超声波传感器采集的距离数据,通过串口发送至电脑。同时,将读取得到的距离信息在OLED上显示。
硬件连接如下:
- TRIG -> PA0
- ECHO -> PA1
- OLED_SCL -> PB11
- OLED_SDA -> PB10
- 串口 -> 串口1
main.c文件
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "ultrasonic.h"
#include "timer.h"
/*****************辰哥单片机设计******************
STM32
* 项目 : HC-SR04超声波传感器实验
* 版本 : V1.0
* 日期 : 2024.8.27
* MCU : STM32F103C8T6
* 接口 : 参看ultrasonic.h
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
float distance;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
Ultrasonic_Init();
USART1_Config();//串口初始化
OLED_Init();
printf("Start \n");
delay_ms(1000);
OLED_Clear();
//显示“距离:”
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChar(32,0,':',16,1);
OLED_ShowString(60,20,"cm",16,1);
while (1)
{
LED_Toggle();
distance = UltrasonicGetLength();
OLED_ShowNum(40,20,distance,2,16,1);
delay_ms(50); //延时50ms
}
}
ultrasonic.h文件
#ifndef __ULTRASONIC_H
#define __ULTRASONIC_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : HC-SR04超声波传感器h文件
* 版本 : V1.0
* 日期 : 2024.8.27
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
/***************根据自己需求更改****************/
// ULTRASONIC GPIO宏定义
#define ULTRASONIC_GPIO_CLK RCC_APB2Periph_GPIOA
#define ULTRASONIC_GPIO_PORT GPIOA
#define ULTRASONIC_TRIG_GPIO_PIN GPIO_Pin_0
#define ULTRASONIC_ECHO_GPIO_PIN GPIO_Pin_1
#define TRIG_Send PAout(0)
#define ECHO_Reci PAin(1)
/*********************END**********************/
void Ultrasonic_Init(void);
float UltrasonicGetLength(void);
void OpenTimerForHc(void);
void CloseTimerForHc(void);
u32 GetEchoTimer(void);
#endif /* __ADC_H */
ultrasonic.c文件
#include "ultrasonic.h"
#include "timer.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : HC-SR04超声波传感器c文件
* 版本 : V1.0
* 日期 : 2024.8.27
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
//超声波计数
u16 msHcCount;
void Ultrasonic_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd (ULTRASONIC_GPIO_CLK, ENABLE ); // 打开连接 超声波传感器 的单片机引脚端口时钟
GPIO_InitStructure.GPIO_Pin = ULTRASONIC_TRIG_GPIO_PIN; // 配置连接 传感器TRIG 的单片机引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为推挽输出
GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure); // 初始化
GPIO_InitStructure.GPIO_Pin = ULTRASONIC_ECHO_GPIO_PIN; // 配置连接 传感器ECHO 的单片机引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置为浮空输入输入
GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure); // 初始化
TIM4_Int_Init(1000-1,72-1);
}
//打开定时器4
static void OpenTimerForHc()
{
TIM_SetCounter(TIM4,0);
msHcCount = 0;
TIM_Cmd(TIM4, ENABLE);
}
//关闭定时器4
static void CloseTimerForHc()
{
TIM_Cmd(TIM4, DISABLE);
}
//获取定时器4计数器值
u32 GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000;
t += TIM_GetCounter(TIM4);
TIM4->CNT = 0;
delay_ms(50);
return t;
}
//通过定时器4计数器值推算距离
float UltrasonicGetLength(void)
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5)
{
TRIG_Send = 1;
delay_us(20);
TRIG_Send = 0;
while(ECHO_Reci == 0);
OpenTimerForHc();
i = i + 1;
while(ECHO_Reci == 1);
CloseTimerForHc();
t = GetEchoTimer();
lengthTemp = ((float)t/58.0);//cm
sum = lengthTemp + sum ;
}
lengthTemp = sum/5.0;
return lengthTemp;
}
四、实验效果
(实验效果部分未提供具体信息,可以根据实际实验结果补充)
五、资料获取
(资料获取部分未提供具体信息,可以根据实际需求补充)
热门推荐
喝水真的能缓解压力吗?
天津中医药大学设14个学院,涵盖中西医多学科领域
血小板压积偏高或提示疾病风险,及时就医是关键
学习笛子需要注意哪些技巧?
冬季养生新选择:灵芝孢子油助力免疫力提升
珠海苍蝇小馆打卡攻略:地道美食大揭秘!
大乐透金胆预测?理性购彩才是真
人民币兑日元创新高,赴日旅游正当时!
手机以旧换新必看:如何保护微信账号安全
智能水表读数与使用技巧详解:让家庭用水管理更轻松
《美国特种部队史》弥补童年遗憾的好书
戏曲进酒吧:国潮文化为鸡尾酒发展注入新活力
大学生105天逆转脂肪肝:从重度到完全健康的饮食管理经验
低GI饮食控糖法:原理、食物搭配与先锋鸟软件使用指南
丝绸之路申遗成功,开启古建筑遗产跨国保护新模式
从聪明才智到职场精英:1992年属猴人进阶指南
东陵大盗孙殿英:震惊中外的盗掘慈禧、乾隆地宫事件始末
口腔卫生不当致牙垢堆积,定期洗牙可有效预防
良渚文化村现新地标:津岛晓生设计美丽洲教堂
西安古城墙:600年历史建筑变身时尚旅游地标
北京地坛医院推出酗酒基因检测,精准评估酒精耐受度
2024深圳国际肿瘤热疗大会聚焦癌症治疗新突破
从《十八春》看现代人的爱情困境
手腕三角软骨损伤:五种有效治疗方法详解
艾司唑仑和佐匹克隆:助你一夜好眠
保存猪血有妙招:冷藏3天,盐水浸泡2-3天
温一壶月光下的酒:林清玄的诗意人生与散文艺术
三甲医院中医主任医师:四招预防饭后胃疼胃胀
游隙调整对DLR高速主轴轴承有何影响?
肥瘦3:7是关键,4步教你做出餐厅级猪肉丸子