返回

STM32单片机超声波测距实例

后端

使用 STM32 单片机和 HC-SR04 超声波传感器进行距离测量

距离测量在工业自动化、机器人技术和自动驾驶等众多应用中至关重要。超声波测距技术是一种基于反射原理的可靠且低成本的解决方案,它不受环境光线的影响。本文将指导你如何使用 STM32 单片机和 HC-SR04 超声波传感器构建一个超声波测距系统。

硬件连接

STM32 单片机和 HC-SR04 超声波传感器需要通过四根导线连接:

  • VCC:传感器电源(3.3V 或 5V)
  • GND:传感器接地
  • TRIG:触发信号引脚
  • ECHO:回波信号引脚

软件配置

软件配置涉及 GPIO 引脚和定时器的设置:

  • GPIO 配置:
    • 将 TRIG 引脚配置为输出模式,保持低电平。
    • 将 ECHO 引脚配置为输入模式,启用中断。
  • 定时器配置:
    • 配置一个定时器来测量超声波脉冲的宽度。

测试步骤

测试超声波测距系统需要:

  1. 将传感器放置在距目标对象 2cm 至 4m 的范围内。
  2. 向 TRIG 引脚发送触发脉冲。
  3. HC-SR04 传感器发出超声波脉冲并等待回波。
  4. 传感器检测到回波后,输出回波脉冲。
  5. STM32 单片机测量回波脉冲的宽度,并将其转换为距离。

代码示例

以下是使用 STM32 HAL 库的示例代码:

#include "stm32f1xx_hal.h"

GPIO_InitTypeDef gpio_init;
TIM_HandleTypeDef timer_handle;

void trigger_sensor() {
  HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
  HAL_Delay(10);
  HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
}

int main() {
  // GPIO 初始化
  gpio_init.Pin = TRIG_Pin | ECHO_Pin;
  gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
  gpio_init.Pull = GPIO_NOPULL;
  gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(TRIG_GPIO_Port, &gpio_init);

  // 定时器初始化
  timer_handle.Instance = TIMx;
  timer_handle.Init.Prescaler = 0;
  timer_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  timer_handle.Init.Period = 0xFFFF;
  HAL_TIM_Base_Init(&timer_handle);

  while (1) {
    trigger_sensor();
    while (!HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin));
    TIM2->CNT = 0;
    while (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin));
    float distance = TIM2->CNT * (float)0.034 / 2;
  }
}

注意事项

  • 传感器范围在 2cm 至 4m 之间。
  • 精度受温度、湿度和气流影响。
  • 避免其他超声波设备的干扰。
  • 确保传感器和目标之间没有障碍物。

结论

通过使用 STM32 单片机和 HC-SR04 超声波传感器,你可以轻松构建一个准确且可靠的超声波测距系统。它在各种应用中提供了低成本且有效的距离测量解决方案。

常见问题解答

  1. 超声波测距的优点是什么?
    • 成本低
    • 精度高
    • 不受环境光线影响
  2. 超声波测距的局限性是什么?
    • 有限的测量范围
    • 易受环境因素影响
  3. 我可以使用其他超声波传感器吗?
    • 可以,只要它与 HC-SR04 具有相似的特性。
  4. 如何提高测距精度?
    • 使用更准确的传感器
    • 平均多次测量结果
  5. 超声波测距技术有哪些应用?
    • 机器人导航
    • 无人驾驶汽车
    • 工业测量