超声波模块HC_SR04
原理
1.触发信号:拉高至少10us的高电平
2.回响信号处理:计算高电平时长
3.计算距离:时间*速度(声速)/2(注意单位问题)
代码实现
方法1.下拉输入
配置
用于延时微秒us和计算时长
Delay_us微秒延时函数
定时器延时us(hal库)-CSDN博客
配置gpio
推挽输出和下拉输入
默认输出低电平
下拉输入
参考代码
hcsr_04.h
#ifndef __hcsr_04_H__
#define __hcsr_04_H__
#include "main.h"
#define HCSR_04_Trig_SET HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define HCSR_04_Trig_RESET HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)
void HCSR_04_Trig_Start(void);
float HCSR_04_Get_Distance_cm(void);
#endif
hcsr_04.c
#include <hcsr_04.H> // 包含 HCSR-04 传感器的头文件
#include "delay_us.h" // 包含微秒级延时的头文件
extern TIM_HandleTypeDef htim1; // 声明外部定时器句柄
// 启动 HCSR-04 的 Trigger 脉冲
void HCSR_04_Trig_Start()
{
HCSR_04_Trig_SET; // 设置 Trigger 引脚为高电平
Delay_us(20); // 延时 20 微秒
HCSR_04_Trig_RESET; // 将 Trigger 引脚设置为低电平
}
// 获取距离值,单位为厘米
float HCSR_04_Get_Distance_cm(void)
{
float count = 0; // 用于存储计数值
float distance_cm = 0; // 用于存储计算得到的距离值
HCSR_04_Trig_Start(); // 启动 Trigger 脉冲
while(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin) == GPIO_PIN_RESET){}; // 等待 Echo 引脚变高电平
__HAL_TIM_SetCounter(&htim1, 0); // 清空定时器计数值
HAL_TIM_Base_Start(&htim1); // 启动定时器
while(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin)){}; // 等待 Echo 引脚变低电平
HAL_TIM_Base_Stop(&htim1); // 停止定时器
count = __HAL_TIM_GetCounter(&htim1); // 获取定时器的计数值
distance_cm = count * 340 / 2 * 0.000001 * 100; // 计算距离,单位为厘米
return distance_cm; // 返回计算得到的距离值
}
测试
OLED_Init();
OLED_Clear(0);
float Distance_cm = 0;
char str[128] = "printf";
OLED_ShowString(0,0,(uint8_t *)str,16);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(1000);
Distance_cm = HCSR_04_Get_Distance_cm();
sprintf(str,"Distance_cm=%f",Distance_cm);
OLED_ShowString(0,0,(uint8_t *)str,16);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}