STM32超声波模块

一:超声波模块

1:工作原理

采用IO触发测距,给至少10us的高电平信号。
模块自动发送8个40KHz的方波,自动检测是否有信号返回。
·有信号返回,通过IO输出一高电平,高电平持续时间就是超声波从发射到返回的时间声波从发射到返回的时间
· HC-SRO4超声波测距模块提供2cm-400cm的测距功能,精度达3mm。
2.硬件接线
四根杜邦线,VCC连接单片机3.3-5V (推荐5V供电),GND接到板子的GND, Trig 为外部触发信号输入,输入一个10us的高电平即可触发模块测距,Echo即为 回响信号输出,测距结束时此管引脚输出一个低电平,电平宽度反映超声主返时间之和。                                                                      3.控制超声波测距步骤
初始化超声波引脚和定时器时钟·                                                                                                        初始化引脚模式和定时器中断

Tim.c

#include "stm32f10x.h"
#include "Tim.h"uint16_t  mountus;void delay_us(uint32_t us)
{us *=8;while(us--);}void delay_ms(uint32_t ms)
{while(ms--){delay_us(1000);}}void Base_Tim_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;NVIC_InitTypeDef NVIC_Initstruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up ;TIM_TimeBaseInitstruct.TIM_Period=1000-1;TIM_TimeBaseInitstruct.TIM_Prescaler=72-1;TIM_TimeBaseInitstruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitstruct);TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);TIM_Cmd(TIM2, DISABLE);NVIC_Initstruct.NVIC_IRQChannel=TIM2_IRQn ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}void HC04_Init()
{GPIO_InitTypeDef GPIO_Initstruct;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);GPIO_Initstruct.GPIO_Pin= GPIO_Pin_11;GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init( GPIOB, &GPIO_Initstruct);GPIO_Initstruct.GPIO_Pin=GPIO_Pin_10;GPIO_Initstruct.GPIO_Mode=  GPIO_Mode_IPD;GPIO_Init( GPIOB, &GPIO_Initstruct);}void open_Tim()
{mountus=0;TIM_SetCounter( TIM2,0);TIM_Cmd(TIM2, ENABLE);}void close_Tim()
{TIM_Cmd(TIM2, DISABLE);}void TIM2_IRQHandler ()
{if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){mountus++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}}int Get_Echo_Time()
{uint16_t t=0;t=mountus*1000;t=t+TIM_GetCounter(TIM2);TIM_SetCounter( TIM2,0);delay_ms(50);return t;}float Get_Length()
{int i=0;float sum=0;uint16_t t=0;float length=0;while(i<5){	GPIO_SetBits(GPIOB,GPIO_Pin_11);delay_us(20);GPIO_ResetBits(GPIOB,GPIO_Pin_11);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == RESET );open_Tim();i++;while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == SET );close_Tim();t=Get_Echo_Time();length=((float)t/58.0);sum=sum+length;}length=sum/5.0;return length;}

Tim.h

#ifndef _TIM_H_
#define _TIM_H_void Base_Tim_Init(void);
void HC04_Init(void);
float Get_Length(void);#endif

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"
#include "Tim.h"void delay(uint16_t time)//延时1ms  软件延时粗延时
{uint16_t i=0;while(time --){i=12000;while(i --);}}int  main()
{float length=0;LED_Init();Base_Tim_Init();HC04_Init();my_usart_Init();while(1){length = Get_Length();printf("%lf\r\n",length );}}

代码心得

1:

定时器中断工作机制

  1. 定时器配置

    • 在您的代码中,TIM2配置为1MHz计数频率(72MHz主频/72分频)

    • 自动重装载值1000 → 每1ms(1000μs)产生一次更新中断

  • 每1ms触发一次中断,与高电平持续时间无关

  • 中断频率由定时器配置决定,不是由外部信号决定

2

为什么需要延迟?

1:

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
{/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));/* Set the Counter Register value */TIMx->CNT = Counter;
}

实际上这个函数是对一个寄存器进行了赋值,所以我们需要一定的时间去让寄存器赋值,这个就是他的作用,我们这里用了50ms,就是充分让 寄存器赋值 这个步骤可以完成!

在原始代码中:

c

int Get_Echo_Time() {t = mountus*1000 + TIM_GetCounter(TIM2);TIM_SetCounter(TIM2,0);delay_ms(50);  // 关键延迟return t;
}

这个延迟解决了两个问题:

  1. 传感器恢复时间

    • HC-SR04需要50-60ms的恢复周期

    • 连续测量会导致传感器无法响应

  2. 中断冲突预防

    • 重置定时器(TIM_SetCounter(0))和mountus=0操作需要时间

    • 无延迟时,下次测量可能打断重置过程

3总结代码

  1. 定时器中断由定时器硬件触发,与Echo引脚状态无关

  2. mountus记录的是时间流逝(每1ms增加),不是信号事件

  3. 高电平期间定时器持续运行,通过:

    • 中断次数(mountus) → 完整毫秒数

    • 当前计数值 → 亚毫秒时间

  4. 延迟50ms解决了传感器恢复和操作原子性问题

  5. 最佳实践:用中断保护替代延迟,并在主循环中管理传感器时序

1. 基本概念对比

数据类型符号位宽范围头文件
int有符号32位-2,147,483,648 到 2,147,483,647内置
uint16_t无符号16位0 到 65,535#include <stdint.h>
uint32_t无符号32位0 到 4,294,967,295#include <stdint.h>

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

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

相关文章

RK3568项目(十一)--linux驱动开发之mipi屏幕调试

目录 一、引言 二、MIPI DSI 屏幕 ------>2.1、MIPI联盟 ------------>2.1.1、多媒体部分 ------------>2.1.2、硬件协议 ------------>2.1.3、D-PHY功能模式及速率 ------------>2.1.4、分辨率计算 ------>2.2、MIPI-DSI硬件连接 ------>2.3、传…

C语言小游戏——飞机大战

目录 引言 开发环境与工具准备 1. 开发环境配置 2. 资源文件准备 游戏设计与架构 1. 游戏核心数据结构 2. 游戏全局变量 游戏核心功能实现 1. 游戏初始化 2. 游戏主循环 3. 游戏渲染 4. 游戏状态更新 关键游戏机制实现 1. 敌机生成系统 2. 碰撞检测系统 3. 敌机…

SQLite的可视化界面软件的安装

1、如下图所示&#xff0c;DB Browser软件&#xff0c;在压缩包中。2、首先解压到一个文件夹中。例如&#xff08;D:\\DB Browser&#xff09;文件夹。解压后的内容如下图。3、将解压后的DB Browser文件夹&#xff0c;剪切到D:\Program Files\目录中。如下两图。win10操作系统下…

基于 STM32H743VIT6 的边缘 AI 实践:猫咪叫声分类 CNN 网络部署实战(已验证)中一些bug总结

前言前面发了一篇文章基于 STM32H743VIT6 的边缘 AI 实践&#xff1a;猫咪叫声分类 CNN 网络部署实战&#xff08;已验证&#xff09;。这里面有一些我遇到过的bug&#xff0c;当时基本都花了很长的时间才解决。这里将这些bug总结一下方便后续查阅。1.使用cubemx插件解析AI模型…

【机器学习】突破分类瓶颈:用逻辑回归与Softmax回归解锁多分类世界

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Android gradle plugin agp8.6.1发布时间

Android gradle plugin agp8.6.1发布时间 Android Gradle Plugin (AGP) 的版本 8.6.1 是在2023年发布的。具体来说&#xff0c;它是在2023年4月发布的。这个版本的更新包括了多个重要的改进和修复&#xff0c;旨在提升开发者在Android开发过程中的体验和效率。 主要更新包括&am…

闭包的两种设计模式

闭包设计模式 概述 闭包是 JavaScript 中的一个重要概念&#xff0c;它允许内层函数访问外层函数的变量。在实际开发中&#xff0c;闭包经常被用于实现特定的设计模式&#xff0c;主要包括辅助函数模式和工厂模式。 1. 辅助函数模式&#xff08;Helper Function Pattern&#x…

力扣119:杨辉三角Ⅱ

力扣119:杨辉三角Ⅱ题目思路代码题目 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 思路 杨辉三角的规律&#xff1a; 第n行有n1个数&#xff0c;n从0开始每行的第一个数和最后一个数都是1。除了第一行的数其他的数都是由它左上角和右上角的…

@Linux自建证书 Nginx+HTTPS

文章目录Linux自建证书并配置Nginx HTTPS1. 准备工作2. 安装必要的工具3. 自建证书脚本3.1 创建CA根证书&#xff08;可选&#xff0c;用于自签名证书链&#xff09;3.2 创建服务器证书脚本4. 证书文件说明5. 配置Nginx使用HTTPS5.1 创建证书存放目录5.2 配置Nginx站点5.3 启用…

解决 RAGFlow报错 `peewee.OperationalError: (1045)`:MySQL 容器密码错误排查手记

文章目录 🕵️‍♂️ 深度排查过程 🔧 完美解决方案:同步真实密码 ✅ 验证结果 📌 经验总结与最佳实践 问题现象: 部署 ragflow 时遭遇以下错误,且访问前端页面无响应: peewee.OperationalError: (1045, "Access denied for user root@192.168.48.6")关键线…

lwIP WebSocket 客户端 TCP PCB 泄漏问题分析与解决

在嵌入式开发中&#xff0c;使用 lwIP 实现 WebSocket 客户端时&#xff0c;偶尔会遇到反复连接导致 TCP PCB&#xff08;Protocol Control Block&#xff09;泄漏&#xff0c;最终连接数达到上限&#xff08;如 4&#xff09;后无法再建立新连接的问题。本文将结合实际案例&am…

k8s之Attach 和 Mount

Attach 和 Mount 一、核心概念对比操作Attach&#xff08;挂载设备&#xff09;Mount&#xff08;挂载文件系统&#xff09;定义将存储卷&#xff08;如 EBS、NFS 等&#xff09;连接到宿主机将已 Attach 的存储设备映射为宿主机上的文件系统路径执行者云提供商驱动&#xff08…

API Gateway HTTP API 控制客户端访问 IP 源

前言 在 API Gateway REST API 中我们可以配置 Resource policy 来实现对特定客户端 IP 地址的限制. 然而 HTTP API 并不提供这个功能, 不过我们可以用 Lambda 搓一个 Authorizer 实现等效的功能. 创建 Lambda authorizer import json import os import ipaddressdef lambda…

Linux搭建LAMP环境(CentOS 7 与 Ubuntu 双系统教程)

Linux搭建LAMP环境 一、LAMP 环境核心概念 定义&#xff1a;由 Linux、Apache、MySQL、PHP 四大组件组成的开源 Web 应用平台本质&#xff1a;四个独立开源软件的组合体&#xff0c;因长期协同使用形成高度兼容性&#xff0c;成为动态网站和服务器的主流解决方案 二、LAMP 四大…

c# 开机自动启动程序

以下是两种实现C#软件开机自启动的常用方法&#xff0c;根据需求选择适合的方案&#xff1a; 方法1&#xff1a;通过注册表实现&#xff08;需管理员权限&#xff09; using Microsoft.Win32; using System.Diagnostics;public static class AutoStartManager {/// <summa…

C语言---动态内存管理

为什么要有动态内存分配我们在学习动态内存管理之前&#xff0c;一直都是通过开辟变量&#xff0c;或者是开辟数组的方式来在内存的栈区开辟空间的&#xff0c;但是这样的开辟方式有局限性&#xff0c;因为一旦开辟之后&#xff0c;它们的大小就无法改变&#xff0c;就缺少了很…

C++标准库(std)详解

C标准库&#xff08;std&#xff09;详解——目录C标准库&#xff08;std&#xff09;详解一、命名空间&#xff08;namespace&#xff09;二、主要组件1. 输入输出流&#xff08;<iostream>&#xff09;2. 字符串处理&#xff08;<string>&#xff09;3. STL容器&…

ESP32的OTA升级详解:3. 搭建node/python服务器升级(native ota原生API)

一、OTA两种方式&#xff1a;app_update 与 esp_https_ota 区别 ESP32/ESP32-S2/ESP32-C3等可通过Wi-Fi或以太网下载新固件到OTA分区实现运行时升级。ESP-IDF提供两种OTA升级方法&#xff1a; 使用app_update组件的原生API使用esp_https_ota组件的简化API(支持HTTPS升级) 本次…

byte[]作为接口参数传递的方法

在C#中通过WebService或API传递byte参数&#xff08;如文件、图像等二进制数据&#xff09;时&#xff0c;通常有以下几种实现方式&#xff1a; ‌1. 使用Base64编码&#xff08;推荐REST API&#xff09;‌ 将byte数组转换为Base64字符串传输&#xff0c;适用于JSON格式的API&…

元宇宙与Web3的深度融合:构建沉浸式数字体验的愿景与挑战

一、技术特征与融合基础1. 元宇宙的技术架构&#xff08;2025年&#xff09;空间构建技术&#xff1a;3D建模与渲染&#xff1a;实时渲染引擎&#xff08;如Unity HDRP&#xff09;支持路径追踪光追&#xff0c;AI生成模型&#xff08;NVIDIA Get3D&#xff09;3秒生成3D场景。…