完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、超声波测距的基本原理
超声波测距原理是在超声波发射装置发出超声波,接收器接收超声波,根据接收器接到超声波时的时间差以及超声波在介质中的传播速度,从而计算出物体距离模块的距离,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。 超声波在空气中的传播速度为340m/s(当然温度不同,传播速度也不同,带温度校准的模块得到的数据会更准),根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2。 原理如图所示: 上述摘抄于百度百科超声波测距原理,略有增改。 二、US-100超声波测距模块 该实物图的正反面如上图所示,US-100 超声波测距模块可实现 2cm~4.5m 的非接触测距功能,拥有 2.4~5.5V 的宽电压输入范围,静态功耗低于 2mA,自带温度传感器对测距结果进行校正,同时具有 GPIO,串口两种通信方式实现数据的读取,内带看门狗,工作稳定可靠。 下面是这种超声波测距模块的一些参数: 该模块提供两种触发模块测距的模式,由跳线帽来决定,当插上跳线帽时为 UART(串口)模式,拔掉时为电平 触发模式。如下图: 对于模块的五个引脚,标识在下图: 相关说明如下: 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。 时序图如下: 也就是说我们给模块发送0X55,模块就会返回给我们距离相关的数据,我们换算一下就可以得到距离值,真的超级简单。 其也附带测温功能,只需要在Trig/TX管脚输入0X50 (波特率9600),系统便启动温度传感器对当前温度进行测量,然后将温度值通过 Echo/RX 管脚输出。测量完成温度后,本模块会返回一个字节的温度值(TData), 实际的温度值为 TData-45。例如通过 TX 发送完0X50 后,在 RX 端收到 0X45,则此时的温度值为 [69(0X45 的10 进制值)-45] = 24 度。 时序图如下: 建议先用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模块连接单片机和电脑,读到数据如下,可知读取成功。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:01 , Processed in 0.804651 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号