stm32超声波测距+串口调试助手
时间: 2024-12-27 09:27:34 浏览: 19
### 实现STM32与超声波传感器进行测距并通过串口调试助手查看结果
#### 准备工作
为了实现这一功能,需准备以下硬件组件[^3]:
- STM32F103C8T6 开发板
- HC-SR04 超声波模块
- USB-TTL 串口转换模块用于连接PC端的串口助手
- 若干杜邦线用于连接各个元件
确保所有设备之间的接地(GND)相连。
#### 连接方式
HC-SR04 的 VCC 接到 STM32 的 5V 或者 3.3V 输出脚上;Trig 触发信号输入接到任意 GPIO 口作为输出控制触发脉冲;Echo 回响信号输出接到另一个 GPIO 口读取回响时间;GND 则要共地处理。USB-TTL 模块则用来桥接计算机上的串口软件和 STM32 微控制器间的通讯接口,其中 RXD 应该连至 STM32 的 TX 引脚而 TXD 需要连向 STM32 的 RX 引脚[^2]。
#### 初始化配置
在 `main.c` 文件顶部引入必要的头文件并初始化 HAL 库以及 UART 外设以便于后续的数据传输操作:
```c
#include "stm32f1xx_hal.h"
UART_HandleTypeDef huart1;
```
接着,在主函数之前完成外设的具体参数设定:
```c
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void){
HAL_Init();
SystemClock_Config(); // 设置系统时钟
MX_GPIO_Init(); // 初始化GPIO
MX_USART1_UART_Init();// 初始化USART1
while (1){
// 主循环体逻辑放置处...
}
}
```
对于 USART1 的具体初始化可以参照如下代码片段来调整波特率等属性以匹配电脑端使用的串口工具设置:
```c
static void MX_USART1_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK){
Error_Handler();
}
}
```
#### 测量距离算法
当一切就绪之后就可以编写实际测量部分了。这里给出一个简单的例子说明如何利用定时器捕捉机制计算往返时间从而得出目标物体的距离值[^1]:
```c
#define TRIG_PIN GPIO_PIN_X // 替换成实际连线对应的引脚编号
#define ECHO_PIN GPIO_PIN_Y // 同上
// 发送高电平持续至少10us给TRIG引脚启动一次测量周期
__IO uint8_t send_trigger(){
HAL_GPIO_WritePin(GPIOA, TRIG_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOA, TRIG_PIN, GPIO_PIN_RESET);
}
float get_distance_cm(){
float distance;
send_trigger();
__IO uint32_t start_time = HAL_GetTick(), end_time=0;
// 等待ECHO变为高表示收到反射波形开始计时
while(HAL_GPIO_ReadPin(GPIOA,ECHO_PIN)==RESET){}
start_time = HAL_GetTick();
// 当ECHO再次变低时表示结束接收反射波形停止计时
while(HAL_GPIO_ReadPin(GPIOA,ECHO_PIN)!= RESET){}
end_time = HAL_GetTick();
// 计算传播时间和对应的实际物理长度单位为厘米(cm)
distance=(end_time-start_time)*0.034/2;
return distance;
}
```
最后一步是在无限循环内定期调用上述方法并将获得的结果经由串行通信发送出去供外部程序解析显示出来:
```c
while (1){
char buffer[20];
sprintf(buffer,"Distance:%.2f cm\r\n",get_distance_cm());
HAL_UART_Transmit(&huart1,(uint8_t*)buffer,strlen(buffer),HAL_MAX_DELAY);
HAL_Delay(1000); // 延迟一秒再重复执行下一轮检测过程
}
```
这样便可以在 PC 上运行合适的终端模拟器应用程序(比如 RealTerm、Putty 或者 SecureCRT),按照之前的约定好相同的波特率和其他选项后就能实时看到来自微控器所报告出来的最新测量数值变化情况了。
阅读全文