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

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.dtcms.com/a/283083.html

相关文章:

  • 基于Matlab改进大津法和Gabor滤波的织物缺陷检测系统
  • Java-数构链表
  • 聚合配送与传统配送平台的差异:从运营模式到市场价值
  • XXE漏洞3-通过 XXE 漏洞实现文件读取及端口探测
  • 开源Agent平台Dify源码剖析系列(四)核心模块core/agent之CotAgentRunner
  • SMTPman,发送邮件服务器smtp的功能详解!
  • 统计功效是什么?
  • ST17H36 蓝牙Soc开发(4)—— 外设应用1
  • mac电脑无法阅读runc源码
  • 【网易云-header】
  • HarmonyOS从入门到精通:自定义组件开发指南(九):组件复合与组合模式探秘
  • S7-1200 数字量模块接线:从源型 / 漏型到信号板扩展全解析
  • 【Tools】Saleae Logic 16软件安装教程
  • 【人工智能99问】损失函数有哪些,如何选择?(6/99)
  • 道可云人工智能每日资讯|天津市人工智能(AI+信创)创新生态联盟成立
  • 手撕设计模式之消息推送系统——桥接模式
  • MyBatis详解以及在IDEA中的开发
  • TRAE + Milvus MCP:用自然语言 0 门槛玩转向量数据库
  • 第五章 OB 分布式事务高级技术
  • 【Unity基础】Unity中的Pivot vs Center 小实验步骤列表 + 截图指引
  • 股票基金量化开源平台对比
  • 用AI破解数据质量难题
  • 【前端】CSS类命名规范指南
  • 主流 TOP5 AI智能客服系统对比与推荐
  • 高效开发利器:用宝塔面板快速搭建 PHP 开发环境教程
  • Android开发知识点总结合集
  • 微服务引擎 MSE 及 API 网关 2025 年 4 月产品动态
  • Docker 安装和配置 MySQL 8.0.36 的详细步骤
  • @[TOC](斐波那契数列模型)
  • RHCSA(配置本地yum源仓库)