STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南

news/2025/10/1 12:38:22/文章来源:https://www.cnblogs.com/tlnshuju/p/19122350

STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南

2025-10-01 12:35  tlnshuju  阅读(0)  评论(0)    收藏  举报

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

目录

一、前言

上一篇笔记我们完成了超声波模块(HC-SR04)的底层驱动开发,包括 1μs 延时函数Trig 触发函数Echo 中断回调函数。本次笔记的核心是 基于已有驱动实现 “实时测距” 功能—— 通过定时发送触发信号,让模块持续测距,并在串口打印测量结果。

二、超声波测距功能实现(基于已有驱动)

要实现 “实时测距”,核心需解决两个问题:如何定时发送触发信号(避免阻塞)如何在测距完成后输出结果。下面分步骤拆解实现逻辑。

2.1 定时触发方案选择:为何不用 HAL_Delay?

上一篇已实现 SR04_Trigger() 触发函数,要让模块持续测距,需定期调用该函数。常见的定时方案有两种:HAL_Delay() 阻塞延时 和 HAL_GetTick() 非阻塞定时,二者差异如下:

方案原理优点缺点适用场景
HAL_Delay()基于 SysTick 中断,阻塞当前程序直到延时结束用法简单,无需额外变量阻塞主循环,影响其他任务(如后续蓝牙数据处理)简单单任务、无实时性要求
HAL_GetTick()读取 SysTick 累计的毫秒数(uwTick 变量),通过时间差判断定时是否结束非阻塞,不影响主循环其他逻辑需额外变量记录上次触发时间,需处理 uwTick 溢出多任务、实时性要求高的场景

选择 HAL_GetTick () 的核心原因
智能垃圾桶后续需添加蓝牙通信、电机开盖等功能,若用 HAL_Delay(50) 阻塞 50ms,会导致蓝牙数据接收、电机控制响应延迟。而 HAL_GetTick() 仅通过时间差判断,主循环可同时处理其他逻辑,兼顾 “实时测距” 与 “功能扩展性”。

补充:HAL_GetTick() 本质是 SysTick 定时器每 1ms 触发一次中断,累计全局变量 uwTick,函数本身仅读取该变量(无阻塞),因此安全性和效率更高。

2.2 50ms 定时触发逻辑实现

2.2.1 核心思路
  • 定义变量 SR04_tick 记录上次触发的毫秒数(初始化为 0);
  • 主循环中持续判断:当前毫秒数(HAL_GetTick())与 SR04_tick 的差值是否大于 50ms;
  • 若满足条件,更新 SR04_tick 为当前毫秒数,并调用 SR04_Trigger() 发送触发信号。
2.2.2 代码实现(main.c 中)

首先需在 main.c 顶部定义全局变量(或静态变量),确保 SR04_tick 不会被主循环重置:

// 全局变量:记录超声波上次触发的毫秒数(初始化为0)
uint32_t SR04_tick = 0;
int main(void)
{
while (1)
{
// 50ms 定时触发超声波测距
if (HAL_GetTick() - SR04_tick > 50)  // 时间差 >50ms,触发一次测距
{
SR04_tick = HAL_GetTick();       // 更新上次触发时间,避免重复触发
SR04_Trigger();                  // 发送 10μs 触发信号,启动测距
}
}
}
2.2.3 关键细节说明
  • 为何选择 50ms 间隔:HC-SR04 模块的最小测距周期约为 20ms(需等待前一次回声信号完全结束),50ms 间隔既能保证 “实时性”(每秒更新 20 次距离),又能避免 “前次回声未结束,下次触发导致数据紊乱”。
  • uwTick 溢出处理HAL_GetTick() 的 uwTick 是 32 位变量,最大值为 4294967295ms(约 49.7 天),溢出后会自动归零。若项目需长期运行,可添加溢出判断(如 if (HAL_GetTick() < SR04_tick) 则认为溢出,直接更新 SR04_tick),代码如下:
if ((HAL_GetTick() - SR04_tick > 50) || (HAL_GetTick() < SR04_tick))
{
SR04_tick = HAL_GetTick();
SR04_Trigger();
}

2.3 中断回调函数优化:添加距离计算与打印

上一篇的中断回调函数仅完成距离计算,本次需在 “测距完成后”(Echo 下降沿)打印距离,方便通过串口观察结果。

2.3.1 优化后的中断回调函数(driver_sr04.c 中)
// 全局变量:存储测量距离(单位:cm),供外部读取(如蓝牙发送)
uint32_t distance_cm = 0;
/**
* @brief  GPIO 中断回调函数(处理 Echo 引脚电平变化)
* @param  GPIO_Pin:触发中断的引脚(此处为 PA8)
* @retval 无
* @note   上升沿:启动 TIM4 计数;下降沿:停止计数、计算距离、打印结果
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static uint32_t count = 0;  // 静态变量:暂存 TIM4 计数值(避免每次重置)
// 仅处理 Echo 引脚(PA8)的中断
if (GPIO_Pin == GPIO_PIN_8)
{
// 1. Echo 上升沿:超声波开始返回,启动 TIM4 计数
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == GPIO_PIN_SET)
{
HAL_TIM_Base_Start(&htim4);        // 启动 TIM4(1μs 计数)
__HAL_TIM_SET_COUNTER(&htim4, 0);  // 清零计数值,确保计时准确
}
// 2. Echo 下降沿:超声波返回结束,计算距离并打印
else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == GPIO_PIN_RESET)
{
HAL_TIM_Base_Stop(&htim4);         // 停止 TIM4 计数
count = __HAL_TIM_GetCounter(&htim4);  // 读取总计时(单位:μs)
// 距离计算:count(μs) × 声速(340m/s) / 2(往返距离) → 转换为 cm
distance_cm = count * 340 / 2 * 0.000001 * 100;
count = 0;  // 重置计数值,准备下次测量
// 串口打印距离(格式:distance : XX cm,便于调试工具识别)
printf("distance : %u cm\r\n", distance_cm);
}
}
}
2.3.2 关键细节说明
  • 静态变量 count:用 static 修饰确保每次中断回调时不会重置,避免因变量重新初始化导致的计数错误。
  • 打印格式添加 \r\n:部分串口调试工具(如 SecureCRT、SSCOM)需 \r\n 才能换行,若仅用 \n 可能导致输出错乱,统一添加确保兼容性。
  • 距离计算公式验证count 单位为 μs(10⁻⁶ 秒),声速 340m/s = 34000cm/s,因此公式可简化为:distance_cm = count * 34000 / 2 / 1000000 = count * 0.017,与原公式结果一致,可根据习惯选择简化版。

2.4 预期测试步骤(模块到货后补充)

  • 给 STM32 上电,串口工具每隔 50ms 收到一行数据,如图所示:
    请添加图片描述

  • 用手或物体靠近超声波模块(2cm~400cm 范围内),观察打印的 distance 值是否随距离减小而减小,远离时增大,误差应在 ±0.3cm 内。

三、总结

本次笔记基于上一篇的超声波底层驱动,实现了 “非阻塞定时测距” 与 “串口距离打印”,核心收获包括:

  1. 掌握 HAL_GetTick() 非阻塞定时的原理与应用,理解其相较于 HAL_Delay() 的优势;
  2. 优化中断回调函数,实现 “测距完成即打印”,形成完整的调试链路;
  3. 明确后续测试步骤与问题排查方向,为模块到货后的验证做好准备。

下一篇将开启蓝牙模块的学习,逐步实现 “无线数据传输” 功能,推动智能垃圾桶项目向 “无线控制” 迈进。请关注 Hello_Embed,后续笔记将持续更新!

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

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

相关文章

做电影网站要几G空间的网站开发商业秘密保密协议

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用&#xff0c;各信息化部门和生产单位都逐渐建立起自己的GIS的应用&#xff0c;同时积累了大量的地理数据。随着应用深度和广度的推进&#xff0c;针对数据建立专题应用越来越迫切&#xff0c;对行业专题制图的需…

通过配置 GitLab 自动触发项目自动化构建与部署 - 指南

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

双网卡服务器校园网访问故障排查与解决​ - 教程

双网卡服务器校园网访问故障排查与解决​ - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

黄页网站建设建筑公司网站封面图片

1、下载vscode 官网地址:https://code.visualstudio.com/ 针对ubuntu点击下载deb安装包,默认下载地址如下,下载速度很慢,而且会下载失败,解决方法如下: 将“https://az764295.vo.msecnd.net”改为“https://vscode.cdn.azure.cn”后,下载会很快。 例如,将: https:…

怎么实现网站建设报价方案手机免费在线搭建网站

一页有三栏&#xff1a;主栏、副栏、思考栏。主栏主要是在右上角&#xff0c;主要记录学到的内容。副栏在左边&#xff0c;主要是简单概括重点。思考栏在底部&#xff0c;主要是记录收获、感悟。 主栏&#xff1a;在听讲或阅读时把重要的内容或知识的要点记录在右侧的区域&…

详述网站建设的过程简答题二次元网站开发的意义

SPI相关基础知识 SPI基本概念请自行百度&#xff0c;参考&#xff1a;百度百科SPI简介.我们讲重点和要注意的地方。 master模式下要关注的地方 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连&#xff0c;不交叉&#xff0…

US$9.99 Cheap Galletto 1260 ECU Chip Tuning Interface EOBD Tuning Tools

Galletto 1260 ECU Chip Tuning Interface With Multi LanguagesTop 4 Reasons to Get Galletto 12601. Supported Languages: English, Spanish, French, German, Italian, Portuguese2. EOBD2 Flasher 1260 is an ea…

万网主机怎么上传网站吗网站建设的简历制作

在我之前的文章 “Elasticsearch&#xff1a;对 Java 对象的 ES|QL 查询”&#xff0c;我详细介绍了如何使用 Java 来对 ES|QL 进行查询。对于不是很熟悉 Elasticsearch 的开发者来说&#xff0c;那篇文章里的例子还是不能单独来进行运行。在今天的这篇文章中&#xff0c;我来详…

房产网站模板程序在线oa

内容摘要 我国推动的工业互联网是更加广义的工业互联网&#xff0c;不仅包括设备的联网。其核心是提升我国工业能力和工业水平&#xff0c;是我国制造业转型升级的重要推手和抓手。我们把工业互联网分为六个层级&#xff0c;包括设备层、网络层、平台层、软件层、应用层和安全…

US$9 TF Card 4GB Flash Memory Card Can Work on Ksuite

TF Card 4GB Flash Memory Card Can Work on KsuitePackage List:1pc x 4GB TF Card Pictures of TF Card 4GB Flash Memory Card Can Work on KsuiteTF Card 4GB Flash Memory Card Can Work on Ksuite, now only nee…

详细介绍:MySQL备份策略核心知识点总结

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

新手学网站建设视频教程共30课高清版2狠狠做网站

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …

input() 函数

格式: 变量 = input("提示信息:")用户输入的任何内容,都将被 Python 识别为字符串。

Playwright MCP 的使用与调试技巧

摘要 本文将详细介绍 Playwright MCP 的使用方法、常见问题及解决方案,特别针对中国开发者,尤其是 AI 应用开发者。文章通过实践案例、代码示例、架构图、流程图等多种形式,帮助读者快速掌握 Playwright MCP 的核心…

什么网站建设效果好泰安最新通告今天

文章目录 一.基本介绍二.性能指标三.下载安装JMeter1.下载安装包2.启动JMeter 四.使用JMeter1.模拟用户请求2.填写测试地址3.接收测试结果4.结果解释 一.基本介绍 压力测试考察当前软硬件条件下系统所能承受的最大负荷并找到系统瓶颈所在。压测是为了系统在线上的处理能力和稳定…

网站运行速度慢中铁建设集团有限公司官方网站

摘要 本文使用2024年最新的ELA注意力机制改进YoloV8的Neck层,实现涨点!改进方式简单易用,涨点明显!欢迎大家使用。 大家在订阅专栏后,记着加QQ群啊!有些改进方法确实有难度,大家在改进的过程中遇到问题,我会解答和指导! 论文:《ELA:深度卷积神经网络的高效局部注意…

公司网站开发的工作内容链接买卖价格

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行&#xff0c;并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中&#xff0c;)&#xff0…

自适应网站教程wordpress ie兼容

🏡《总目录》 目录 1,概述2,工作原理2.1,材料特性2.2,温度升高2.3,温度降低2.4,数学模型3,结构特点3.1,磁芯3.2,线圈3.3,骨架3.4,绝缘材料4,工艺流程4.1,材料准

网站开发与维护专员岗位职责单页面seo优化

早晨:准备与启动 6:00 AM - 系统启动 自动化仓储系统在清晨开始启动,操作员检查各项系统和设备的状态,确保所有机器人、传送带和扫描设备都正常运行。仓储管理系统(WMS)加载当天的订单数据,准备开始处理。 6:30 AM - 早班员工到达 早班员工到达仓库,换上工作服和安全装…