当前位置: 首页 > article >正文

STM32F103——超声波模块

一、工程整体功能概述本工程基于STM32F103 标准库使用通用定时器 TIM2做精准计时驱动 HC-SR04 超声波模块实现距离测量连续采集 5 次距离做均值滤波最后通过串口打印输出距离值测量更稳定、精度更高。核心逻辑TIM2 配置为1ms 定时中断配合定时器计数器微秒级读数拼接得到 Echo 高电平总时长利用超声波测距公式换算成实际距离。二、硬件接线说明HC-SR04 Trig → PB11推挽输出HC-SR04 Echo → PB10浮空输入模块 VCC 接 5VGND 共地三、main.c 源码 详细解析#include stm32f10x.h #include main.h #include stdio.h #include led.h #include tim.h #include usart.h // 简易软件毫秒延时 void delay(uint16_t time) { uint16_t i 0; while(time --) { i 12000; while(i --); } } int main() { float length 0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); Base_TIM_Init(); my_usart_init(); HC04_Init(); Get_Length(); while(1) { // 循环读取距离并串口打印 length Get_Length(); printf(%lf\r\n,length); } }代码解析NVIC_PriorityGroupConfig中断分组配置必须放在main最开头整个工程只配置一次规范中断优先级划分。外设初始化顺序LED、TIM2 定时器、串口、超声波引脚依次初始化硬件初始化规范流程。主循环逻辑不用做其他业务循环调用Get_Length()获取距离通过printf串口实时打印。四、tim.c 完整源码 逐行超详细解析#include tim.h #include stm32f10x.h // 记录TIM2中断次数每进一次代表1ms uint16_t mscount 0; // 简易微秒延时 void delay_us(uint32_t us) { us * 8; while(us--); } // 简易毫秒延时 void delay_ms(uint32_t ms) { while(ms--) { delay_us(1000); } } // TIM2 初始化配置为1ms更新中断 void Base_TIM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeInitStruct; NVIC_InitTypeDef NVIC_InitStruct; // 1. 开启APB1总线TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 2. 定时器基础参数配置 TIM_TimeInitStruct.TIM_ClockDivision TIM_CKD_DIV1; // 不分频 TIM_TimeInitStruct.TIM_CounterMode TIM_CounterMode_Up; // 向上计数 TIM_TimeInitStruct.TIM_Period 1000-1; // 自动重装载值 TIM_TimeInitStruct.TIM_Prescaler 72-1; // 预分频器 TIM_TimeInitStruct.TIM_RepetitionCounter 0; // 通用定时器固定填0 // 3. 初始化TIM2、开启更新中断、默认先关闭定时器 TIM_TimeBaseInit(TIM2, TIM_TimeInitStruct); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, DISABLE); // 4. NVIC中断优先级配置 NVIC_InitStruct.NVIC_IRQChannel TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority 0; NVIC_Init(NVIC_InitStruct); } // HC-SR04 引脚初始化 void HC04_Init() { GPIO_InitTypeDef GPIO_InitStruction; // 开启GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Trig PB11 推挽输出 GPIO_InitStruction.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruction.GPIO_Pin GPIO_Pin_11; GPIO_InitStruction.GPIO_Speed GPIO_Speed_10MHz; GPIO_Init(GPIOB, GPIO_InitStruction); // Echo PB10 浮空输入 GPIO_InitStruction.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_InitStruction.GPIO_Pin GPIO_Pin_10; GPIO_Init(GPIOB, GPIO_InitStruction); } // 开启定时器清零计数器与中断计数 void Open_TIM(void) { TIM_SetCounter(TIM2, 0); mscount 0; TIM_Cmd(TIM2, ENABLE); } // 关闭定时器 void Close_TIM(void) { TIM_Cmd(TIM2, DISABLE); } // TIM2中断服务函数 1ms进一次 void TIM2_IRQHandler(void) { if( TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET ) { mscount; // 清除中断标志位必须写 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } // 获取Echo高电平总微秒时间 int Get_Echo_Time(void) { uint16_t t 0; // 毫秒数转微秒 当前计数器微秒值 t mscount * 1000; t TIM_GetCounter(TIM2); TIM2-CNT 0; delay_ms(50); return t; } // 采集5次距离取平均值提高稳定性 float Get_Length(void) { uint16_t t 0; float length 0; float sum 0; int i 0; while(i ! 5) { // 给Trig发送20us高电平触发信号 GPIO_SetBits(GPIOB, GPIO_Pin_11); delay_us(20); GPIO_ResetBits(GPIOB, GPIO_Pin_11); // 等待Echo拉高 while( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) 0); Open_TIM(); i; // 等待Echo拉低 while( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) 1); Close_TIM(); // 读取总高电平时间 t Get_Echo_Time(); // 超声波测距公式距离(cm) 高电平时间(us) / 58 length ((float)t / 58.0); sum sum length; } // 5次均值滤波 length sum / 5.0; return length; }五、tim.h 头文件#ifndef TIM_H_ #define TIM_H_ void Base_TIM_Init(void); void HC04_Init(void); void Open_TIM(void); void Close_TIM(void); int Get_Echo_Time(void); float Get_Length(void); #endif作用对外声明定时器、超声波相关函数供 main.c 等外部文件调用。六、定时器定时原理与时间计算1. 定时器时钟STM32F103 主频 72MHzTIM2 挂载在 APB1 总线定时器时钟为 72MHz。2. 配置参数预分频72-1自动重装载1000-13. 计算公式定时周期分频重装载定时器时钟频率T7200000072×1000​0.001s1ms结论TIM2 每 1ms 触发一次更新中断。4. 计时思路全局变量mscount记录中断次数代表毫秒TIM_GetCounter(TIM2)读取当前计数器值代表微秒两者拼接得到高精度微秒级总时长七、HC-SR04 工作原理主控给Trig 引脚发送20us 高电平触发脉冲模块自动发射 8 路 40KHz 超声波遇到障碍物反射模块Echo 引脚拉高主控检测 Echo 高电平时长用公式换算距离距离高电平时间八、整体程序运行流程上电先配置中断分组依次初始化 LED、TIM2、串口、超声波引脚进入死循环反复调用Get_Length()单次测量发触发信号 → 等 Echo 拉高 → 开定时器 → 等 Echo 拉低 → 关定时器计算高电平总微秒时间换算成距离连续测 5 次取平均值串口打印输出循环往复实时测距。九、代码优点与可移植性定时器配置标准规范可直接移植到 TIM3/TIM4采用1ms 中断 计数器微秒读数计时精度高5 次均值滤波解决超声波测距跳变、数据不稳定问题分层清晰定时器底层、超声波驱动、业务应用完全分离标准库写法兼容所有 STM32F103 系列单片机自带软件微秒 / 毫秒延时无需依赖其他延时函数。

相关文章:

STM32F103——超声波模块

一、工程整体功能概述本工程基于 STM32F103 标准库,使用通用定时器 TIM2 做精准计时,驱动 HC-SR04 超声波模块,实现距离测量;连续采集 5 次距离做均值滤波,最后通过串口打印输出距离值,测量更稳定、精度更高…...

嵌入式开发依赖管理革命:Zephyr专用包管理器OpenManager详解

1. 项目概述:一个面向嵌入式开发的现代包管理器在嵌入式开发领域,尤其是基于Zephyr RTOS的项目中,依赖管理一直是个让人头疼的问题。如果你也经历过手动下载、拷贝、版本冲突、路径配置这些繁琐的步骤,那么你一定能理解为什么我们…...

如何防范模型安全威胁:对抗性攻击与防御机制终极指南

如何防范模型安全威胁:对抗性攻击与防御机制终极指南 【免费下载链接】h4cker This repository is maintained by Omar Santos (santosomar) and includes thousands of resources related to ethical hacking, bug bounties, digital forensics and incident respo…...

可解释AI:揭秘模型决策的透明度与可信度终极指南

可解释AI:揭秘模型决策的透明度与可信度终极指南 【免费下载链接】leetcode LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。) 项目地址: https://gitcode.com/gh_mirrors/le/leetcode …...

告别封号!用Python的curl_cffi库稳定调用Claude API(附完整代码)

Python实战:用curl_cffi构建高稳定性的Claude API调用方案 每次调用Claude API时最让人头疼的莫过于账号突然被封——明明代码逻辑没问题,参数也正确,但系统就是判定你在用自动化工具。这种问题往往源于一个容易被忽视的技术细节:…...

Electron-React-Boilerplate与Create React App对比:桌面应用开发终极指南

Electron-React-Boilerplate与Create React App对比:桌面应用开发终极指南 【免费下载链接】electron-react-boilerplate A Foundation for Scalable Cross-Platform Apps 项目地址: https://gitcode.com/gh_mirrors/el/electron-react-boilerplate Electron…...

别再只盯着TCP了!用Wireshark抓包实战,带你拆解UDP报文里的校验和到底怎么算(附避坑指南)

别再只盯着TCP了!用Wireshark抓包实战拆解UDP校验和计算 在大多数网络教材和培训课程中,TCP总是占据着中心舞台,而UDP则常常被简单带过。但作为网络工程师,我们每天实际处理的DNS查询、视频流传输、在线游戏数据包等,U…...

从SGD到Nadam:一张图看懂深度学习优化算法的“进化史”与选型指南

从SGD到Nadam:深度学习优化算法的演进逻辑与实战选型 深度学习模型的训练效果很大程度上取决于优化算法的选择。就像赛车手需要根据赛道特性调整驾驶策略一样,开发者也需要针对不同任务特点选择合适的优化器。本文将带您穿越优化算法的发展历程&#xff…...

75.YOLOv5/v8 COCO128数据集配置,yaml文件直接用,训练不报错

摘要 YOLO(You Only Look Once)系列算法是目标检测领域最具代表性的单阶段检测框架,以其端到端的推理速度和精度平衡著称。 本文从YOLOv5/v8的工程化视角出发,系统梳理目标检测的核心原理,并提供一套完整可运行的代码案例,涵盖数据准备、模型训练、推理评估与部署优化全…...

全链路压测标记透传落地实战:数据上下文设计与Sleuth Baggage的完整改造方案

一、方案设计:两层机制解决两个问题 在 Spring Cloud 微服务项目中落地标记透传,需要同时解决跨线程和跨服务两个问题,对应两套机制:跨线程:引入数据上下文(AppContext)对象,底层使用…...

Arm CoreSight MTB-M33调试架构与安全配置详解

1. Arm CoreSight MTB-M33调试架构解析在嵌入式系统开发中,实时跟踪程序执行流是调试复杂问题的关键手段。Arm CoreSight MTB-M33(Micro Trace Buffer)作为Cortex-M33处理器的专用调试组件,通过硬件级指令跟踪机制,为开…...

基于角色扮演的AI社交媒体内容生成器:从原理到工程实践

1. 项目概述:一个能“说话”的社交媒体内容生成器最近在折腾一个挺有意思的开源项目,叫peoples-post-generator。乍一看这个仓库名,你可能会觉得它又是一个平平无奇的“AI生成器”。但上手之后我发现,它的设计理念和实现方式&…...

告别格雷科技天书:GTNH汉化包让你3分钟畅玩中文版科技魔法世界

告别格雷科技天书:GTNH汉化包让你3分钟畅玩中文版科技魔法世界 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH 还记得第一次打开GTNH整合包时的绝望吗?😱 …...

AI驱动的双因素认证:从传统2FA到智能行为验证的技术演进

1. 项目概述:当AI成为你的第二道安全防线最近在琢磨身份验证安全这事儿,发现一个挺有意思的项目叫ai2fa。光看名字,你可能会联想到“AI”和“2FA”(双因素认证)的结合。没错,它的核心思路就是用人工智能模型…...

基于BeagleBone Black与RTL-SDR构建低成本GPS驯服时钟系统

1. 项目概述:当软件无线电遇上精准授时最近在折腾一个挺有意思的开源项目,叫jks-prv/Beagle_SDR_GPS。光看名字,你可能觉得它就是个普通的软件定义无线电(SDR)项目,但它的核心玩法远不止于此。简单来说&…...

自制机器学习:掌握Sigmoid激活函数的核心原理与实战应用指南

自制机器学习:掌握Sigmoid激活函数的核心原理与实战应用指南 【免费下载链接】homemade-machine-learning 🤖 Python examples of popular machine learning algorithms with interactive Jupyter demos and math being explained 项目地址: https://g…...

电气考研复试现场实录:从电机学到项目经验,我是如何用‘STAR法则’让面试官频频点头的

电气考研复试实战指南:如何用STAR法则打造令人印象深刻的专业表达 站在复试面试教室门外,我能清晰听见自己加速的心跳声。过去三个月里,我反复练习如何将电机学原理与电力电子项目经验转化为有逻辑的叙述,但此刻大脑却一片空白。直…...

为什么你的Windows电脑越用越慢?3个简单步骤让Mem Reduct帮你解决内存管理难题

为什么你的Windows电脑越用越慢?3个简单步骤让Mem Reduct帮你解决内存管理难题 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirro…...

多模态大语言模型在视频时空定位中的零样本应用

1. 项目背景与核心价值最近在视频理解领域出现了一个很有意思的技术方向——如何让AI模型不经过任何训练样本就能准确定位视频中特定语义内容的时间和空间位置。这就像给机器装上了"火眼金睛",让它能自动在长达数小时的监控视频里找到"穿红色衣服的人…...

分饭机生产厂家突围:下沉渠道布局策略深度解析

分饭机生产厂家下沉渠道布局策略FAQ:县域市场突围指南"下沉市场不是价格战,而是价值战——分饭机生产厂家要在县域餐饮场景突围,得靠‘产品适配服务下沉渠道深耕’三维策略。"当前,越来越多的分饭机生产厂家将目光投向县…...

终极Wireshark网络嗅探工具:如何在Docker容器中快速构建完整代码质量分析环境

终极Wireshark网络嗅探工具:如何在Docker容器中快速构建完整代码质量分析环境 【免费下载链接】wireshark Read-only mirror of Wiresharks Git repository at https://gitlab.com/wireshark/wireshark. Youre welcome to submit pull requests there. 项目地址: …...

Wireshark自动化测试终极指南:如何实现Google Chat通知集成

Wireshark自动化测试终极指南:如何实现Google Chat通知集成 【免费下载链接】wireshark Read-only mirror of Wiresharks Git repository at https://gitlab.com/wireshark/wireshark. Youre welcome to submit pull requests there. 项目地址: https://gitcode.c…...

如何在CodeCombat编程竞赛中快速提升学习动力:终极指南

如何在CodeCombat编程竞赛中快速提升学习动力:终极指南 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat CodeCombat是一款通过游戏化方式教授编程的平台,玩家可以通过编写代…...

终极指南:CookieCutter缓存机制如何实现项目模板重复生成的极速加速

终极指南:CookieCutter缓存机制如何实现项目模板重复生成的极速加速 【免费下载链接】cookiecutter A cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects. 项目地址…...

PackForge:声明式打包工作流引擎,重塑软件交付工程实践

1. 项目概述:从“打包”到“锻造”的工程哲学在软件开发的日常中,我们常常会陷入一种“打包困境”。你精心构建了一个功能完备的库或应用,但当需要将其交付给他人使用、部署到不同环境,或者集成到更庞大的系统中时,一系…...

后台系统的权限设计:RBAC模型在前端的终极实现指南

后台系统的权限设计:RBAC模型在前端的终极实现指南 【免费下载链接】vue-element-admin :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 项目地址: https://gitcode.com/gh_mirrors/vu/vue-element-admin 在现代Web应用开发中&…...

WebOperator:基于动作感知树搜索的Web自动化技术解析

1. 项目概述WebOperator是一种基于动作感知树搜索的Web自主代理技术,它能够模拟人类操作网页的行为,实现自动化任务执行。这个技术最吸引我的地方在于它突破了传统爬虫和RPA工具的局限性——不需要预先编写完整的操作脚本,而是通过智能决策实…...

终极NW.js测试自动化指南:从零搭建Jest与Mocha测试框架

终极NW.js测试自动化指南:从零搭建Jest与Mocha测试框架 【免费下载链接】nw.js Call all Node.js modules directly from DOM/WebWorker and enable a new way of writing applications with all Web technologies. 项目地址: https://gitcode.com/gh_mirrors/nw/…...

STTS方法:动态令牌评分优化视频理解计算效率

1. 项目背景与核心价值 在视频理解领域,视觉语言模型(VLMs)正面临一个关键瓶颈:处理长视频时计算复杂度呈指数级增长。传统方法通常对视频帧进行均匀采样或简单分块,导致大量冗余计算和关键时序信息丢失。STTS&#xf…...

如何使用Vundle.vim管理Vim插件:简单高效的终极指南

如何使用Vundle.vim管理Vim插件:简单高效的终极指南 【免费下载链接】Vundle.vim Vundle, the plug-in manager for Vim 项目地址: https://gitcode.com/gh_mirrors/vu/Vundle.vim Vundle.vim是一款专为Vim打造的插件管理器,它能帮助用户轻松管理…...