hcsr04超声波传感器stm32 hal
时间: 2025-01-03 18:41:19 浏览: 17
### 使用 STM32 HAL 库连接和配置 HC-SR04 超声波传感器
HC-SR04 是一种常用的超声波测距模块,能够提供 2 cm 至 400 cm 的非接触式距离感测功能,其测距精度可以达到 3 mm[^2]。该模块通过发送超声波脉冲并测量回波时间来计算目标物体的距离。
#### 接线说明
为了使 STM32 和 HC-SR04 正常工作,需按照下表完成硬件连线:
| HC-SR04 Pin | Description | Connected To |
|--|
| VCC | Power Supply | 5V |
| GND | Ground | GND |
| TRIG | Trigger Signal | GPIO Output |
| ECHO | Echo Response | GPIO Input |
TRIG 引脚用于触发一次测距操作,ECHO 则返回反射信号的时间长度。当向 TRIG 发送至少 10 us 高电平后,会启动一次测距过程,并在 ECHO 上输出相应宽度的高电平脉冲表示往返时间[^1]。
#### 初始化设置
接下来,在软件层面初始化必要的外设资源。这里假设已经创建了一个基于 CubeMX 工具生成的基础工程框架。
```c
// 定义使用的GPIO端口及引脚编号
#define TRIGGER_PIN GPIO_PIN_9
#define TRIGGER_PORT GPIOD
#define ECHO_PIN GPIO_PIN_8
#define ECHO_PORT GPIOD
void MX_GPIO_Init(void){
__HAL_RCC_GPIOD_CLK_ENABLE(); // 开启GPIOD时钟
/* Configure trigger pin as output */
GPIO_InitStruct.Pin = TRIGGER_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TRIGGER_PORT, &GPIO_InitStruct);
/* Configure echo pin as input with pull-down resistor to avoid floating state*/
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
}
```
上述代码片段展示了如何利用 HAL 函数配置两个 GPIO 引脚作为 TRIG 输出和 ECHO 输入。注意要启用相应的 GPIO 外设时钟,并根据实际需求调整 `GPIO_InitStruct` 结构体成员变量值以匹配具体应用环境下的参数设定。
#### 测量函数实现
编写一个简单的 C 函数来进行单次距离测量:
```c
float MeasureDistance_cm(){
uint32_t pulse_width_us=0;
// Send a short HIGH signal on the Trig line (at least 10us)
HAL_GPIO_WritePin(TRIGGER_PORT, TRIGGER_PIN , GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(TRIGGER_PORT, TRIGGER_PIN , GPIO_PIN_RESET);
// Wait until we get an answer from sensor and measure its duration.
while(HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)==GPIO_PIN_RESET){}
__HAL_TIM_GET_COUNTER(&htim2); // Start counting when rising edge detected
while(HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)!=GPIO_PIN_RESET){}
pulse_width_us=__HAL_TIM_GET_COUNTER(&htim2)-pulse_width_us;// Stop counter at falling edge
float distance=pulse_width_us/58.0f ; // Convert time into centimeters using speed of sound formula
return distance;
}
```
此部分实现了完整的测距流程:先是给 TRIG 施加短暂的高电位激发探头发出声波;接着等待直到检测到 ECHO 变成低电平时结束计数得到来回传播所需总耗时;最后依据空气中声音的速度换算得出最终结果。
请注意以上例子中的定时器 (`htim2`) 必须事先被正确地初始化以便能正常运作。此外,由于不同型号 MCU 或者编译环境下可能存在的差异性因素影响,建议读者参照官方文档进一步确认细节之处后再做适当修改优化。
阅读全文