STM32 智能垃圾桶项目笔记(一):超声波模块(HC-SR04)原理与驱动实现 - 教程

news/2025/9/30 22:35:41/文章来源:https://www.cnblogs.com/slgkaifa/p/19121859

STM32 智能垃圾桶项目笔记(一):超声波模块(HC-SR04)原理与驱动实现 - 教程

本系列笔记是笔者学习 B 站 up 主 “技术探索者” STM32 系列视频所作的记录,有不明白的地方推荐观看视频

目录

一、前言

本系列笔记将记录笔者运用 STM32 知识完成 “智能垃圾桶” 入门级项目的全过程。若想跟做该项目,需提前准备以下耗材:

二、超声波模块(HC-SR04)原理

2.1 模块引脚与核心特性

HC-SR04 超声波模块共引出 4 个引脚,功能与接线要求如下:

引脚功能描述接线建议
VCC电源正极接 5V(模块工作电压为 5V)
Trig触发信号输入(外部控制)接 STM32 普通 GPIO 输出引脚
Echo回响信号输出(反馈距离)接 STM32 带中断的 GPIO 引脚
GND电源负极接 STM32 GND(需共地)

模块核心特性(无需深入研究参数细节,重点关注以下 3 点):

2.2 工作原理与测距逻辑

HC-SR04 的工作流程由 “触发信号” 启动,通过 “回响信号” 反馈距离,具体步骤如下:

  1. 触发测距:STM32 向 Trig 引脚输出至少 10μs 的高电平信号(需高精度延时,笔者在定时器笔记中已实现,可回顾);
  2. 模块自动发送 / 接收超声波:Trig 接收到触发信号后,模块会自动发送 8 个 40kHz 的方波,同时开始检测是否有超声波反射回来;
  3. 回响信号反馈:若超声波反射回来,模块会通过 Echo 引脚输出高电平 —— 高电平的持续时间 = 超声波从 “发射到返回” 的总时间;
  4. 距离计算:根据 “时间 - 距离” 公式推导,最终距离 = (Echo 高电平持续时间 × 声速) / 2
    (注:声速取 340m/s,除以 2 是因为超声波需 “发射→反射→返回”,走了两倍距离)。

2.3 时序图与中断触发方案

超声波模块的 Echo 引脚电平变化时序图如下:
请添加图片描述

从时序图可观察到:

  1. 上升沿触发中断:记录当前时间 t1(开启定时器计数);
  2. 下降沿触发中断:记录当前时间 t2(停止定时器计数);
  3. 计算时间差 t = t2 - t1,代入距离公式即可得到测量结果。

三、CubeMX 工程配置

笔者使用的是 STM32F103C8T6 最小系统板,以下配置步骤均基于该芯片,按步骤操作即可完成基础工程搭建。

3.1 基础配置(芯片 / 时钟 / Debug)

  1. 芯片选择:打开 CubeMX,搜索并选择 STM32F103C8T6,如下图:
    请添加图片描述

  2. Debug 配置:进入 System Core → SYS,Debug 选择 Serial Wire(SWD 调试模式,常用且稳定);

  3. 时钟配置

  4. 工程生成配置

3.2 TIM3 配置(1μs 高精度延时)

超声波触发需要 10μs 高电平,需用 TIM3 实现 1μs 级延时,配置步骤如下:

  1. 进入 Timers → TIM3,模式选择 Internal Clock(内部时钟);
  2. 使能中断:勾选 NVIC Settings → TIM3 global interrupt(后续延时函数无需中断,但需开启定时器计数);
  3. 参数计算与配置
    • 预分频系数(Prescaler):72 - 1(72MHz 时钟 / 72 = 1MHz,即 1 次计数 = 1μs);
    • 自动重载值(Counter Period):65535(16 位定时器最大计数,避免频繁溢出);
  4. 配置如下图:
    请添加图片描述

3.3 引脚与中断配置(Trig/Echo)

笔者选择的引脚:Trig→PA9(输出)、Echo→PA8(中断输入),配置如下:

  1. Trig 引脚(PA9)

  2. Echo 引脚(PA8)

  3. 使能 Echo 中断

3.4 串口配置(数据传输与验证)

需通过串口输出测量结果,配置 USART1 如下:

  1. 进入 Connectivity → USART1,模式选择 Asynchronous(异步通信);

  2. 基本参数:波特率 115200,数据位 8,停止位 1,校验位 None

  3. 使能串口中断:勾选 NVIC Settings → USART1 global interrupt(可选,本次仅用发送,不强制);

  4. 配置如下图:
    请添加图片描述

  5. 硬件接线:STM32 的 PB6(USART1_TX)接 TTL-USB 转换器的 RX,PB7(USART1_RX)接转换器的 TX,转换器与开发板共地。

四、核心代码实现

生成工程后,新建 driver 文件夹,创建 driver_sr04.cdriver_sr04.h(驱动文件),并将 driver 文件夹添加到 Keil 工程路径(Options for Target → C/C++ → Include Paths)。

4.1 1μs 延时函数(基于 TIM3)

该函数与之前定时器笔记的实现略有不同,通过 “设置计数起始值” 实现精准延时,代码如下:

#include "driver_sr04.h"
#include "stm32f1xx_hal.h"
// 声明 TIM3 句柄(CubeMX 自动生成在 tim.c 中)
extern TIM_HandleTypeDef htim3;
/**
* @brief  1μs 级高精度延时函数
* @param  us:目标延时时间(单位:μs,最大 65530μs,避免溢出)
* @retval 无
*/
void Delay_us(uint16_t us)
{
uint16_t differ = 0xffff - us - 5;  // 计算计数起始值(-5 为代码执行补偿)
__HAL_TIM_SET_COUNTER(&htim3, differ);  // 设置 TIM3 计数起始值
HAL_TIM_Base_Start(&htim3);  // 启动 TIM3 计数
// 等待计数到接近 0xffff(避免溢出)
while(differ < 0xffff - 5)
{
differ = __HAL_TIM_GET_COUNTER(&htim3);  // 实时读取计数值
}
HAL_TIM_Base_Stop(&htim3);  // 停止 TIM3 计数
}

逻辑说明

  • 定时器从 differ 向上计数到 0xffff,计数次数 = 0xffff - differ ≈ us(补偿值 -5 抵消函数调用耗时);
  • 1MHz 时钟下,1 次计数 = 1μs,因此总延时 ≈ 目标 us 值。

4.2 串口重定向(printf 输出)

需实现 fputc 函数,让 printf 通过 USART1 输出,代码添加在 usart.c 中:

#include <stdio.h>  // 包含 printf 所需头文件// 声明 USART1 句柄UART_HandleTypeDef huart1;/*** @brief  串口重定向函数,printf 输出到 USART1* @param  ch:要输出的字符* @param  f:文件指针(标准输出,无需关注)* @retval 输出的字符*/int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 1000);  // 发送 1 个字符,超时 1000msreturn ch;}

Keil 配置

  • 打开工程 Options for Target → Target,勾选 Use MicroLIB(启用微库,支持 printf);
  • 进入 Debug → Settings → Flash Download,勾选 Reset and Run(下载后自动运行)。

4.3 超声波驱动函数(触发 / 中断回调)

4.3.1 触发函数(SR04_Trigger)

向 Trig 引脚输出 10μs 高电平,启动模块测距:

/**
* @brief  超声波模块触发函数(启动测距)
* @param  无
* @retval 无
*/
void SR04_Trigger(void)
{
Trig_ON;    // PA9 拉高(触发开始)
Delay_us(10);  // 保持 10μs 高电平
Trig_OFF;   // PA9 拉低(触发结束)
}
4.3.2 中断回调函数(捕获 Echo 电平)

需额外配置 TIM4(用于计数 Echo 高电平时间),步骤如下:

  1. CubeMX 中配置 TIM4:Internal Clock,预分频 72-1,自动重载 65535,无需使能中断;
  2. driver_sr04.c 中实现 GPIO 中断回调,捕获 Echo 上升沿 / 下降沿:
// 声明 TIM4 句柄(CubeMX 自动生成)
extern TIM_HandleTypeDef htim4;
uint32_t distance_cm = 0;  // 测量距离(单位:cm)
/**
* @brief  GPIO 中断回调函数(处理 Echo 引脚电平变化)
* @param  GPIO_Pin:触发中断的引脚
* @retval 无
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static uint32_t count = 0;  // 定时器计数值(暂存)
if(GPIO_Pin == GPIO_PIN_8)  // 确认是 Echo 引脚(PA8)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 1)  // Echo 上升沿(开始返回)
{
HAL_TIM_Base_Start(&htim4);  // 启动 TIM4 计数
__HAL_TIM_SetCounter(&htim4, 0);  // 清零计数值
}
else  // Echo 下降沿(返回结束)
{
HAL_TIM_Base_Stop(&htim4);  // 停止 TIM4 计数
count = __HAL_TIM_GetCounter(&htim4);  // 读取计数值(1 计数 = 1μs)
// 距离计算:count(μs) × 340(m/s) / 2 → 转换为 cm
distance_cm = count * 340 / 2 * 0.000001 * 100;
count = 0;  // 清零计数值,准备下次测量
}
}
}

4.4 驱动头文件(driver_sr04.h)

声明函数与宏定义,供外部调用:

#ifndef __DRIVER_SR04_H
#define __DRIVER_SR04_H
#include "main.h"
#include <stdio.h>// 宏定义:Trig 引脚(PA9)电平控制#define Trig_ON    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET)#define Trig_OFF   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET)// 函数声明void Delay_us(uint16_t us);        // 1μs 延时函数void SR04_Trigger(void);           // 超声波触发函数// 外部变量声明(可选,供 main.c 读取距离)extern uint32_t distance_cm;#endif

五、总结与预告

本次笔记完成了超声波模块(HC-SR04)的核心开发:

  1. 理解了模块的 “触发→测距→反馈” 工作流程,以及基于双边沿中断的时间捕获方案;
  2. 完成 CubeMX 配置(基础时钟、TIM3/TIM4 定时器、引脚中断、串口);
  3. 实现了 1μs 延时、触发函数、中断回调函数,为后续距离测量做好准备。
    下一篇笔记将结合本次驱动文件,实现完整逻辑。请关注 Hello_Embed,我们一起逐步完成智能垃圾桶项目!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio 编辑器的使用 - 实践

DevEco Studio 编辑器的使用 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

docker安装MySQL8.0.25的坑

一、搜索拉取镜像 docker search mysql docker pull mysql #不写版本号 默认拉取最新版本 docker pull mysql:8.0.25 #写版本号,则拉取确定的版本二、查看镜像 docker images三、启动镜像 docker run -d --name mysql…

Powershell维护系统管理任务(五)

Powershell维护系统管理任务目录维护系统管理任务管理 AD 域服务管理组和组成员身份管理组创建新组管理组成员身份管理计算机帐户新建计算机帐户修复计算机账户的信任关系账户与设备管理cmdlet的区别管理组织单位和 AD…

百度的网站名山东省建设项目监理协会网站

前言&#xff1a; pad 是每个 element实例 都有的&#xff0c;是 elemenet 之间沟通的代理人&#xff0c;没有 pad 的 element 没法于其他element交流。 考虑到gstreamer存在继承体系&#xff0c;那么如果继承类element不在init函数里创建pad&#xff0c;那么在gst_element_l…

软件测试工程师面试刷题:简单JAVA算法题以及解法

软件测试工程师面试刷题:简单JAVA算法题以及解法找不同给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。示例 1: 输入:s =…

济南专业的设计网站免费网站建设 百度收录

NVIDIA Corporation 在 GitHub 的官方主页 References https://github.com/NVIDIA References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

蚌埠做网站有哪些公司买个域名

本文主要向大家详细介绍了jQuery的绑定事件和移除事件的使用方法和示例分享&#xff0c;这里推荐给有需要的小伙伴们参考下。有时候事件执行完了&#xff0c;想取消事件的效果可以通过一定的办法来处理。比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移…

巩义网站建设价格天津滨海新区落户政策

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;RodmaChen PostgreSQL--实现数据库备份恢复详细教学 一. 数据库备份二. 数据库恢复三. 存留问题 数据库备份恢复功能是每个产品所需的&#xff0c;以下是简单的脚本案例&a…

实用指南:React基础到进阶

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何做营销型手机网站优化做网站招聘的职业顾问

关于DRL的WTI模块&#xff1a; Weighted Token-wise Interaction&#xff1a; 直觉上&#xff0c;并非所有的单词和视频帧都同等重要。我们提供一种自适应方法&#xff0c;来调整每个标记的权重大小&#xff1a; 注&#xff1a;其中两个f函数都是MLP和softmax构成。 WTI的算…

九龙坡网站建设哪家好宝塔 wordpress 教程

在使用M1 在安装cocopods 前时&#xff0c;安装 rvm install 3.0.0遇到 rvm install 3.0.0 Error running __rvm_make -j8 备注: 该图片是借用其他博客图片&#xff0c;因为我的环境解决完没有保留之前错误信息。 解决方法如下&#xff1a; 1. brew uninstall --ignore-depe…

网站上内容列表怎么做的网站开发为什么要用框架

概述分享下最近做的一个mysql大表归档方案&#xff0c;仅供参考。整体思路一、明确哪些大表需做归档1、数据库表概要信息统计SELECTt1.table_schema,t1.table_name,ENGINE,table_rows,CAST( data_length / 1024.0 / 1024.0 AS DECIMAL ( 10, 2 ) ) data_size(M),CAST( index_le…

bat批处理设置临时PATH路径不能访问

前言全局说明一、说明 1.1 环境: Windows 7 旗舰版二、通常设置路径方法 set adb_PATH=d:\adb_dir set PATH=%PATH%;%adb_PATH%直接在命令行里这么写没问题 在bat脚本中,会提示找不到路径下命令三、解决方法 使用环境…

电子商务网站开发工具网站营销外包公司简介

来源&#xff1a;博客丨政策管理作者&#xff1a;贺飞&#xff08;北京大学&#xff09;摘要&#xff1a;量子计算&#xff1a;前途光明 道路曲折量子计算&#xff1a;前途光明 道路曲折&#xff08;一&#xff09;本周&#xff0c;美国国家科学院、工程院和医学院的一个由13…

2025-2026-1 20231301 《信息安全设计》第九周学习总结

View Post2025-2026-1 20231301 《信息安全设计》第九周学习总结2025-2026-1 20231301 《信息安全设计》第九周学习总结 目录作业信息学习内容总结1. 进程的本质2. 系统调用层次结构3. 进程创建与执行完整流程exec() 函…

手机网站锁定竖屏看代码建设部网站水利设计资质

合作官宣 TopOn 正式成为亚太地区首家支持自动创建Admob bidding广告源的聚合平台。目前&#xff0c;在TopOn后台添加Admob广告平台&#xff0c;您只需要重新授权Google账号&#xff0c;即可开通自动创建功能。此前&#xff0c;TopOn 已在24年2月6日官方聚合支持Google biddin…

10. Spring AI + RAG - Rainbow

10. Spring AI + RAG @目录10. Spring AI + RAGRAG概念向量:文本向量化向量数据库匹配检索SearchRequest接入ChatClientRetrievalAugmentationAdvisor最后: RAG 检索增强生成(Retrieval-augmented Generation) 对…

《AI智能体实战研发教程(从0到企业级项目落地)》全网上线|CSDN B站同步首发

《AI智能体实战研发教程(从0到企业级项目落地)》全网上线|CSDN & B站同步首发pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

网站更改备案信息在哪好网站开发

Hive常用函数_20个字符串处理 以下是Hive中常用的字符串处理函数&#xff0c;可用于执行各种字符串处理转换操作。 1. CONCAT()&#xff1a;将多个字符串连接在一起。 SELECT CONCAT(Hello, World); -- Output: HelloWorld2. SUBSTR()&#xff1a;从字符串中提取子字符串&…