超声波模块HC_SR04(hal库)
超声波模块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 */}