STM32H5开发(7)----LCD显示TOF检测数据

news2025/1/11 4:05:54

STM32H5开发----7.LCD显示TOF检测数据

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 自主模式与连续模式区别
  • 硬件准备
    • 串口配置
  • 配置串口。
  • IIC配置
  • INT设置
  • 配置使能与复位
  • X-CUBE-TOF1
  • 串口重定向
  • 代码配置
  • TOF代码配置
  • 积分时间/曝光时间(Integration time)
  • 主程序
  • 状态说明
  • 演示结果

概述

“自主模式”(Autonomous mode)通常指的是设备或系统能够在没有外部输入的情况下独立完成任务。对于传感器,如VL53L5,自主模式可能意味着传感器可以独立、定期地进行测量,而不需要来自主控制器或主机的每一次单独指令。

最近在弄ST的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述
选择使用自主模式的原因可能包括:
简化控制:一旦配置完成,传感器可以独立工作,减少主控制器与传感器之间的通信需求。
稳定的测量频率:在自主模式下,传感器可以以固定的频率进行测量,从而确保数据的稳定性和连续性。
减少响应延迟:由于传感器持续地或定期地进行测量,数据可能会更快地准备好,从而减少了从请求到获取数据的延迟。
主控制器工作量减少:主控制器可以被释放出来执行其他任务,而不是持续地向传感器发送测量命令。
低功耗应用:对于某些传感器,自主模式可能更加能效,因为它可以在测量之间进入低功耗状态。
实现预定任务:自主模式允许传感器在特定条件下执行预定的任务,例如当检测到某个特定值时触发警报。
然而,是否使用自主模式取决于特定的应用需求。有些应用可能更倾向于连续模式,其中主控制器更频繁地与传感器交互,以获得实时数据或更高的控制精度。

视频教学

https://www.bilibili.com/video/BV1S84y117QR/

VL53L5CX驱动开发(2)----设置自主模式

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

在这里插入图片描述

源码下载

https://download.csdn.net/download/qq_24312945/88410573

自主模式与连续模式区别

VL53L5CX 传感器的自主模式 (AUTONOMOUS) 和连续模式 (CONTINUOUS) 都允许连续的测量操作,但它们的工作方式和使用场景略有不同:
连续模式 (CONTINUOUS):
● 在此模式下,传感器连续进行测量,每次测量后,就会产生一个新的结果。
● 传感器会尽可能快地测量,基于所设置的时间预算。
● 主机通常需要周期性地从传感器中读取数据。
● 适用于需要高更新率或实时响应的应用。
自主模式 (AUTONOMOUS):
● 传感器独立地进行测量,而无需主机的常规干预。
● 主机可以进入低功耗休眠模式,而传感器仍然独立地执行测量。当传感器完成测量时,它可以通过中断唤醒主机,通知它读取数据。
● 这种模式特别适用于低功耗应用,因为大部分时间主机可以处于休眠状态。
● 这种模式可能与设置的测量频率或时间间隔一起使用,以确定传感器执行测量的频率。
总的来说,选择哪种模式取决于应用的需求。如果需要实时的高更新率数据,则连续模式可能更合适;而对于低功耗或不需要实时数据的应用,自主模式可能是更好的选择。

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
在这里插入图片描述

串口配置

查看原理图,PB14和PB15设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这个应用中,VL53L5CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L5CX模块的I2C引脚连接到主控器的PC8和PC9两个IO口。

在这里插入图片描述

配置IIC为快速模式,速度为400k。

在这里插入图片描述

INT设置

自主模式可以通过获取INT管脚进行判断数据是否准备好。

在这里插入图片描述

配置PA8为输入模式。

在这里插入图片描述

配置使能与复位

驱动中有对模块进行复位的操作。

在这里插入图片描述

配置PC7和PA9为输出管脚。

在这里插入图片描述

X-CUBE-TOF1

本节介绍在不需要使用样例应用时如何使用STM32CubeMX将X-CUBE-TOF1软件包添加到项目中。有了这样的设置,就只配置了驱动层。

在这里插入图片描述

由于需要自主模式,所以可以不开启主程序TOF执行代码。

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB
在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}
/* USER CODE END PFP */

代码配置

在custom_ranging_sensor.c代码中,有IO口驱动VL53L5CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。
在这里插入图片描述

由于没加载串口定义,所以注释掉#include “custom.h”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TOF代码配置

在main.c中添加刷新速率,500ms刷新一次,所以频率为2Hz。

/* USER CODE BEGIN Includes */
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"

#include "stdio.h"
#include "custom_ranging_sensor.h"

#define TIMING_BUDGET (5U) /* 5 ms < TimingBudget < 1000 ms */
#define RANGING_FREQUENCY (200U) /* Ranging frequency Hz (shall be consistent with TimingBudget value) */
#define POLLING_PERIOD (1000U/RANGING_FREQUENCY) /* refresh rate for polling mode (milliseconds) */


/* USER CODE END Includes */

函数与变量定义:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

static uint8_t map_target_status(uint8_t status);
//将从VL53L5CX传感器获取的数据转换
static int32_t convert_data_format(VL53L5CX_Object_t *pObj,VL53L5CX_ResultsData *data, RANGING_SENSOR_Result_t *pResult);
//打印数据
static void print_result(RANGING_SENSOR_Result_t *Result);
static RANGING_SENSOR_ProfileConfig_t Profile;
static int32_t status = 0;
static RANGING_SENSOR_Result_t Result;
/* USER CODE END PFP */

添加TOF初始化。
若需要为8*8,修改对应vl53l5cx_set_resolution参数即可。
其中vl53l5cx_set_integration_time_ms和vl53l5cx_set_ranging_frequency_hz加载了对应的刷新速率。


  /* USER CODE BEGIN 2 */
	LCD_Init();//LCD初始化
	
	LCD_Fill(0,0,320,480,RED)	;	
	LCD_Fill(0,0,320,480,WHITE)	;		
	
	LCD_ShowString(0,0,"MCU:STM32H503RBT6",BLACK,WHITE,32,0);
	LCD_ShowString(0,32,"TOF:VL53L5CX",BLACK,WHITE,32,0);	
	LCD_ShowString(0,64,"MODE: ",BLACK,WHITE,32,0);	;	
//	
	LCD_ShowChinese32x32(96,64,"自",BLACK,WHITE,32,0);
	LCD_ShowChinese32x32(128,64,"主",BLACK,WHITE,32,0);
	LCD_ShowChinese32x32(160,64,"模",BLACK,WHITE,32,0);
	LCD_ShowChinese32x32(192,64,"式",BLACK,WHITE,32,0);
	
	HAL_Delay(500);	
	
	
  /*********************************/
  /*  Set ranging mode autonomous  */
  /*********************************/
  VL53L5CX_Object_t *pL5obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L5CX];
  static VL53L5CX_ResultsData data;
  uint8_t NewDataReady = 0;

  // 设置测距的配置文件为 4x4 的连续测量模式
  Profile.RangingProfile = RS_PROFILE_8x8_CONTINUOUS;

  // 设置测量的时间预算,这通常决定了测量的速度和准确度
  Profile.TimingBudget = TIMING_BUDGET; /* 5 ms < TimingBudget < 1000 ms */

  // 设置测量的频率,这决定了传感器执行测量的速率
  Profile.Frequency = RANGING_FREQUENCY; /* Ranging frequency Hz (shall be consistent with TimingBudget value) */

  // 确定是否启用环境光测量,0为禁用,1为启用
  Profile.EnableAmbient = 0; /* Enable: 1, Disable: 0 */

  // 确定是否启用信号测量,0为禁用,1为启用
  Profile.EnableSignal = 0; /* Enable: 1, Disable: 0 */

  pL5obj->IsAmbientEnabled = Profile.EnableAmbient;
  pL5obj->IsSignalEnabled = Profile.EnableSignal;

  /*
     use case VL53L5CX_PROFILE_4x4_CONTINUOUS:
  */
	// 设置传感器的测量分辨率为 4x4
  status = vl53l5cx_set_resolution(&(pL5obj->Dev), VL53L5CX_RESOLUTION_8X8);
	// 设置传感器的测量模式为自主模式
  status |= vl53l5cx_set_ranging_mode(&(pL5obj->Dev), VL53L5CX_RANGING_MODE_AUTONOMOUS);
	// 设置传感器的集成时间,这通常关联到测量的时间预算
	status |= vl53l5cx_set_integration_time_ms(&(pL5obj->Dev), TIMING_BUDGET);
	// 设置传感器的测量频率,决定了传感器执行测量的速率
	status |= vl53l5cx_set_ranging_frequency_hz(&(pL5obj->Dev), RANGING_FREQUENCY);

  if (status != VL53L5CX_STATUS_OK)
  {
    printf("ERROR : Configuration programming error!\n\n");
    while (1);
  }

  status = vl53l5cx_start_ranging(&(pL5obj->Dev));
  if (status != VL53L5CX_STATUS_OK)
  {
    printf("vl53l5cx_start_ranging failed\n");
    while (1);
  }	
	
	
  /* USER CODE END 2 */





积分时间/曝光时间(Integration time)

在这里插入图片描述

积分时间是一项仅在使用自主测距模式时可用的功能(请参阅第 4.5 节测距模式)。 它允许用户在启用 VCSEL 时更改时间。 如果测距模式设置为连续,则更改积分时间无效。 默认积分时间设置为 5 ms。
对于 4x4 和 8x8 分辨率,积分时间的影响是不同的。 分辨率 4x4 由一个积分时间组成,8x8 分辨率由四个积分时间组成。 下图表示两种分辨率的 VCSEL 发射。
在这里插入图片描述

所有积分时间之和 + 1 ms 开销必须低于测量周期,否则测距周期将自动增加。

主程序

主程序来获取对应的INT位状态来判定数据是否准备好。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {	
    /* polling mode */
	if(HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_8) ==0)		
	{
		do {
    (void)vl53l5cx_check_data_ready(&(pL5obj->Dev), &NewDataReady);
    } while (!NewDataReady);
		
    if (NewDataReady != 0)
    {
      status = vl53l5cx_get_ranging_data(&(pL5obj->Dev), &data);

      if (status == VL53L5CX_STATUS_OK)
      {
        /*
         Convert the data format to Result format.
         Note that you can print directly from data format
        */
        if (convert_data_format(pL5obj, &data, &Result) < 0)
        {
          printf("convert_data_format failed\n");
          while (1);
        }
        print_result(&Result);
      }
    }				
	}					
	uint32_t colour=0;		
	if(LCD_flag)
	{
		LCD_flag=0;
		uint8_t H,L;
		for(int i=0;i<64;i++)
		{
			H=7-i/8;
			L=7-i%8;
			if(tof_data[i]<500)
			{
			LCD_ShowIntNum(L*40,H*40+160,tof_data[i],5,WHITE,RED,16);		
			LCD_Fill(L*40,H*40+160+16,L*40+40,H*40+160+40,  RED);
			}
			else if(tof_data[i]>=500&&tof_data[i]<700)
			{
			LCD_ShowIntNum(L*40,H*40+160,tof_data[i],5,WHITE,GREEN,16);		
			LCD_Fill(L*40,H*40+160+16,L*40+40,H*40+160+40,  GREEN);				
			}
			else if(tof_data[i]>=700&&tof_data[i]<9000)			
			{
			LCD_ShowIntNum(L*40,H*40+160,tof_data[i],5,WHITE,BLACK,16);	
			LCD_Fill(L*40,H*40+160+16,L*40+40,H*40+160+40,  BLACK);	
			}				
			else
			{
			LCD_ShowString(L*40,H*40+160,"  X  ",WHITE,BLACK,16,0);	
			LCD_Fill(L*40,H*40+160+16,L*40+40,H*40+160+40,  BLACK);					
			}	
		}
	
	}			
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  

状态说明

正常的数据返回状态为5,为了保持数据一致,用户需要过滤无效的目标器状态。为了给出信心评级,状态为5的目标被认为是100%有效的。6或9的状态可以用50%的置信度来考虑。所有其他状态都低于50%置信度。

在这里插入图片描述

演示结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试工程师面试题,这些你有没有遇到过呢?

其实在软件测试领域面试题多余牛毛&#xff0c;采取疯狂刷题的方式确实可以解决不少面试中可能碰到的问题&#xff0c;而且可以学到一些知识。但是&#xff0c;有可能刷的面试题一个都问不到。 如何才能解除上述尴尬&#xff0c;一定要记得不要脱离一个核心目的&#xff1a;找…

【redhat9.2】搭建Discuz-X3.5网站

步骤 1.配置软件仓库 2.安装对应的软件 httpd php* mariadb* 3.启动服务 httpd mariadb 4.配置数据库 创建数据库 修改root密码 数据库的 5.传源码包&#xff08;Discuz-X3.5&#xff09; 解压 6.web页面初始化 关闭防火墙 允许http服务通过 修改权限 实…

77 全排列

全排列 题解1 回溯&#xff08;经典思路&#xff09;题解2 正向思路——可作模板 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2…

数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

文章目录 数据结构上机实验1.要求2.二叉树的实现2.1创建一颗二叉树2.2对这棵二叉树进行遍历2.3求二叉树的深度/节点数目/叶节点数目2.4计算二叉树中度为 1 或 2 的结点数2.5判断2棵二叉树是否相似&#xff0c;若相似返回1&#xff0c;否则返回0 3.全部源码测试&#xff1a;Bina…

c语言进阶部分详解(详细解析动态内存管理)

上篇文章介绍了枚举&#xff0c;联合相关的内容&#xff0c;大家可以点击链接进行浏览&#xff1a;c语言进阶部分详解&#xff08;详细解析自定义类型——枚举&#xff0c;联合&#xff08;共用体&#xff09;&#xff09;-CSDN博客 各种源码大家可以去我的github主页进行查找…

业务设计——海量订单数据如何存储和查询

冷热数据架构 假设我们考虑 12306 单个假期的人流量为 2 亿人次&#xff0c;这一估算基于每年的三个主要假期&#xff1a;五一、国庆和春节。这些假期通常都有来回的流动&#xff0c;因此数据存储与计算的公式变为&#xff1a;2 * (3*2) 12 亿&#xff0c;即每年的假期总人次达…

el -table 多层级嵌套

只要你后端可以查到数据这个层级可以无限嵌套 这里用了懒加载&#xff0c;每次点击的时候将当前点击的父级id作为查询条件&#xff0c;向后端发送请求&#xff0c;来获取他子级的数据&#xff0c;并不是将所有数据查出来拼接返回的。 前端代码 <el-table:data"dataLis…

12、SpringCloud -- redis库存和redis预库存保持一致、优化后的压测效果

目录 redis库存和redis预库存保持一致问题的产生需求:代码:测试:优化后的压测效果之前的测试数据优化后的测试数据redis库存和redis预库存保持一致 redis库存是指初始化是从数据库中获取最新的秒杀商品列表数据存到redis中 redis的预库存是指每个秒杀商品每次成功秒杀之后…

【JAVA学习笔记】52 - 本章作业

1.字符反转 注意String是final的不能改变需要toCharArray改成char数组 返回String需要将char改成valueOf改为String public class HomeWork01 {public static void main(String[] args) {String str "0123456789";//改变的是char&#xff0c;和str无关try {System…

项目|金额场景计算BigDecimal使用简记

前言 在实际项目开发中&#xff0c;我们经常会遇到一些金额计算&#xff0c;分摊等问题&#xff0c;通常我们都使用java.math.BigDecimal 来完成各种计算&#xff0c;避免使用浮点数float,double来计算金额&#xff0c;以免丢失精度&#xff0c;以下是博主部分使用场景和使用Bi…

element-plus走马灯不显示

问题描述 依赖正确&#xff0c;代码用法正确&#xff0c;但是element-plu走马灯就是不显示&#xff01;&#xff01; <div class"content"><el-carousel height"150px" width"200px"><el-carousel-item v-for"item in 4&qu…

联想电脑thinkpad x13摄像头打不开,史上最全的针对联想电脑摄像头的解决方案

前言 最近面试&#xff0c;临近面试的前30min&#xff0c;发现摄像头打不开。具体情况如下&#xff1a; 这可没把我吓坏&#xff0c;我可是要露脸的&#xff0c;最后在我的不屑努力下&#xff0c;我选择了手机视频面试&#xff0c;很干。未来的几天都在琢磨这玩意儿了&#…

Docker 部署spring-boot项目(超详细 包括Docker详解、Docker常用指令整理等)

文章目录 DockerDocker的定义Docker有哪些作用Docker有哪些好处使用docker部署springboot项目安装docker创建Dockerfile镜像文件执行镜像文件(Dockerfile文件)查看Docker镜像启动容器查看Docker中运行的容器查看服务容器日志 Docker常用指令查看docker安装目录启动Docker停止Do…

MGRE环境下的OSPF

实验拓扑 需求 1 R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2 R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3 所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成。 IP规划 配置IP R1 # interface GigabitEt…

第三次ACM校队周赛考核题+生活随笔

本周ACM校队周赛考核题 1.简单数学&#xff08;签到题&#xff09; 题目&#xff1a; Joker想要买三张牌&#xff0c;但是三张牌太少了&#xff0c;老板不卖&#xff0c;除非Joker算出老板给出的数学题。 现在老板给出t组数据&#xff0c;每一组数据有三个数a,b,c&#xff0c…

【从0到1设计一个网关】整合Nacos-服务注册与服务订阅的实现

文章目录 Nacos定义服务注册与订阅方法服务信息加载与配置实现将网关注册到注册中心实现服务的订阅 Nacos Nacos提供了许多强大的功能&#xff1a; 比如服务发现、健康检测。 Nacos支持基于DNS和基于RPC的服务发现。 同时Nacos提供对服务的实时的健康检查&#xff0c;阻止向不…

【JavaSE】运算符详解及与C语言中的区别

在文章的最后&#xff0c;总结了Java与C语言的某些不同点 目录 一、什么是运算符 二、算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符/-- 三、关系运算符 四、逻辑运算符&#xff08;重点&#xff09; 1.逻辑与&& 2.逻辑或|| 3.逻辑非 4.补…

SQL Server 安装失败 服务“MSSQLServerOLAPService”启动请求失败 一定有效的解决方案

问题描述 首次安装 SQL Server 2022&#xff0c;在安装结束时出现弹窗“无法启动服务。原因&#xff1a;服务“MSSQLServerOLAPService”启动请求失败”。 点击“确定”按钮后&#xff0c;出现新弹窗。 问题原因 在Windows服务中手动启动“MSSQLServerOLAPService”&#x…

建筑木模板现货供应,广东隧道地铁木模板批发。

我们是一家专业供应建筑木模板的公司&#xff0c;提供广东地区的现货供应服务。我们特别推荐我们的隧道地铁木模板&#xff0c;专为隧道和地铁工程而设计&#xff0c;为工程施工提供优质可靠的支撑材料。我们的隧道地铁木模板采用高品质的木材制造而成&#xff0c;具有卓越的强…

muduo源码剖析之Buffer缓冲区类

简介 Buffer封装了一个可变长的buffer&#xff0c;支持廉价的前插操作&#xff0c;以及内部挪腾操作避免额外申请空间 使用vector作为缓冲区(可自动调整扩容) 设计图 源码剖析 已经编写好注释 buffer.h // Copyright 2010, Shuo Chen. All rights reserved. // http://c…