功能简述:STM32F103RCT6使用HY-SRF05五针超声波测距模块进行测距,再将测距好的值通过串口2DMA方式发送到PC的串口调试助手上。

HY-SRF05五针超声波测距模块描述:

软件实现思路:

1、精准的延时工具

2、超声波模块TRIG引脚连接到STM32的某个引脚,推挽输出,通常情况是低电平。触发超声波信号时,将STM32的这个引脚拉高,制造一个上升沿,并延时>10us,再将该引脚拉低,如此超声波就可以发送测距脉冲信号了。

3、超声波模块的ECHO引脚连接到STM32的某个引脚上,下拉输入,通常情况下是低电平,当检测到上升沿时开始计时,直到下降沿停止计时。计时单位为us(微秒),考虑到超声波测距有效性为2cm-450cm,因此,需要有一个测距超时的机制。根据声波的速度为340m/s,检测1cm的距离需要的时间为0.01/340=0.0000294s=0.0294ms=29.4us,即每29.4us的时间换算成距离约等于1cm。超声波最大测量距离为450cm,换算成等效时间为450*29.4=13230。

4、测量距离=高电平时间/29.4,结果即为计算的厘米数。

硬件电路接线:

具体实现代码:

1、精准延时

#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endifvoid delay_us(uint32_t time_us)
{SysTick->LOAD = AHB_INPUT * time_us;SysTick->VAL = 0x00;SysTick->CTRL = 0x00000005;for(;!(SysTick->CTRL & 0x00010000););SysTick->CTRL = 0x00000004;
}void delay_ms(uint32_t time_ms)
{for(;time_ms-- > 0;){delay_us(1000);}
}

2、超声波测距功能代码

#ifndef __Z_OUTER_HARDWARE_SUPERSONIC_H
#define __Z_OUTER_HARDWARE_SUPERSONIC_H
#include "z_outer_hardware_supersonic.h"
#endifvoid init_hardware_supersonic()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB, GPIO_Pin_7);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void func_trig_supersonic()
{GPIO_SetBits(GPIOB, GPIO_Pin_7);delay_us(12);GPIO_ResetBits(GPIOB, GPIO_Pin_7);
}u8 func_get_supersonic_echo_signal(u16 *distance_cm)
{u16 counter_high;u16 timeout;func_trig_supersonic();for(;;){delay_us(1);if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8) == Bit_SET){counter_high ++;if(counter_high > 13235){return 2;}}else{if(counter_high > 1){*distance_cm = ((counter_high)*10)/294;return 0;}timeout++;}if(timeout > 13235){return 2;}}
}

3、USART2串口DMA通讯代码

#ifndef __Z_HARDWARE_USART2_DMA_H
#define __Z_HARDWARE_USART2_DMA_H
#include "z_hardware_usart2_dma.h"
#endifu8 dma_recv_buf[LEN_DMA_RECV_BUF];
u8 dma_send_buf[LEN_DMA_RECV_BUF];
u8 usart2_cache[LEN_DMA_RECV_BUF];void init_hardware_usart2_dma(u32 bound)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART2, &USART_InitStructure);DMA_DeInit(DMA1_Channel6);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;DMA_InitStructure.DMA_MemoryBaseAddr = (u32)dma_recv_buf;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = LEN_DMA_RECV_BUF;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel6, &DMA_InitStructure);DMA_Cmd(DMA1_Channel6, ENABLE);DMA_DeInit(DMA1_Channel7);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;DMA_InitStructure.DMA_MemoryBaseAddr = (u32)dma_send_buf;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 0;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel7, &DMA_InitStructure);DMA_Cmd(DMA1_Channel7, DISABLE);DMA_ClearFlag(DMA1_FLAG_GL7);USART_Cmd(USART2, ENABLE);USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
}void func_usart2_dma_send_bytes(u8 *bytes, u8 bytes_len)
{DMA_Cmd(DMA1_Channel7, DISABLE);memcpy(dma_send_buf, bytes, bytes_len);DMA_SetCurrDataCounter(DMA1_Channel7, bytes_len);DMA_Cmd(DMA1_Channel7, ENABLE);while(DMA_GetCurrDataCounter(DMA1_Channel7));while(USART_GetFlagStatus(USART2, USART_FLAG_TC) != SET);
}u8 func_usart2_dma_recv_bytes(u8 *buf_recv, u8 *len_recv)
{u8 len_dma_recv;if(USART_GetFlagStatus(USART2, USART_FLAG_IDLE) != RESET){USART_ReceiveData(USART2);DMA_Cmd(DMA1_Channel6, DISABLE);len_dma_recv = LEN_DMA_RECV_BUF - DMA_GetCurrDataCounter(DMA1_Channel6);memcpy(buf_recv, dma_recv_buf, len_dma_recv);memset(dma_recv_buf, 0, len_dma_recv);DMA_SetCurrDataCounter(DMA1_Channel6, LEN_DMA_RECV_BUF);USART_ClearFlag(USART2, USART_FLAG_IDLE);DMA_Cmd(DMA1_Channel6, ENABLE);*len_recv = len_dma_recv;return 0;}return 1;
}

4、主功能函数实现:

#include "stm32f10x.h"#ifndef __Z_HARDWARE_USART2_DMA_H
#define __Z_HARDWARE_USART2_DMA_H
#include "z_hardware_usart2_dma.h"
#endif#ifndef __Z_OUTER_HARDWARE_SUPERSONIC_H
#define __Z_OUTER_HARDWARE_SUPERSONIC_H
#include "z_outer_hardware_supersonic.h"
#endifvoid init_led0(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}int main()
{u8 buf_tmp[LEN_DMA_RECV_BUF];u16 distance_cm;init_hardware_usart2_dma(9600);init_led0();init_hardware_supersonic();while(1){if(func_get_supersonic_echo_signal(&distance_cm) == 0){buf_tmp[1] = (u8)distance_cm;buf_tmp[0] = (u8)(distance_cm >> 8);func_usart2_dma_send_bytes(buf_tmp, 2);distance_cm = 0;}GPIO_SetBits(GPIOA, GPIO_Pin_8);delay_ms(1000);GPIO_ResetBits(GPIOA, GPIO_Pin_8);delay_ms(200);}
}

最终的效果如下:

以上,仅供参考。

STM32F103RCT6使用HY-SRF05 五针超声波测距模块进行测距实现相关推荐

  1. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

  2. arduino UNO 与 超声波测距模块 实验详情

    US-015 超声波测距模块 超声波传感器 US-020升级版 送全套资料 资料下载地址:http://pan.baidu.com/s/1c0AfkIG US-015超声波测距模块 1. 概述 US- ...

  3. US-016超声波测距模块

    1.  概述 US-016超声波测距模块可实现2cm~3m的非接触测距功能,供电电压为5V,工作电流为3.8mA,支持模拟电压输出,工作稳定可靠.本模块根据不同应用场景可设置成不同的量程(大测量距离分 ...

  4. 51单片机:HCSR04超声波测距模块及1602显示—C51程序(超详细)

    测试完成于STC89C516单片机,晶振12MHZ.超声波模块Echo=P1^0.Trig=P1^1,1602液晶8位数据口=P0.E=P2^7.RS=P2^6.RW=P2^5.. 程序文件分为4部分 ...

  5. stm32控制超声波测距模块HC-SR04

    引脚:PB15 TRIG,PB0 ECHO: 不同距离,LED对应不良.闪烁.亮状态,并通过串口发送到PC; TIM3定时中断,测出脉宽长度,没有像野火一样使用捕捉功能: 1.HS-SR04模块实物图 ...

  6. 【mcuclub】超声波测距模块HC-SR04

    一.实物图 二.原理图 编号 名称 功能 1 VCC 电源正 2 TRIG 触发控制信号输入 3 ECHO 回响信号输出 4 GND 电源地 三.简介 由于超声波指向性强,能量消耗缓慢,在介质中传播的 ...

  7. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  8. STM32智能小车------超声波测距模块

    文章目录 一.原理讲解 1.实物图 2.工作原理: 3.接线: 二.软件驱动代码 1.接口定义 2.驱动函数 总结 最终效果 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生. 进 ...

  9. 通过串口打印--超声波测距模块测得距离

    通过串口打印--超声波测距模块测得距离 原理 超声波测距模块 串口传输 实战代码 原理 超声波测距模块 在这里首先需要了解超声波测距模块的原理.在我的这篇博客有很多介绍.超声波模块介绍 串口传输 串口 ...

  10. 51单片机 普中V2 超声波测距 报警 显示 基于MCS51单片机的超声波测距模块的开发

    基于MCS51单片机的超声波测距模块的开发 采用C51程序设计语言,完成下列功能要求. l 必选功能: (1) 超声波模块和单片机的接口设计,画出完整的电路原理图.(15分) (2) 开发板上电时,显 ...

最新文章

  1. Flask环境的配置
  2. 群雄逐鹿,谁将赢得5G时代的物联网战争?
  3. python获取当前窗口句柄_人生苦短,我学python之python+selenium 多窗口、句柄(handle)...
  4. WIN10系统下sqlmap没有颜色和nmap无法使用的问题解决
  5. Android IPC机制
  6. java框架异常怎么处理_java异常处理与处理框架-笔记
  7. React中的纯组件
  8. 无需多个模型也能实现知识整合?港中文MMLab提出“烘焙”算法,全面提升ImageNet性能...
  9. matlab 积分后带int,matlab int 积分
  10. 学计算机去一线城市,这5个“新一线”城市在线抢人,选择去这上大学非常有前景!...
  11. 面试:后端程序员面试题
  12. 基因数据处理54之bwa-mem运行paird-end(1千万条100bp的reads)
  13. 如何通俗易懂地阐述机器学习?
  14. 计算机d盘无法格式化,电脑D盘无法格式化怎么办
  15. 日本人的姓及一些姓氏的读法(转)
  16. 电视剧《奋斗》精彩对白节选---(九)
  17. 字节辟谣被裁员工与 HR 互殴;苹果头显多个新功能曝光;谷歌希望 RISC-V 成为 T1 级 Android 架构|极客头条...
  18. 公司的技术团队负责人(团队管理),研发团队
  19. 最新Java开发进阶!我的华为面试经历分享,请查收
  20. leetcode:1168. 水资源分配优化【思维转换 + 最小生成树】

热门文章

  1. 一个屌丝程序员的青春(二四一)
  2. (1)地图的理解及地图的类型介绍
  3. 【观察】走进乌兰察布,揭秘UCloud优刻得首个自建自营云计算中心
  4. 十大在线编程学习网站
  5. java 自动化报表_SpringMvc JDBC jQWidgets项目案例JasperReport自动化报表系统
  6. oracle入门操作3(关于查询 )
  7. 常用的SQL语句大全-单表操作
  8. 学计算机打字一段话,如何快速学会电脑打字
  9. 2019.5.29 中移物联网前端实习生笔试
  10. 微信 客服消息 发送 微信会回调三次的问题