目录
一、介绍
二、传感器原理
1.原理图
2.引脚描述
3.工作原理介绍
三、程序设计
main.c文件
ultrasonic.h文件
ultrasonic.c文件
四、实验效果
五、资料获取
项目分享
一、介绍
HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等领域。
以下是超声波传感器的参数:
型号 | HC-SR04 |
工作电压 | DC 5V |
工作电流 | 3.3mA |
工作温度 | -40~85℃ |
输出方式 | GPIO |
探测距离 | 2cm~600cm |
探测精度 | 3mm |
哔哩哔哩视频链接:
HC-SR04超声波传感器详解(STM32)
(资料分享见文末)
二、传感器原理
1.原理图
模块包括超声波发射器、接收器与控制电路。
2.引脚描述
引脚名称 | 描述 |
VCC | 供给电压DC 5V |
GND | 地线 |
TRIG | 触发控制信号输入 |
ECHO | 回响信号输出 |
3.工作原理介绍
传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为 t。根据速度距离公式,结合超声波的传播速度与时间 t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2
1. 采用 IO 口 TRIG 触发测距,给最少 10us 的高电平
2. 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回
3. 有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离 =( 高电平时间*声速 (343M/S))/2;
distance_cm= ( us)/58
注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果
三、程序设计
1.使用STM32F103C8T6读取HC-SR04超声波传感器采集的距离数据,通过串口发送至电脑
2.将读取得到距离信息数据同时在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);//cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;
}