原创 基于STM32F411RE的cm级超声波测距系统及代码

2022-8-15 09:05 591 4 4 分类: MCU/ 嵌入式 文集: 方案
本项目通过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脉冲,与测量成距离成正比


当传感器接收到一个触发信号,就发出一个40KHz突发信号。该信号通过空气传播,在撞到目标物体后返回传感器,再由传感器根据一定算法得出被测物体的距离。
HC-SR04传感器与STM32的连接电路比较简单,传感器Vcc与STM32板的5V连接,两个板子的GND引脚连接,传感器的Trig 引脚与开发板的A0 (PA0) 连接,echo引脚与开发板的A1 (PA1)引脚连接。


按照上述电路图连接妥当后,将以下代码上传到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
{
while(!(SysTick->CTRL &0x10000)){}
}
SysTick->CTRL=0;
}
void delayuS(uint32_t us) //delay for certain amount in microseconds
{
for(int i =0;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之类的显示器件。

作者: 硬之城Allchips, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3975615.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

给作者打赏,鼓励TA抓紧创作!

赞赏支持
点赞 4
赞赏0

文章评论0条评论)

登录后参与讨论
相关推荐阅读
硬之城Allchips 2022-08-29 10:30
霍尔传感器原理、典型应用及与Arduino的接口
霍尔传感器(Hall Effect Sensor)是根据霍尔效应制作的一种磁场传感器,当恒定电流通过内部的霍尔半导体片时,将在垂直方向产生电位差即霍尔电压。这个霍尔电压随磁场强度的变化而变化,磁场越强...
硬之城Allchips 2022-08-26 08:59
传感器到云应用中的超低功耗Sub-1GHz RF收发方案
在ISM和SRD(短距离无线电设备)应用中,高性能和长电池寿命至关重要。本方案采用S2-LP sub-1GHz超低功耗的低数据率,可实现+27dBm(500mW)的输出功率,可使电池寿命从几个月延长为...
硬之城Allchips 2022-08-25 09:58
用IR传感器和Arduino制作一个数字转速计(附代码)
本项目采用IR传感器和Arduino开发板制作了一个数字转速计,以RPM为单位测量马达的转数。项目黑简单,只需将IR传感器和Arduino板子与16*2 LCD连接即可。BOM表及电路图本转速计可连续...
硬之城Allchips 2022-08-24 10:27
基于AP33772的家电及电动工具USB-C PD3.0/PPS接收方案
Type-C PD3.0适配器已经大量上市,这要求Type-C接口设备(TCD)配备灵活、精简且具成本效益的充电解决方案。本设计采用AP33772高效能USB Type-C PD3.0/PPS接收控制...
硬之城Allchips 2022-08-23 09:22
用振动传感器和Arduino监测工业设备的振动状态
通常,振动传感器基于机械或光学原理检测振动,可用来测量、显示和分析线速度、位移和加速度。虽然人类对振动的感知能力非常弱,传感器却能提供这种振动的状态数据。这就为设备维护提供了关键数据,在设备损坏之前及...
硬之城Allchips 2022-08-22 09:27
基于ACS712电流传感器的电流检测方案(电路图+BOM表)
ACS712是一种低噪声、使用方便、性价比高的线性电流传感器,主要应用于电机控制、载荷检测和管理、开关式电源和过电流故障保护等,特别是那些要求电气绝缘却未使用光电绝缘器或其它昂贵绝缘技术的应用中。AC...
我要评论
0
4
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /4 下一条