STM(三十二)超声波测距

1、超声波模块简介

                                

如上图接线,VCC供3.3v~5V电源,GND为地线,TRIG触发控制信号输入,ECHO回响信号输出等四个接口端。

  • 品牌:HC-SR04
  • 可提供2cm~400cm的非接触式的距离感测功能
  • 精度高达3mm.
  • 模块包括声波发射器、接收器与控制电路。
  • 工作电压:3.3V-5V.

2、基本工作原理

(1)采用IO口TRIG触发测距,给最少10us 的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口 ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

3、电气参数

 

 

 4、超声波时序图

 

 

   以上时序图表明你只需要TRIG脚提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。--旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: uS/58=厘米或者 uS/148=英寸;或是:距离=高电平时间*声速(340M/S) /2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

:

  •  此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。
  • 测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果。

此实验将超声波模块接到STM32F407ZT06的camera脚上进行实验。

 

 

 如上图,超声波模块的TRIG脚接到DCMI_D1(即接到STM32的PC7脚,),ECHO接到DCMI_D2(PC8)

  • 由时序图上可以看出TRIG作为输出脚,先输出低电平,再输出一个至少10us高电平的触发信号给模块。
  • 模块内部会发8个40KHZ周期电平并检测回波。(发到模块内部,不是发到ECHO脚,所以代码中不用处理这个电平)。
  • 一旦检测到回波,模块则会通过ECHO脚(对于MCU是输入)输出回响信号(即高电平),通过MCU收到的高电平信号的时间就可以算出距离。距离=高电平时间*声速(340m/s)/2,(因为超声波发出去再反射回来,所以测出来的距离要除以2)。

5、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//Sr.04文件
{
    GPIO_InitTypeDef GPIO_InitStruct;
    //1.初始化时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
     
    //2.初始化硬件
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_8;//PC8
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;//输出模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz
    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOC,&GPIO_InitStruct); 
     
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_7;//PC1
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;//输出模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz
    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOC,&GPIO_InitStruct);
}
 
uint32_t Get_Sr04_Distance(void)
{
    uint32_t t=0;
    //空闲状态
    PCout(7)=0;
    delay_us(5);
    //1.TRIG触发信号   ----是一个至少10us的高电平
    PCout(7)=1;
    delay_us(12);
    PCout(7)=0;
    //2.模块自动发送8个40KHz的方波,我们不用管
    //3.计算高电平持续时间
    while(!PCin(8));//把低电平跑完
    while(PCin(8))//只需要算出这个循环持续的时间就是高电平持续时间
    {
        //340m/s-->340000mm/1000000us=0.34mm/us
        //3mm/0.34 = 8.82....us  约等于 9us   也就是说一个3mm就需要9us
        delay_us(9);
        t++;//一个t就对应一个3mm
    }
    t=t/2;//超声波一个来回,所以除以2
    return (3*t);//返回的是mm级别
}

  

 

 

 

posted @   轻轻的吻  阅读(1188)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-05-15 电视制式及声音制式的划分
点击右上角即可分享
微信分享提示