stm32f407控制hcsr04
时间: 2025-01-07 13:41:32 浏览: 5
### STM32F407 控制 HC-SR04 超声波传感器 示例代码 教程
#### 初始化 GPIO 和 TIM 定时器
为了实现精确的时间测量,需要配置GPIO用于触发信号以及读取回波信号。同时还需要设置定时器来捕捉高电平持续时间。
```c
void Ultrasonic_Init(void){
// 配置 Trig 引脚为推挽输出模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9; // 假设Trig连接到PA9
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 Echo 引脚为输入上拉模式
GPIO_InitStruct.Pin = GPIO_PIN_8; // 假设Echo连接到PA8
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置TIM2作为计数器捕获单元
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 83; // 设置预分频系数使得频率达到1MHz(假设系统时钟为84Mhz)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim2) != HAL_OK){
Error_Handler();
}
// 配置通道1(IC1)为上升沿/下降沿捕获模式
TIM_IC_ConfigChannel(TIM_CHANNEL_1,&htim2,TIM_INPUTCHANNELPOLARITY_RISING_FALLING,Frequency,Resolution);
}
```
#### 测量距离函数
此部分负责发出触发脉冲,并通过计算两个边沿之间的时间差得到实际的距离值。
```c
float Measure_Distance_cm(void){
uint32_t IC_Val1=0,IC_Val2=0,CapturedTime=0;
float Distance=0.0;
// 发送至少10us宽度的正脉冲至TRIG端子启动一次测距过程
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
HAL_DelayMicroseconds(10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
// 开始等待ECHO引脚变为有效状态即检测到反射回来的声音信号
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)==GPIO_PIN_RESET){}
// 当接收到第一个上升沿的时候记录当前时刻
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
while(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_CC1IF)!=SET){}
IC_Val1=__HAL_TIM_GetCapture1(&htim2);
// 接着继续监测直到遇到下一个下降沿为止再次保存此时刻数值
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)==GPIO_PIN_SET){}
IC_Val2=__HAL_TIM_GetCapture1(&htim2);
CapturedTime=(IC_Val2>IC_Val1)?(IC_Val2-IC_Val1):(0xFFFF-IC_Val1+IC_Val2+1);
// 计算最终结果并返回厘米单位下的物理长度
Distance=((CapturedTime*0.034)/2);
return Distance;
}
```
上述程序展示了如何利用STM32F407微控制器配合HC-SR04超声波传感设备完成基本的距离探测功能[^1][^2]。需要注意的是,在具体应用过程中可能还需考虑环境因素的影响如温度变化对于声速的影响等,从而进一步优化算法提高精度[^3]。
阅读全文