stm32f103c8t6hal库配置超声波测距
时间: 2025-07-11 18:06:54 浏览: 8
为了使用STM32F103C8T6微控制器和HC-SR04超声波传感器实现测距功能,需要正确配置硬件连接和软件代码。以下是详细的配置步骤:
### 硬件连接
- **VCC** 连接到 STM32 的 +5V 电源。
- **GND** 连接到 STM32 的 GND。
- **Trig** 引脚连接到 STM32 的一个 GPIO 输出引脚(例如 PA1),用于触发超声波脉冲。
- **Echo** 引脚连接到 STM32 的一个定时器输入捕获引脚(例如 PA0),用于测量回波信号的时间。
### 软件配置
#### 1. 初始化GPIO
首先,初始化 Trig 引脚为推挽输出模式,以便发送触发信号。Echo 引脚应配置为复用推挽输入模式,并连接到相应的定时器通道。
```c
// 初始化Trig引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1;
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);
// 初始化Echo引脚
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
#### 2. 配置定时器
使用定时器进行输入捕获,以测量 Echo 引脚的高电平时间。
```c
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72 - 1; // 假设系统时钟为72MHz,预分频为72,得到1MHz计数频率
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFFFFFF; // 设置最大计数值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
}
```
#### 3. 触发超声波脉冲
在主循环中,通过 Trig 引脚发送至少 10 微秒的高电平信号来启动 HC-SR04 模块。
```c
void triggerSensor()
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1); // 延迟1毫秒
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}
```
#### 4. 处理输入捕获中断
在中断处理函数中,读取定时器的值并计算距离。
```c
uint32_t captureValue = 0;
float distance = 0.0f;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2) {
captureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
distance = (captureValue * 0.034) / 2; // 计算距离,单位为厘米
}
}
```
#### 5. 主循环
在主循环中定期触发传感器并更新距离值。
```c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
while (1)
{
triggerSensor();
HAL_Delay(500); // 每隔500毫秒触发一次
}
}
```
### 注意事项
- 确保定时器的预分频设置正确,以便获得合适的计数频率。
- 在实际应用中,可能需要对捕获值进行滤波或多次测量以提高精度。
- 根据具体的硬件设计调整代码中的引脚定义和定时器参数。
### 相关问题
1. 如何在STM32CubeMX中配置HC-SR04超声波传感器?
2. 使用HAL库实现多个超声波传感器测距的最佳实践是什么?
3. 如何优化超声波测距的精度和稳定性?
阅读全文
相关推荐

















