hcsr04stm32避障
时间: 2024-12-26 12:21:01 浏览: 5
### HCSR04 超声波传感器与 STM32 微控制器实现避障的方法
#### 一、硬件连接
为了使 HCSR04 超声波传感器能够正常工作并与 STM32 进行通信,需按照如下方式连接电路:
- Trig(触发信号输入)接到 STM32 GPIO 口用于发送方波脉冲来启动测量过程;
- Echo(回响信号输出)同样接到另一个 GPIO 口用来接收反射回来的超声波信号。
此部分描述了如何建立物理上的链接以便后续软件编程可以顺利执行[^1]。
#### 二、初始化设置
在程序开始前要先配置好相应的外设资源,包括但不限于开启时钟门控、设定 I/O 功能以及中断优先级等操作。对于 HCSR04 来说最重要的是对两个 GPIO 引脚分别作为输出和输入模式来进行初始化处理。
```c
// 初始化GPIO引脚
void Ultrasonic_Init(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启PA端口时钟
/* 配置Trig为推挽输出 */
GPIO_InitStruct.Pin = GPIO_PIN_9;
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;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
这段代码展示了具体的初始化函数定义及其内部逻辑结构。
#### 三、距离计算原理
当向 Trig 发送至少 10us 的高电平后,HCSR04 将自动发出八次 40kHz 方波并检测是否有返回信号;如果有,则通过改变 Echo 状态通知 MCU 并保持该状态持续一段时间 t,这段时间即代表往返时间。利用公式 d=vt/2 计算目标物体的距离 d,其中 v 表示声音传播速度约为 340 m/s,在空气中近似不变。
```c
float Get_Distance(){
uint32_t TimeOutCnt;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); // 设置TRIG引脚为高电平
delay_us(15); // 延迟大于等于10微秒
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);// 设置TRIG引脚为低电平
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)==RESET){ // 等待ECHO变为高电平
if(TimeOutCnt++ >= US_TO_TIMETICKS(1)){ // 如果等待超过一定时限则退出循环防止死锁
return -1; // 返回错误标志位表示未接收到有效数据
}
}
TIM->CNT = 0; // 清零定时器计数值准备记录ECHO宽度
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)!=RESET){} // 等待ECHO变回低电平时停止计数
float distance = ((TIM->CNT)*0.034)/2; // 根据公式d=v*t/2计算实际距离
return distance;
}
```
上述 C 函数实现了完整的测距流程,并考虑到了异常情况下的保护机制。
#### 四、避障策略设计
基于获取到的距离信息,可以通过编写简单的条件判断语句来决定小车的动作方向。例如当检测前方障碍物小于安全阈值时立即停止前进并向左转或右转避开它;如果两侧都有障碍物则倒退一段距离再尝试重新规划路径直到找到合适的方向为止。
```c
if(distance < SAFE_DISTANCE){
Stop();
Delay_ms(500);
LeftTurn();
Delay_ms(500);
}else{
Forward();
}
```
这里给出了一种基本思路供参考,具体应用可根据实际情况调整参数以达到最佳效果。
阅读全文