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


    概述

    “自主模式”(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):
    ● 传感器独立地进行测量,而无需主机的常规干预。
    ● 主机可以进入低功耗休眠模式,而传感器仍然独立地执行测量。当传感器完成测量时,它可以通过中断唤醒主机,通知它读取数据。
    ● 这种模式特别适用于低功耗应用,因为大部分时间主机可以处于休眠状态。
    ● 这种模式可能与设置的测量频率或时间间隔一起使用,以确定传感器执行测量的频率。
    总的来说,选择哪种模式取决于应用的需求。如果需要实时的高更新率数据,则连续模式可能更合适;而对于低功耗或不需要实时数据的应用,自主模式可能是更好的选择。

    生成STM32CUBEMX

    选择MCU

    测试版所用的MCU为STM32G431CB。
    在这里插入图片描述

    串口配置

    查看原理图,PA9和PA10设置为开发板的串口。
    在这里插入图片描述

    配置串口。
    在这里插入图片描述

    IIC配置

    在这个应用中,VL53L5CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L5CX模块的I2C引脚连接到主控器的PA8和PB5两个IO口。
    在这里插入图片描述

    配置IIC为快速模式,速度为400k。
    在这里插入图片描述

    INT设置

    自主模式可以通过获取INT管脚进行判断数据是否准备好。
    在这里插入图片描述

    配置PB4为输入模式。
    在这里插入图片描述

    配置使能与复位

    驱动中有对模块进行复位的操作。
    在这里插入图片描述

    配置PB15和PB3为输出管脚。
    在这里插入图片描述

    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 */
    
    • 1
    • 2
    • 3

    函数声明和串口重定向:

    /* 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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码配置

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

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

    在这里插入图片描述

    在这里插入图片描述

    TOF代码配置

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

    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    #include "custom_ranging_sensor.h"
    
    #define TIMING_BUDGET (500U) /* 5 ms < TimingBudget < 1000 ms */
    #define RANGING_FREQUENCY (2U) /* 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 */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    函数与变量定义:

    /* 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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

      /* USER CODE BEGIN 2 */
      VL53L5CX_Object_t *pL5obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L5CX];
      static VL53L5CX_ResultsData data;
      uint8_t NewDataReady = 0;
    
      // 设置测距的配置文件为 4x4 的连续测量模式
      Profile.RangingProfile = RS_PROFILE_4x4_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_4X4);
    	// 设置传感器的测量模式为自主模式
      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 */
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    积分时间/曝光时间(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  ( GPIOB, GPIO_PIN_14) ==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);
          }
        }		
    		
    	}		
    		
    		
    		
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    演示结果

    当分辨率为4*4时候,需要积分1次,设置的积分时间为500ms,那么对应的频率应该是2Hz。

    在这里插入图片描述

    当分辨率为8*8时候,需要积分4次,设置的积分时间为500ms,那么对应的频率应该是0.5Hz。

    在这里插入图片描述

    配置完成侯可以在Tera Term下查看结果,如下是4*4的显示。

    在这里插入图片描述

  • 相关阅读:
    通过图片id请求后端服务,将图片渲染到页面,渲染不成功?
    java项目-第95期基于ssm的医院智能管理系统-java毕业设计
    【OpenDDS开发指南V3.20】第五章:内容订阅配置文件
    maven创建父子依赖项目—pom
    typescript---配置类相关内容(十五)
    关于数据权限的设计
    systemctl 命令设置开机自启动失败
    7000+字图文并茂解带你深入理解java锁升级的每个细节
    微信小程序 25 npm模块和PubSubJS实现页面通讯
    upload-labs/Pass-07 未知后缀名解析漏洞复现
  • 原文地址:https://blog.csdn.net/qq_24312945/article/details/133722644