使用STM32F407驱动HC-SR04超声波测距模块

97 篇文章 ¥59.90 ¥99.00
本文介绍了如何使用STM32F407微控制器驱动HC-SR04超声波测距模块进行测距。详细讲解了硬件连接步骤和STM32F407的GPIO配置,包括发送10微秒脉冲到Trig引脚,接收Echo引脚回波,以及计算距离的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超声波测距模块(HC-SR04)是一种常用的测距传感器,可以通过发送超声波脉冲并接收其回波来测量物体与传感器之间的距离。在本文中,我们将使用STM32F407微控制器来驱动HC-SR04超声波测距模块,并获取测距数据。

驱动HC-SR04超声波测距模块需要以下步骤:

  1. 硬件连接:

    • 将HC-SR04模块的Trig引脚连接到STM32F407的GPIO引脚,例如GPIOA的Pin0引脚。
    • 将HC-SR04模块的Echo引脚连接到STM32F407的GPIO引脚,例如GPIOA的Pin1引脚。
    • 将HC-SR04模块的Vcc引脚连接到正电源(+5V)。
    • 将HC-SR04模块的GND引脚连接到地线(GND)。
  2. STM32F407配置:

    • 首先,确保你已经设置好了适当的时钟和引脚配置。
    • 在代码中包含必要的头文件:
      #include "stm32f4xx.h"
      
  3. 初始化GPIO引脚:

    • 在主函数中,使用
STM32F407使用HC-SR04超声波测距模块的小例程通常涉及以下几个步骤: 1. **硬件连接**: -HC-SR04传感器的Trig(触发信号)连接到STM32的GPIO引脚,例如PA_9(某些版本可能会是PB_08)。 - Echo(回声信号)接另一个GPIO引脚,如PA_10 或 PB_09。 - 如果有需要,将电源(Vcc)接到STM32的3.3V或5V供电口。 2. **初始化GPIO**: - 配置这两个GPIO为推挽输出和输入模式,并设置为下拉输入,等待触发信号。 3. **编写主函数**: ```c #include "stm32f4xx_hal.h" ... void measureDistance(void) { GPIO_InitTypeDef GPIO_InitStruct; uint16_t distance_cm = 0; // 初始化GPIO GPIO_InitStruct.Pin = GPIO_PIN_9; // Trig pin GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; // Echo pin GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_Delay(10); // 稍微延迟一下,让系统稳定 // 发送触发脉冲 GPIO_SetBits(GPIOA, GPIO_Pin_9); HAL_Delay(10); GPIO_ResetBits(GPIOA, GPIO_Pin_9); // 接收回声信号并计算距离 while (HAL_GPIO_GetState(GPIOA, GPIO_Pin_10) == GPIO_PIN_RESET) {} // 等待Echo high uint16_t echo_time_us = HAL_GetTick(); while (HAL_GPIO_GetState(GPIOA, GPIO_Pin_10) == GPIO_PIN_SET) {} // 等待Echo low uint16_t pulse_width_us = HAL_GetTick() - echo_time_us; distance_cm = pulse_width_us / 58; // HC-SR04公式:时间 * 0.034 / 2 // 距离处理并打印结果 if (distance_cm > 0 && distance_cm <= 400) { printf("Distance: %.2f cm\n", distance_cm); } else { printf("Invalid measurement.\n"); } } ``` 4. **定时测量**: - 在循环中定期调用`measureDistance()`函数,获取并显示当前的距离值。 5. **添加中断服务程序**(可选): - 如果超时检测重要,可以使用TIM定时器配合中断来提高精度。 记得在实际项目中,别忘了配置时钟、中断以及其他必要的库文件。这是一个基本示例,根据实际需求可能还需要添加错误检查和其他功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值