0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32F411的cm级超声波测距系统及完整代码

芯情观察猿 来源:芯情观察猿 作者:芯情观察猿 2022-08-15 09:10 次阅读

本项目通过HC-SR04超声波传感器STM32F411开发板,以精确到cm的精度测量目标物体的距离。项目BOM表如下:

STM32F411RE开发板 x1

HC-SR04超声波传感器 x1

跳线 若干


其中,HC-SR04超声波传感器可以0.3cm精度读取2-400cm范围距离,而且超声波发射器和接收器组合在一起,适合大多数个人爱好项目。主要性能包括:

工作电源:5VDC

工作电流:15mA

工作频率:40KHz

最大距离:4m

最小距离:2cm

测量角度:15度

分辨率:0.3cm

触发输入信号:10uS TTL脉冲

回升输出信号:TTL脉冲,与测量成距离成正比


pYYBAGL5nQaANnutAAG4dAhCugA128.png

当传感器接收到一个触发信号,就发出一个40KHz突发信号。该信号通过空气传播,在撞到目标物体后返回传感器,再由传感器根据一定算法得出被测物体的距离。

HC-SR04传感器与STM32的连接电路比较简单,传感器Vcc与STM32板的5V连接,两个板子的GND引脚连接,传感器的Trig 引脚与开发板的A0 (PA0) 连接,echo引脚与开发板的A1 (PA1)引脚连接。


poYBAGL5nQeAYCX7AAQV4inxFGQ910.png

按照上述电路图连接妥当后,将以下代码上传到Arduino IDE。


#include "stm32f4xx.h"

// Device header

//macros for trigger pin

#define Trig_high GPIOA->BSRR=GPIO_BSRR_BS_0 // turn on PA0 (trig pin)

#define Trig_low GPIOA->BSRR=GPIO_BSRR_BR_0 // turn off PA0 (trig pin)

uint32_t duration;

float distance;

//prototypes of the used function

void delaymS(uint32_t ms);

void delayuS(uint32_t us);

uint32_t read_echo(uint32_t timeout);

int main(void)

{

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //enable GPIOA Clock

GPIOA->MODER |= (1<<0); //set PA0 to Output

//configure Timer1 to generate micorseconds delay

RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /*Enable TIM3 clock*/

TIM1->PSC = 16 -1; /* 16 000 000 /16 = 1000 000*/

TIM1->ARR = 1; /* 1000 000 /1 = 1000000*/

TIM1->CNT =0;

TIM1->CR1 =1;

while(1)

{

Trig_low; //turn off trig

delayuS(10); //wait 4uS

Trig_high; //turn on trig

delayuS(10);

Trig_low;

duration=read_echo(400000); //measure the time of echo pin

distance=duration/58; //distance=duration/2*SOUND_SPEED

delaymS(1000); //delay for 1 second between each read

}

}

void delaymS(uint32_t ms) //delay for certain amount in milliseconds

{

SysTick->LOAD=16000-1;

SysTick->VAL=0;

SysTick->CTRL=0x5;

for (int i=0;i;i++)<>

{

while(!(SysTick->CTRL &0x10000)){}

}

SysTick->CTRL=0;

}

void delayuS(uint32_t us) //delay for certain amount in microseconds

{

for(int i =0;i;i++){<>

while(!(TIM1->SR & 1)){} /*wait for UIF set*/

TIM1->SR &= ~1;

}

}

uint32_t read_echo(uint32_t timeout)

{

uint32_t duration;

while(!((GPIOA->IDR)&GPIO_IDR_ID1)){duration++;delayuS(1);

if(duration>timeout){return 0;}

}

duration=0;

while((GPIOA->IDR&GPIO_IDR_ID1)){duration++;delayuS(1);if(duration>timeout){return 0;} }

return duration;

}

如果一切正常,就可以开始测量物体的距离了,可通过serial monitor观测结果。如果为了方便携带,也可连接OLED之类的显示器件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 超声波
    +关注

    关注

    63

    文章

    2808

    浏览量

    136700
  • DIY
    DIY
    +关注

    关注

    176

    文章

    883

    浏览量

    345909
  • 激光雷达
    +关注

    关注

    961

    文章

    3647

    浏览量

    186665
  • LIDAR
    +关注

    关注

    10

    文章

    305

    浏览量

    28992
收藏 人收藏

    评论

    相关推荐

    基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料

    设计要求 1.设计一个以51单片机为核心的超声波倒车雷达系统; 2.超声波测量范围在2cm~4m,测量精度3mm; 3.扩展DS18B20温度测量模块,读取环境温度和补偿
    发表于 03-19 14:17

    超声波传感器和超声波测距原理分析

    声音是由振动产生的,能够产生超声波的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头。
    发表于 01-29 09:20 255次阅读
    <b class='flag-5'>超声波</b>传感器和<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>原理分析

    超声波测距原理 超声波测距离传感器接线方法

    超声波测距是一种常用的测距方法,通过发射超声波脉冲,利用其在空气中传播速度较快的特点,测量出从传感器到目标物体的时间差,并进而计算出距离。超声波
    的头像 发表于 01-22 15:22 620次阅读

    51单片机的超声波测距,并用74HC595驱动数码管显示超声波测距的距离

    个人是小白,实在不会写,麻烦大佬们帮忙写一个程序,实现51单片机的超声波测距,并用74HC595驱动数码管显示超声波测距的距离!!!
    发表于 11-23 15:19

    基于msp430的超声波测距设计

    简介:超声波测距,包含收发电路以及与上位机进行串行通信的电路……
    发表于 11-09 08:31 0次下载
    基于msp430的<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>设计

    FPGA零基础学习之Vivado-超声波驱动设计

    的其中一项应用:超声波测距。 我们用到的试验模块为HC-SR04超声波模块,它的测量距离在2cm~400cm之间。测量精度在3mm左右。模块
    发表于 11-01 17:48

    超声波模块为什么测距不准?

    超声波模块为什么测距不准,只有在拿一本书靠近模块时,测得比较准,但是测到人的距离就不怎么准
    发表于 10-31 07:23

    基于STM8的红外与超声波测距仪设计方案

    超声波作为一种特殊的声波,由于其指向性强,在空气中传播速度相比光速要小很多,其传播时间容易检测,因此,目ljif超声波测距中广泛采用回波一渡越时间方法111,即检测从
    发表于 10-10 06:13

    基于单片机的超声波测距系统的研究与设计

    基于单片机的超声波测距系统的研究与设计
    发表于 09-26 07:54

    基于arm超声波风速测量系统设计

    系统硬件电路包括ARM7处理器以及外围的模拟、数字电路,并采用模块化进行设计。这种思想大大简化了系统硬件电路设计的复杂性,增强了系统的稳定性与可靠性。软件部分根据超声波信号的特点,选
    发表于 09-26 07:08

    基于STM32的HC-SRF04超声波测距proteus仿真设计

    基于STM32的HC-SRF04超声波测距proteus仿真设计
    的头像 发表于 08-31 14:54 1257次阅读
    基于<b class='flag-5'>STM32</b>的HC-SRF04<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>proteus仿真设计

    超声波模块测距的使用方法

    C-SR04超声波模块是一种常用的测距模块,其通过发射超声波并接收其反射信号来实现测距功能。因其成本低、精度高、使用简便等特点,被广泛应用于以下场景。
    的头像 发表于 08-28 14:14 2040次阅读
    <b class='flag-5'>超声波</b>模块<b class='flag-5'>测距</b>的使用方法

    Proteus教程:超声波测距与显示

    Proteus教程:超声波测距与显示
    的头像 发表于 06-14 11:28 1576次阅读
    Proteus教程:<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>与显示

    lebview+arduino 超声波测距

    最近学校有项目,想用 lebview+arduino 进行超声波测距 用mixly看串口有数据 设置VI 报5003 然后重新linx一下 数据一直为0啊 我是新手 向各位请教下问题在哪,该怎么做,谢谢。
    发表于 06-04 18:48

    CH32V103基础教程97-超声波测距

    本章教程主要通过使用CH32V103开发板连接超声波测距模块进行超声波测距实验。本次实验教程所用传感器为HC-SR04超声波传感器。 1、T
    发表于 05-12 16:32