US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)

一、超声波测距的基本原理

超声波测距原理是在超声波发射装置发出超声波,接收器接收超声波,根据接收器接到超声波时的时间差以及超声波在介质中的传播速度,从而计算出物体距离模块的距离,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

超声波在空气中的传播速度为340m/s(当然温度不同,传播速度也不同,带温度校准的模块得到的数据会更准),根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2。

原理如图所示:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第1张图片

上述摘抄于百度百科超声波测距原理,略有增改。

二、US-100超声波测距模块

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第2张图片

该实物图的正反面如上图所示,US-100 超声波测距模块可实现 2cm~4.5m 的非接触测距功能,拥有 2.4~5.5V 的宽电压输入范围,静态功耗低于 2mA,自带温度传感器对测距结果进行校正,同时具有 GPIO,串口两种通信方式实现数据的读取,内带看门狗,工作稳定可靠。

下面是这种超声波测距模块的一些参数:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第3张图片

该模块提供两种触发模块测距的模式,由跳线帽来决定,当插上跳线帽时为 UART(串口)模式拔掉时为电平
触发模式
。如下图:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第4张图片

对于模块的五个引脚,标识在下图:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第5张图片

相关说明如下:

1 号 Pin:接 VCC 电源(供电范围 2.4V~5.5V)。   

2 号 Pin:当为 UART 模式时,接外部电路 UART 的 TX 端(注意);当为电平触发模式时,接外部电路的 Trig 端。

3 号 Pin:当为 UART 模式时,接外部电路 UART 的 RX 端(注意);当为电平触发模式时,接外部电路的 Echo 端。

 4 、5号 Pin:接外部电路的地。

三、串口触发测距

这里只介绍串口触发测距原理,电平触发与之原理类似,由于未使用,就不赘述。

在此模式下只需要在Trig/TX管脚输入0X55 (波特率9600),系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过 Echo/RX
管脚输出。输出的距离值共两个字节,第一个字节是距离的高 8 位(HDate),第二个字节为距离的低 8 位(LData),单位为毫米。即距离值为 (HData*256 +LData)mm

时序图如下:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第6张图片

也就是说我们给模块发送0X55,模块就会返回给我们距离相关的数据,我们换算一下就可以得到距离值,真的超级简单。

其也附带测温功能,只需要在Trig/TX管脚输入0X50 (波特率9600),系统便启动温度传感器对当前温度进行测量,然后将温度值通过 Echo/RX 管脚输出。测量完成温度后,本模块会返回一个字节的温度值(TData), 实际的温度值为 TData-45。例如通过 TX 发送完0X50 后,在 RX 端收到 0X45,则此时的温度值为 [69(0X45 的10 进制值)-45] = 24 度。

时序图如下:

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第7张图片

 

建议先用USB转TTL模块连接模块与电脑,使用串口调试助手测试一下模块是否工作正常。

四、基于STM32和RT-Thread操作系统的代码实现

4.1、概述

简述一下代码实现的过程,单片机通过UART1发送0x55给超声波模块,待超声波模块得到测量数据后,会通过UART1传回给单片机,单片机再将数据通过UART2传出来。

工程建立步骤如下:

1、根据使用外设的需求,使用STM32CubeMx配置出工程代码。(如何配置,网上很多,不赘述)

2、移植RT-Thread Nano版本,具体可参考原子和野火,说的很详细。

3、具体应用代码实现。

4.2、实现细节

采用线程和事件结合来获取数据和输出数据。

1、初始化线程和事件

void uartthread_init(void)
{
		
  HAL_UART_Receive_IT(&huart1,RxBuffer,2);
	/* 初始化事件对象 */
  rt_event_init(&event, "event", RT_IPC_FLAG_FIFO);
	
	/* 创建线程*/
  tid1 = rt_thread_create("ultrasonic_thread",	 //线程名字
                          tid_ultrasonic_entry,	 //线程入口函数  
                          RT_NULL,				 //线程入口参数
                          THREAD_STACK_SIZE,	 //堆栈大小,
                          THREAD_PRIORITY, 		 //线程优先级
						  THREAD_TIMESLICE);	 //时间片长度
    
   /* 如果获得线程控制块,启动这个线程 */
   if (tid1 != RT_NULL)
       rt_thread_startup(tid1);
}

2、在线程入口函数实现超声波测距模块的触发和数据接收(使用UART1)以及数据的转发(使用UART2)。

static void tid_ultrasonic_entry(void *parameter)
{
    while (1)
    {
		HAL_UART_Transmit(&huart1, &command_trigger, 1, 100); //发送触发指令
		rt_event_recv(&event, 
                      EVENT_FLAG1 ,
                      RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,  //前面的选项是必选的
                      RT_WAITING_FOREVER,
				      RT_NULL);
        
     
		HAL_UART_Transmit(&huart2, RxBuffer, 2, 100);
			
        rt_thread_mdelay(1000);
    }
}

其中

uint8_t command_trigger = 0x55;  
uint8_t RxBuffer[2]={0};

3、在UART1的中断回调函数设置事件的触发。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
    if(huart->Instance == USART1)
    {
        rt_event_send(&event, EVENT_FLAG1);
        HAL_UART_Receive_IT(&huart1,RxBuffer,2); //每次接收完后,必须使用这一句,且在别处容易卡死,
                                                 //否则下次无法接收中断(具体原因未知) 
    }
		
}

4、通过USB转TTL模块连接单片机和电脑,读到数据如下,可知读取成功。

US-100超声波测距模块 -- 原理与数据获取的编程实现(基于STM32和RT-Thread操作系统实现)_第8张图片

 

工程下载链接:https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10420&page=1#pid44021。

你可能感兴趣的:(电子开发模块应用记录)