stm32f407vet6超声波
时间: 2025-04-18 16:18:25 浏览: 35
### STM32F407VET6与超声波模块的应用
#### 硬件连接说明
为了实现STM32F407VET6开发板与超声波模块HC-SR04之间的通信,需按照如下方式连接电路:
| HC-SR04 Pin | 连接至 |
|-------------|--------|
| VCC | 5V |
| GND | GND |
| TRIG | PA8 (或其他GPIO口) |
| ECHO | PB9 (外部中断线, 或其他GPIO口)|
表中TRIG引脚用于触发测量距离的操作;ECHO引脚返回脉冲信号表示物体反射回来的时间差。
#### 初始化配置
初始化阶段主要涉及设置定时器来精确计时以及配置外设接口。以下是部分C语言代码片段展示如何完成这些操作:
```c
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim2; // 定义一个定时器句柄对象
void MX_TIM2_Init(void){
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用 TIM2 的时钟
htim2.Instance = TIM2;
/* 配置参数 */
htim2.Init.Prescaler = 83; // 设置预分频系数为84-1=83(假设系统频率为84MHz),即定时单位约为1us
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535; // 自动重装载值最大
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2); // 初始化基础时间基类功能
}
```
此段程序负责设定好定时器的相关属性并启动它以便后续用来计算回响时间间隔[^2]。
#### 测量过程描述
当向目标发送超声波之后,在等待接收端反馈期间会开启一次高精度计数。一旦检测到有电平变化,则停止计数并将所得数值转换成实际物理长度。具体流程可以参见下面给出的例子:
```c
uint32_t start_time,end_time,duration;
float distance_cm;
// 发送触发信号给HC-SR04
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
__NOP();
__NOP();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)==RESET){} // 等待上升沿到来
start_time=__HAL_TIM_GET_COUNTER(&htim2); // 记录开始时刻
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)){ } // 等待下降沿到来
end_time=__HAL_TIM_GET_COUNTER(&htim2); // 获取结束瞬间读数
duration=end_time-start_time; // 得到持续周期
distance_cm=(duration/2)/29.1; // 将微秒换算成厘米
```
上述函数实现了完整的往返行程测算逻辑,并最终得出两者的间距结果。
阅读全文
相关推荐


















