stm32F103C8T6 hc-sr04
时间: 2025-01-07 09:23:16 浏览: 48
### STM32F103C8T6 使用 HC-SR04 超声波传感器教程
#### 初始化 GPIO 和 TIM
为了使HC-SR04正常工作,需要配置GPIO引脚来触发超声波模块并接收回响信号。同时,使用定时器测量时间间隔。
```c
// 配置Trig引脚为输出模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
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_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
#### 定义函数用于发送触发脉冲
通过设置`TRIG`引脚高电平至少10微秒可以启动一次测距操作。
```c
void sendTriggerPulse(void){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
}
```
#### 测量距离
当接收到返回的ECHO信号时,计算其持续的时间长度,并转换成实际的距离值。
```c
float measureDistance_cm(void){
uint32_t start_time,end_time,duration;
// 发送触发脉冲
sendTriggerPulse();
// 等待ECHO变为高电平
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)==RESET){}
// 记录开始时间
start_time=HAL_GetTick();
// 等待ECHO变低
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1));
// 记录结束时间
end_time=HAL_GetTick();
duration=end_time-start_time;
float distance=(duration*0.034)/2; // 声音速度约为340m/s
return distance;
}
```
上述代码实现了基本的功能框架[^1]。需要注意的是,在实际项目开发过程中还需要考虑更多细节问题,比如处理噪声干扰以及优化程序性能等。
阅读全文
相关推荐

















