首页 > 其他分享 >激光测距传感器TOFSense的使用

激光测距传感器TOFSense的使用

时间:2023-07-01 10:56:42浏览次数:42  
标签:TOFSense HAL UART 激光测距 rx CODE USER 传感器 buf

随笔记-获取TOFSense的数据

TOFSense

TOFSense是Nooploop深圳空循环的一款激光测距传感器,前面的黑框就是激光发射与接收的地方。模块激光发射视场角有27°,也就是说实际上模块打出去的激光覆盖范围是一个顶点在黑框上,类似圆锥的形状参考下图,打出的是范围激光但只输出一个值,看模块手册说内部通过多次测量根据数据大小占比来输出占比高的数据,基于这种机制作为避障用就很优秀1~3个模块就可以覆盖小车前方,本文将基于stm32f1介绍它的数据接收处理问题。
TOFSense
灵魂画手!

UART模式

TOF这个模块可以通过UART与CAN进行通信,这里先介绍UART模式,想要获取数据需要先看一下模块发送数据包的组成以及波特率等问题,通过产品手册可以了解到TOF出厂波特率是921600,这个注意一下单片机波特率要一致,或者可以通过他们的上位机NAssistant使用usb转ttl更改TOF模块的波特率,数据协议如下,还是很好理解的,前两位固定为0x57 0x00然后id、测距距离(dis)、距离状态指示(dis_status)、信号强度(signal_strength)校验和,知道协议具体组成以及对应位后就可以进行编程了。

官方有提供协议解析包,将下面红框中的文件添加到自己的工程中,不会就百度如何添加.c .h文件以及文件路径到工程中


然后看一下解析包做了什么,主要看nlink_tofsense_frame0.c/.h文件就可以,其他几个文件就是一些通用数据处理转换以及头文件,nlink_tofsense_frame0.h里面声明了一个结构体g_nts_frame0,结构体内有一个函数指针,结构体中的result就是解析后的保存数据用的结构体,进入nlink_tofsense_frame0.c中,可以看到函数指针指向uint8_t UnpackData(const uint8_t *data, size_t data_length),那么它就是解析函数了,从参数看我们需要给它传数据以及数据大小。OK 至此我们已经知道了解析包中干了什么,既然知道了需要传入数据那么我们只需要获取到数据然后传入即可。获取数据的步骤就是先用串口接数据,然后调用解析包中的解析函数将数据传入即可正常获取解析数据。
nlink_tofsense_frame0.h
nlink_tofsense_frame0.c

至于接收数据则有很多种方法了,根据之前了解到的固定帧头0x57来判断接收或者使用官方例程中通过UART的空闲中断以及DMA接数据的方法都是可以的
1、使用帧头判断接收,在回调函数中进行处理
main.c

/* USER CODE BEGIN 0 */
uint8_t u_rx_buf[16];

//重定向print
#include "stdio.h"
int fputc(int ch, FILE *f) //重定向printf函数
{
    HAL_UART_Transmit(&huart2, (void*)&ch, 1, 1000);
    return ch;
}

#include "nlink_tofsense_frame0.h"
//重写回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	static uint8_t c = 0;
	
	if (c == 0)
	{
		if (u_rx_buf[0] == 0x57) 
		{
			c++;
			HAL_UART_Receive_IT(&huart1, &u_rx_buf[1], 16 - 1);
		}
		else
		{
			HAL_UART_Receive_IT(&huart1, &u_rx_buf[0], 1);
		}
	}
	else
	{
		if (g_nts_frame0.UnpackData(u_rx_buf, sizeof(u_rx_buf)/sizeof(u_rx_buf[0])))
		{
			printf("接收的数据为:%f\r\n", g_nts_frame0.result.dis);    //解析成功
		}
		HAL_UART_Receive_IT(&huart1, &u_rx_buf[0], 1);
		c = 0;
	}
}

/* USER CODE END 0 */

int main(void)
{

  ...

  /* USER CODE BEGIN 2 */
    HAL_UART_Receive_IT(&huart1,&u_rx_buf[0],1);
  /* USER CODE END 2 */

  ...

  while (1)
  {
  }
}

第二种方法是TOF官网提供例程的接收方式,通过空闲中断以及DMA进行接收,在中断服务函数中处理
main.c

/* USER CODE BEGIN 0 */
uint8_t u_rx_buf[16];

//重定向print
#include "stdio.h"
int fputc(int ch, FILE *f) //重定向printf函数
{
    HAL_UART_Transmit(&huart2, (void*)&ch, 1, 1000);
    return ch;
}
/* USER CODE END 0 */

int main(void)
{

  ...

  /* USER CODE BEGIN 2 */
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);			   // 启用串口空闲中断
	HAL_UART_Receive_DMA(&huart1, u_rx_buf, sizeof(u_rx_buf)); // 开启DMA接收
  /* USER CODE END 2 */

  ...

  while (1)
  {
  }
}


中断处理文件stm32f1xx_it.c中

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

#include "nlink_tofsense_frame0.h"

	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) // 确认是否是空闲中断
	{
		uint32_t TOF_datalen;

		__HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除串口空闲中断标志位
		HAL_UART_AbortReceive(&huart1);		// 关闭DMA传输

		TOF_datalen = sizeof(u_rx_buf) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // 计算接收数据长度
		
        if (g_nts_frame0.UnpackData(u_rx_buf, TOF_datalen))                      // 解析协议数据
		{
			printf("接收的数据为:%f\r\n",g_nts_frame0.result.dis);
		}
		
		memset(&u_rx_buf, 0, sizeof(u_rx_buf));

		HAL_UART_Receive_DMA(&huart1, u_rx_buf, sizeof(u_rx_buf)); // 开启DMA接收
	}
  /* USER CODE END USART1_IRQn 1 */
}

运行结果

标签:TOFSense,HAL,UART,激光测距,rx,CODE,USER,传感器,buf
From: https://www.cnblogs.com/daixx/p/17516183.html

相关文章

  • 4.STM32传感器ADC采样+继电器控制实现声光控灯
    找到环境光与声音传感器对应的管教,使能,再在时钟树中设置频率为12Mhz,一般不要太高 在adc.c中可以添加如下代码:enum{ ADCCHN_NOISY, ADCCHN_LUX, ADCCHN_MAX,};intadc_sample_lux_noisy(uint32_t*lux,uint32_t*noisy){ uint8_ti; uint32_ttimeout=0xffffff;......
  • 红外雨量计(光学雨量传感器)在船舶航行中的应用
    红外雨量计(光学雨量传感器)在船舶航行中的应用红外雨量计是一种可靠的测量降雨量的设备,其原理是利用红外线的反射和漏射来测量降雨量。在船舶航行中,降雨对航行和安全都具有重要影响,因此红外雨量计的应用可以提高船舶航行的安全性和减少航行风险。 首先,红外雨量计可以实时监测......
  • 红外雨量计(光学雨量传感器)在船舶航行中的应用
     红外雨量计(光学雨量传感器)在船舶航行中的应用红外雨量计是一种可靠的测量降雨量的设备,其原理是利用红外线的反射和漏射来测量降雨量。在船舶航行中,降雨对航行和安全都具有重要影响,因此红外雨量计的应用可以提高船舶航行的安全性和减少航行风险。首先,红外雨量计可以实时监测船舶......
  • matlab simulink电机foc观测器模型,采用龙贝格观测器+PLL进行无传感器控制,其利用 PMSM
    matlab simulink电机foc观测器模型,采用龙贝格观测器+PLL进行无传感器控制,其利用PMSM数学模型构造观测器模型,根据输出的偏差反馈信号来修正状态变量。当观测的电流实现与实际电流跟随时,利用估算的反电势进行pll计算转子位置信息。龙伯格观测器采用线性控制策略代替了SMO的变......
  • 【雕爷学编程】Arduino动手做(139)---E18-D80避障传感器模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 红外雨量计(光学雨量传感器)在农业智慧灌溉的应用
    红外雨量计(光学雨量传感器)在农业智慧灌溉的应用智慧灌溉是一种利用现代科技手段实现农田灌溉自动化的方式,它可以有效的提高水利资源利用效率,减轻农民劳动强度,提高作物产量和品质,同时还可以减少水浪费和土地污染。在智慧灌溉系统中,红外雨量计是一种重要的传感器,它能够快速、准确的......
  • Arduino + GP2D12红外测距传感器
    https://ost.51cto.com/posts/1786技术规格:1.测量射程范围:10-80cm2.最大允许角度:>40°3.电源电压:4.5-5.5V4.平均功耗:33-40mA5.峰值功耗:约200mA6.更新频率/周期:25Hz/40ms7.模拟输出噪声:<200mV8.精度和采集的AD位数以及转化计算公式相关,10AD一般能达到0.1CM.9.测量距离与输......
  • 如何解决谐振式传感器产生的异常谐振问题?
    如何解决谐振式传感器产生的异常谐振问题?解决谐振式传感器产生的异常谐振问题需要进行以下步骤: 1.找出谐振频率:使用震动测试仪器或者频谱分析仪器来找出传感器的谐振频率。2.调整谐振频率:可以通过调整传感器的质量、刚度或者惯性矩来改变谐振频率。也可以将传感器与质量块......
  • 水质传感器和水质检测传感器有哪些
    水质传感器又称水质检测传感器、水质监测传感器,风途水质传感器是检测水质参数的仪器,包括很多种传感器,可以实时监测水体中的溶解氧、pH值、电导率、浊度、温度、总磷、总氮等多种参数测量。不同的行业对检测的要求不同,水质传感器的选择也不同。以下是常用的6种水质传感器。水质传感......
  • 笔式电感位移传感器
    笔式电感位移传感器不能单独使用,必须与数据采集器连接,才能采集信号,通过与位移传感器连接头相连,多通道数字量采集器获取传感器识别电压信号。位移传感器采集采集卡采集到的电压值,需要将电压转成位移量.转换是通过多项式拟合完成的,每个传感器出厂时候都有一组(5个值)拟合参数,......