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

激光测距传感器TOFSense CAN模式的使用

时间:2023-08-17 11:45:39浏览次数:35  
标签:TOFSense HAL 激光测距 TxHeader sFilterConfig 查询 传感器 0xff buf

随笔记-获取TOFSense的数据

之前写了一篇UART的移植以及适用,今天写一篇关于CAN的使用
这里就不多介绍了该模块了

CAN模式

与UART模式一样CAN也是支持主动输出以及查询输出的

协议如下图,基于协议可以看到我们需要Arbitration Field中的ID,也就是CAN标识符也可以认为是地址,以及Data Field中的数据,其他的都不需要管

查询协议

因为CAN需要使用can芯片手里正好有一个F407自带CAN芯片,所以以下代码基于STM32F407编写
编程的话参考官方的例程文件
简单介绍一下CAN与基于stm32cubemx配置can(并不是很精通,能用就行)
这里只简单说一下本人的理解与想法,原理性的问题可以移步其他CAN教程,网上有很多更好的教程

CAN的配置

CAN有比特率也有说波特率的,其实对于CAN来说,比特率和波特率这两个概念是一致的,但并不是说这两个概念永远是一致的,只是在满足某个条件的时候,两个概念才会相同,感兴趣建议大家百度看一下大佬的介绍。
配置CAN相关参数,波特率设定为1M,APB1的时钟频率为42M,
波特率计算公式:42M/6/(4+2+1)=1M.

然后打开中断

OK CAN的硬件配置到此完成

CAN模式与UART不同的是需要先对过滤器进行配置(网上有说可以不配置,但是我实际测试时不配置接收不到数据),这里参考正点原子的例程进行配置

CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef	RxHeader;

void tof_can_init(void)
{
	CAN_FilterTypeDef  sFilterConfig;
  
	sFilterConfig.FilterActivation = ENABLE;
	sFilterConfig.FilterBank = 0;
	sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
	sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
	sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
	sFilterConfig.FilterIdHigh = 0x0000;
	sFilterConfig.FilterIdLow = 0x0000;
	sFilterConfig.FilterMaskIdHigh = 0x0000;
	sFilterConfig.FilterMaskIdLow = 0x0000;
 
	if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK){while(1){ }}
	if(HAL_CAN_Start(&hcan1) != HAL_OK){while(1){ }}
	if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK){while(1){ }}
	
    //这里是查询模式需要提前配置好stdid
	TxHeader.StdId=0x402;	//查询标准帧ID
	TxHeader.ExtId=0;
	TxHeader.IDE=CAN_ID_STD;
	TxHeader.RTR=CAN_RTR_DATA;
	TxHeader.DLC=8;
}

配置好后,开始编写解析程序,此次的逻辑是通过中断回调函数获取当前帧的StdId来判断,因为TOFSense的StdId是固定的0x200+id

float dis;					//距离数据
uint8_t dis_status;			//距离状态指示
uint16_t signal_strength;	//信号强度

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	uint8_t id;
        int32_t temp = 0;
	if(hcan->Instance==CAN1)
	{
		HAL_CAN_GetRxMessage(&hcan1,CAN_FILTER_FIFO0,&RxHeader,can_rx_buf);//获取数据
                if ((RxHeader.StdId & 0x200) == 0x200 )
                {
	                temp = (int32_t)(can_rx_buf[0] << 8 | can_rx_buf[1] << 16 | can_rx_buf[2] << 24)/256;	//计算此帧数据距离
	                dis = temp/1000.0f;										//除以1000后单位为m

	                dis_status = can_rx_buf[3];								//此帧距离状态指示
	                signal_strength = can_rx_buf[4] | can_rx_buf[5] <<8;	//此帧信号强度
                }
	}
}

查询模式
由于之前我们在tof_can_init中已经配置好了查询标准帧ID所以查询数据可以直接发送指令

uint8_t can_tx_buf[8] = {0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff};	//查询命令

void get_CAN_data(uint8_t id)
{
    can_tx_buf[3] = id;
    HAL_CAN_AddTxMessage(&hcan1, &TxHeader, can_tx_buf, (uint32_t*)CAN_TX_MAILBOX0);

}

需要注意的是如果CAN总线上挂载的有其他设备则需要将查询标准帧ID的初始化放到发送函数内

uint8_t can_tx_buf[8] = {0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff};	//查询命令

void get_CAN_data(uint8_t id)
{
	TxHeader.StdId=0x402;	//查询标准帧ID
	TxHeader.ExtId=0;
	TxHeader.IDE=CAN_ID_STD;
	TxHeader.RTR=CAN_RTR_DATA;
	TxHeader.DLC=8;

    can_tx_buf[3] = id;
    HAL_CAN_AddTxMessage(&hcan1, &TxHeader, can_tx_buf, (uint32_t*)CAN_TX_MAILBOX0);

}

标签:TOFSense,HAL,激光测距,TxHeader,sFilterConfig,查询,传感器,0xff,buf
From: https://www.cnblogs.com/daixx/p/17637180.html

相关文章

  • 振弦传感器、采集仪及在线监测系统应用于地下隧道监测的完整案例
    振弦传感器、采集仪及在线监测系统应用于地下隧道监测的完整案例介绍振弦传感器、振弦采集仪及在线监测系统是岩土工程监测领域中常见的设备,能够对钢筋混凝土结构进行实时、准确的监测。本文将介绍一套完整链条的岩土工程监测案例,包括振弦传感器、振弦采集仪及在线监测系统的应......
  • 肌电传感器 SEN0240
    传感器购买连接。传感器相关信息,这个也是。传感器驱动示例代码:/**Copyright2017,OYMotionInc.*Allrightsreserved.**Redistributionanduseinsourceandbinaryforms,withorwithout*modification,arepermittedprovidedthatt......
  • 智慧工地平台的技术应用:无线传感器、人脸识别和云计算
    智慧工地云平台源码 智慧工地源码智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化......
  • 水位传感器在热水器的应用
    光电水位传感器是一种常用于测量液体水位的传感器,它通过使用光电传感器来检测液体的水位,并将其转化为电信号。在热水器中,光电水位传感器被广泛应用于检测水箱中的水位。热水器是我们日常生活中常用的家电之一,而水位的控制是热水器正常运行的重要因素之一。光电水位传感器在热水器中......
  • RCC & GPIO库函数&传感器输入
    RCC: ResetandClockControl,即复位和时钟控制。  一般在.h文件的末尾都是一些函数声明,RCC常用的三个函数(外设时钟控制,没有时钟外设不工作):voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);voidRCC_APB2PeriphClockCmd(uint32_tRCC_AP......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训练深度神经网络对序列数据的每个时间步进行分类,可以使用 序列对序列LSTM网络。序列对序列LSTM网络......
  • 分离式液位传感器优势
    分离式液位传感器相比于传统的光学传感器具有以下优势:分离式液位传感器采用菱镜部分直接设计到用户水箱上,光学组件分离出来置于水箱外部感应。这种设计使得传感器能够更加准确地感应水位的变化,提供更精准的液位检测结果。传统的光学传感器需要将整个传感器安装在水箱内部,可能会与......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    原文链接:http://tecdat.cn/?p=26318原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训​​练深度神经网络对序列数据......
  • 岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测
    岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测桥梁作为交通运输的重要节点,其安全性一直备受关注。不同于其他建筑物,桥梁所处的环境复杂多变,同时,其所需承受的负荷也相对较大,这就需要对桥梁的安全进行高效、准确的监测与评估。随着传感器技术的不断发展,多通道振弦传感......
  • 基于机器视觉和倾角传感器的位姿检测系统及验证
    悬臂式掘进机位姿检测是综掘工作面自动化的基础和前提。只有获取稳定可靠的掘进机实时位姿,才能够在此基础上进行综掘工作面自动化、智能化改造工作。为了提高井下综掘工作面的生产效率,西安电子科技大学机电工程学院的研究团队提出一种基于机器视觉和倾角传感器的悬臂式掘进机位姿......