基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍)

  • 引言
  • 项目设计
    • 项目简介
    • 开发工具
    • 硬件设计
    • 软件设计
  • 开发流程
    • 阅读手册
    • 配置并测试传感器相关设置
    • 软件开发
  • 总结
  • 后续

引言

最近和很多单片机和嵌入式的初学者交流,发现大家对使用一个没接触过的传感器往往感到无从下手。正好我最近使用一款我以前没使用过的超声波测距传感器开发新的功能,这里就来逐步详细的介绍如何使用一款陌生的传感器。大家在项目开发中,如果使用陌生传感器没有思路,可以仔细看一下本文。可以说,几乎使用所有的传感器,往往开发流程大同小异,所以阅读本文其实就可以对开发有一个清晰的认识。

项目设计

项目简介

本项目选用STM32为MCU,使用485接口的超声波测距传感器,实现测量距离的功能。

开发工具

  1. keil 5:STM32程序开发平台
  2. SSCOM:串口调试助手

硬件设计

  1. 使用目前主流的STM32F103C8T6充当MCU(编写程序使用标准库)。
  2. 使用KS114超声波测距传感器,其中数据传输接口为485(具体使用何种型号和厂商的传感器其实不重要,只要选用好是何种接口,比如是485还是IIC,另外配有手册就可以完成开发,本文也会详细介绍如何接触一个陌生的传感器模块进行开发的流程)。
  3. USB转TTL模块,主要为了调试用,没有也可以。

软件设计

  1. 需要在STM32单片机和超声波测距传感器之间建立通信,因为是485,所以主要是编写USART的数据收发。
  2. 查询手册获取控制超声波传感器的控制指令,每250ms向超声波测距传感器发送一次控制超声波测距传感器测距的命令。
  3. 将接收到的距离值进行校验,保证数据安全。
  4. 将接收到的距离值进行解析,转换成米和厘米的组合。

注:现在常规使用的传感器往往集成化很高,我们其实就是使用传感器提供的接口进行数据收发并对数据进行处理,无非就是使用什么通信方式而已。

开发流程

阅读手册

  1. 我们使用一个陌生的传感器,首先需要看一下他的功能摘要。

  1. 然后需要查看传感器的电性能参数,比如我们使用超声波测距传感器,我们就可以看一下他的供电电压、波束脚和工作状态的功率。

  1. 使用一个传感器,我们必须知道传感器每个引脚具体是什么作用的。比如正、负极和485通信引脚。

可以看到,图中说明了485-A、485-B、正极和负极具体是那个颜色的线,我们使用的时候也就可以接上相应的线。

  1. 对于使用陌生的传感器最关键的就是要看一下此传感器的工作流程。


我们从上述手册中知道了,使用此超声波测距传感器的主要流程是:先配置相关波特率、串口地址等基本信息 ->向超声波测距传感器发送测距命令 -> 接收超声波测距的命令。

  1. 从手册的工作流程我们知道,我们需要知道超声波的地址有哪些,然后开始查手册。

  1. 我们还需要知道探测指令都有哪些,之后仍然是查手册。

  1. 我们如果想使用多个超声波传感器,那么一般需要传感器给我们回传的信息中有相应的标识,此传感器中的串口地址就有此效果,那么如何让他回传呢,我们还是要查手册获得。

我们看到如何配置此通信协议了。

  1. 在手册的最下面我们看到他的使用建议里有如何快速上手,这往往可以让我们的开发更加快捷。

配置并测试传感器相关设置

注:每个传感器的配置流程和测试流程都不同,这里只是以本次使用的超声波测距传感器为例进行介绍平时的流程。读者进行开发的时候,还是要你自己使用的传感器手册为准,本节大家大致看一下即可,不用细看。

  1. 首先我们使用USB转TTL模块,将其中的485-A和485-B和超声波传感器的A和B相连,并将超声波测距传感器的正负极连接上电源并通电。
  2. 使用传感器手册中给的调试软件,根据手册给的串口信息进行设置。

连接成功后,我们可以向传感器发送控制指令,测试一下是否能正常使用。

  1. 我们需要修改波特率,这里设置为9600。

当修改完波特率后,我们以刚设置的波特率重新连接一下。

  1. 我们修改一下地址,这里设置为ea。

  1. 最后我们修改一下通信协议,选择手册里我们查询到的对应通信格式的指令,然后设置。

  1. 最后就是发送指令,测试是否符合我们的要求。

我们看到,测试的效果完全符合我们的预期,那么我们就可以进行MCU的软件开发了。

软件开发

  1. 为了增强可读性,我们往往需要将一些数据使用宏定义增加代码的可读性。我们将传感器手册中,我们使用到的指令都可以宏定义一下。
/****定义指令****/
#define Left_Address_cmd        0xe8
#define Right_Address_cmd       0xea
#define Register_02_cmd         0x02
#define Probe1_cmd              0x14//探测范围1cm-2m
#define Probe2_cmd              0x1e//探测范围1cm-3m
#define Probe3_cmd              0xb0//探测范围1cm-5m
  1. 我们要开发MCU和超声波测距传感器的通信,硬件上只需要将485的A与B连接上即可,下面主要说一下软件的编写。首先我们需要初始化串口,相关的程序我相信大家都看过很多次了。
void USART2_485_Init(u32 bound)
{NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;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);// 使能串口接收中断USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);USART_Cmd(USART2, ENABLE);// 清除发送完成标志NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X08;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

然后编写串口发送。

void USART_Send(USART_TypeDef* USARTx,u8 *data, u8 len)
{for(int i = 0; i < len; i++){USART_SendData(USARTx, data[i]); //向串口发送数据while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); //等待发送结束}
}

最后编写串口接收函数,这里使用中断接收。

void USART2_IRQHandler(void)
{u8 Res;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断{Res = USART_ReceiveData(USART2);    //读取接收到的数据if(rbWrite(&pRb_dis, &Res, 1) != 1)//此处使用到了环形队列,每次接收一个字节放进环形队列中,环形队列的编写不是此项目的重点,大家可以用别的方式实现,主要是存下来字节的数据。{printf("DIS_溢出");             }}else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)  //接收中断{USART2->SR;//先读SR寄存器USART2->DR; //再读DR寄存器}
}
  1. 我们编写函数实现给超声波发送相关指令,控制超声波执行对应工作的任务。
void control_ultrasonic(uint8_t address,uint8_t instruction)
{uint8_t tmp[5];switch(instruction){case  Probe1_cmd:tmp[0]=address;tmp[1]=Register_02_cmd;tmp[2]=Probe1_cmd;USART_Send(USART2,tmp,3);break;case  Probe2_cmd:tmp[0]=address;tmp[1]=Register_02_cmd;tmp[2]=Probe2_cmd;USART_Send(USART2,tmp,3);break;case  Probe3_cmd:tmp[0]=address;tmp[1]=Register_02_cmd;tmp[2]=Probe3_cmd;USART_Send(USART2,tmp,3);break;   default:break; }
}

此函数的编写主要就是将我们需要发送的指令放在一个数组中,然后调用串口发送函数进行发送。

在这里我们也可以很明显的发现宏定义的好处,让这里可读性增强了非常多。

  1. 我们使用传感器,最重要的当然是想要传感器的数据。我们一般需要编写一个函数用以处理我们接受到的传感器的数据,也就执行数据处理的角色。
void distance_data(void)
{uint8_t  dis_Temp_Buff[4] = {0};rbRead(&pRb_dis, dis_Temp_Buff, 4);   if(((dis_Temp_Buff[0]==Left_Address_cmd)&&(dis_Temp_Buff[3]==((uint8_t)(Summation(dis_Temp_Buff,3)&0xFF))))){Ultrasonic_distance[0]=dis_Temp_Buff[1];Ultrasonic_distance[0]=(Ultrasonic_distance[0]<<8)|(dis_Temp_Buff[2]);}else if( (dis_Temp_Buff[0]==Right_Address_cmd)&&( dis_Temp_Buff[3]==((uint8_t)(Summation(dis_Temp_Buff,3)&0xFF))) ){Ultrasonic_distance[1]=dis_Temp_Buff[1];Ultrasonic_distance[1]=(Ultrasonic_distance[1]<<8)|(dis_Temp_Buff[2]);} else{Dis_Error_Cnt++;if(Dis_Error_Cnt > 5){Dis_Error_Cnt = 0;printf("超声波距离数据错误");}}
}

我们首先将环形队列中的数据取出来四个字节放在一个数组中,然后我们进行数据校验,校验方式可以在手册中得到。数据校验正确时,我们将超声波发来的数据中代表距离的数据,放在一个全局变量中,这样的好处是,方便我们在任何一个函数中使用。此时其实我们的主要需求已经都能满足,项目主体已经完成。

  1. 最后就是使用我们编写的这些程序,因为每个人的需求都不同,这里也就不具体放代码了。但编写流程就是:循环发送control_ultrasonic(Left_Address_cmd ,Probe2_cmd);和control_ultrasonic(Right_Address_cmd,Probe2_cmd);,使超声波传感器一直将测量的距离发送给MCU -> 调用processing_distance_data函数将接受到的数据进行数据处理 ->我们想要使用这个数据的时候,直接读取这个Ultrasonic_distance全局变量数组即可使用距离数据。

总结

嵌入式软件工程师和单片机工程师使用一个陌生的传感器的流程上面已经详细介绍完毕。具体流程就是先仔细阅读一遍技术手册或者说明书,然后使用配套软件或者其他第三方软件进行需要的配置信息设置和大致通信测试,再后进行程序的编写,最后是进行总体测试。可以说,使用所有传感器几乎都是这几个步骤,大家可以试一下。

后续

更多嵌入式开发知识可以关注公众号:物联网知识。欢迎大家和我进行交流,一同进步。

基于STM32和超声波测距传感器的测距功能设计相关推荐

  1. 基于stm32的超声波HC-SR04测距仪含距离报警(温度补偿)

         前言:本文主要是紧跟前一篇文章中有关超声波HC-SR04模块进行的扩展实验,主要涉及超声波测距的温度补偿(DHT11),并搭配蜂鸣器的距离报警.整体实验较为简单,为常用的几个传感器模块相互配 ...

  2. 基于stm32单片机老人跌倒检测/障碍物测距报警/导盲拐杖设计

    基于stm32单片机老人跌倒检测/障碍物测距报警/导盲拐杖设计 1.功能描述: 1:OLED屏显示系统数据. 2:蓝牙连接手机app,查看数据,异常状态发送特定信息 3:异常状态声光报警 4:跌倒报警 ...

  3. 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)

            前言:本文为手把手教学基于STM32的超声波雷达项目--HC-SR04雷达.本次项目采用的是STM32作为MCU,搭配常用的HC-SR04超声波模块与舵机SG90实现模拟雷达检测的效果 ...

  4. 基于STM32的超声波倒车检测装置

    基于STM32的超声波倒车检测装置 一.前言 这里是为了完成学校嵌入式系统及应用实验而做的一个作业,硬件资源使用的是STM32F103VBT6开发板.HC-SR04超声波模块,蜂鸣器和数码管开发板上以 ...

  5. stm32超声波扫频_基于STM32的超声波发生器扫频信号源的实现

    基于 STM32 的超声波发生器扫频信号源的实现 张加岭,李善波,侯颖钊,赵 杰 [摘 要] 摘要:扫频信号源采用以 STM32F103 单片机为核心,实现高精度锯 齿波扫频.由于超声波电源换能器串联 ...

  6. 基于STM32的485通讯传感器采集程序

    基于STM32的485通讯传感器采集程序 先来看看硬件连接,大致就这样连接! 一般来说,RS485是硬件,而他软件方面是modbus协议,用到最多的是RTU方式. 工作方式:主机(STM32)通过串口 ...

  7. 基于STM32三路超声波避障小车

    基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...

  8. 基于STM32的VEML6040颜色传感器应用

    *以下文章资源均来自互联网,文章内容仅供参考,如果侵犯了您的权益,请留言或通过邮箱与我联系. The following article resources are all from the Inte ...

  9. 基于STM32的超声波测距

    一.HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm:模块包括超声波发射器.接收器.与控制电路. 模块的基本工作原理为: (1) ...

最新文章

  1. 【新产品发布】EVC9001 USB 隔离器
  2. 基于nuxt和iview搭建OM后台管理系统实践(2)-quill富文本组件的封装
  3. 七天开发安卓软件(五)
  4. 枚举 PROBLEM 1 生理周期
  5. NOI入门级:基础算法 贪心法
  6. 去除标签_生活小常识:3m胶怎么去除
  7. html页面乱码问题
  8. 图示SaaS:走向平台化,会产生什么变化?
  9. 【HNOI2004】L语言
  10. 数据通信原理_卫星通信系统原理什么 卫星通信系统原理介绍【图文】
  11. 风车im即时通讯源码
  12. Eucalyptus
  13. 《自己动手写网络爬虫》笔记2-Http状态码
  14. 在linux开发板上显示图片,制作开发板的logo标签
  15. 雨中走路淋雨多还是跑步淋雨多?
  16. [附源码]计算机毕业设计springboot咖啡销售平台
  17. 做电商,怎么降低快递运输成本?
  18. 一个Android菜鸟“面霸”的面试经历,如何少走弯路多加薪!
  19. 新增免费 代理(Proxy)验证助手 自用 支持http/socks
  20. define函数的用法

热门文章

  1. 计算机如何操作大写转换,电脑小写字母怎么切换大写字母
  2. css+div布局----典型布局基本框架
  3. oracle oci的好处,oracle的oci和thin区别
  4. 阿里云服务器 通过JavaMail发送邮箱STMP问题( 25端口被禁用 使用SSL协议465端口)
  5. dosbox全屏游戏花屏_DOSBox在今年圣诞节享受一些DOS游戏
  6. 实例!智能制造厂内物流解决方案
  7. 甜橙金融如何利用 Apache Pulsar 在日均上亿的交易中抵御金融诈骗
  8. 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
  9. 深度学习之笔记本高温预警大作战
  10. 【冰糖Python】Scipy:非参数检验 Mann-Whitney rank test、Wilcoxon signed rank test、Chi-square test