stm32halhc-sr04超声波测距
时间: 2025-01-01 15:23:38 浏览: 19
### STM32 HAL库与HC-SR04超声波传感器测距
#### 一、HC-SR04模块介绍
HC-SR04是一种流行的超声波距离传感器,适用于多种电子项目。该模块能够提供2厘米至400厘米范围内的非接触式距离感测功能,其测距精度可以达到3毫米以内[^2]。
#### 二、硬件连接设置
为了使STM32微控制器能有效利用HC-SR04的功能,在实际应用中需完成如下配置:
- **选择芯片**:根据具体需求挑选合适的STM32型号。
- **配置时钟树(RCC)**:确保系统时钟被正确初始化以便后续外设正常工作。
- **配置USART接口**(如果需要调试打印等功能)。
- **配置定时器(TIM)**:用于精确测量时间间隔。
- **配置GPIO引脚**:指定触发脉冲(Trig)和回响(Echo)所对应的IO口[^3]。
#### 三、软件开发环境搭建
在Keil MDK环境下新建工程项目并按照以下步骤操作:
1. 勾选`Use MicroLIB`选项以优化标准C库函数调用效率;
2. 创建两个新的源文件——`SR04.c` 和 `SR04.h` 来封装具体的实现逻辑;
3. 编写必要的头文件包含语句以及全局变量声明等内容于`.h` 文件内;
4. 实现核心算法及相关辅助方法定义于 `.c` 文件之中。
#### 四、示例代码展示
下面给出一段简单的例子来演示如何使用HAL库配合上述提到的硬件资源来进行一次完整的测距过程:
```c
#include "main.h"
#include "sr04.h"
// 定义使用的TIMx实例化对象指针
extern TIM_HandleTypeDef htimX;
void SR04_Init(void){
// 初始化TRIG GPIO为输出模式
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
// ECHO作为输入捕获通道关联到TIMx
__HAL_TIM_SET_CAPTUREPOLARITY(&htimX, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
}
uint32_t SR04_GetDistance_cm(void){
uint32_t time_us=0,distance_cm=0;
// 发送10us以上的正脉宽给TRIG引脚激活测量周期
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN , SET);
HAL_DelayMicroseconds(10);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN , RESET);
// 启动单次捕捉事件等待ECHO变高再记录时刻t1
HAL_TIM_IC_Start_IT(&htimX,TIM_CHANNEL_1);
while(__HAL_TIM_GET_FLAG(&htimX,TIM_FLAG_CC1)==RESET){}
uint32_t t1=__HAL_TIM_GET_COUNTER(&htimX);
// 当ECHO再次回到低电平时停止计数得到持续期间T
while(HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)!=RESET){}
uint32_t T=__HAL_TIM_GET_COUNTER(&htimX)-t1;
// 计算往返时间为T*SystemCoreClock/(2*MICROSECONDS_PER_SECOND),转换成厘米单位除以58即得最终结果
distance_cm=(T*(float)(SystemCoreClock)/(MICROSECONDS_PER_SECOND))/58;
return distance_cm;
}
```
此段代码实现了基本的距离检测流程,包括发送触发信号、读取返回的时间差值,并将其转化为物理意义上的长度表示形式。需要注意的是这里假设已经完成了对相关外设的具体参数设定工作,比如PWM频率的选择等细节部分未在此处展开讨论[^4]。
阅读全文