陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能

这篇具有很好参考价值的文章主要介绍了陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

陀螺仪通常可以读取三个方向上的旋转,即绕X轴、Y轴和Z轴的旋转。每个方向上的旋转包括正向旋转和反向旋转,因此一共有六个位置。这六个位置分别是:1.X轴正向旋转、2.X轴反向旋转、3.Y轴正向旋转、4.Y轴反向旋转、5.Z轴正向旋转、6.Z轴反向旋转
通过检测陀螺仪在每个方向上的旋转,可以确定物体的旋转姿态和方向,从而用于导航、飞行控制等应用。

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

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

视频教学

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

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能

样品申请

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

源码下载

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

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

串口配置

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

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai
配置串口。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

IIC配置

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai
配置IIC为快速模式,速度为400k。
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

CS和SA0设置

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

串口重定向

打开魔术棒,勾选MicroLIB

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

在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 */

参考程序

https://github.com/STMicroelectronics/lsm6dsv16x-pid/tree/main

初始换管脚

由于需要向LSM6DSV16X_I2C_ADD_L写入以及为IIC模式。
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

所以使能CS为高电平,配置为IIC模式。
配置SA0为高电平。

	printf("123123123");
  lsm6dsv16x_reset_t rst;
  stmdev_ctx_t dev_ctx;
  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &SENSOR_BUS;


  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);

获取ID

可以向WHO_AM_I (0Fh)获取固定值,判断是否为0x70。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

lsm6dsv16x_device_id_get为获取函数。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

对应的获取ID驱动程序,如下所示。

  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lsm6dsv16x_device_id_get(&dev_ctx, &whoamI);
	printf("LSM6DSV16X_ID=0x%x,whoamI=0x%x",LSM6DSV16X_ID,whoamI);
  if (whoamI != LSM6DSV16X_ID)
    while (1);

复位操作

可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

lsm6dsv16x_reset_set为重置函数。
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

对应的驱动程序,如下所示。

  /* Restore default configuration */
  lsm6dsv16x_reset_set(&dev_ctx, LSM6DSV16X_RESTORE_CTRL_REGS);
  do {
    lsm6dsv16x_reset_get(&dev_ctx, &rst);
  } while (rst != LSM6DSV16X_READY);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。
可以向CTRL3 (12h)的BDU寄存器写入1进行开启。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

对应的驱动程序,如下所示。

  /* Enable Block Data Update */
  lsm6dsv16x_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

6D方向检测功能配置

1.使能六维位置检测功能,配置陀螺仪模块的中断引脚,使得当六维传感器检测到某种运动时,能够通过中断方式通知主控制器。
可以通过使能MD1_CFG (5Eh)中的INT1_6D开启6D事件。
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

pin_int.sixd = PROPERTY_ENABLE;
lsm6dsv16x_pin_int1_route_set(&dev_ctx, &pin_int);

2.使能中断,将中断配置应用到LSM6DSV16X模块上。
FUNCTIONS_ENABLE (50h)可以开启6D中断。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

在 LSM6DSV16X 传感器的 TAP_CFG0 (56h) 寄存器中,LIR(Latched Interrupt Request)位用于控制中断请求的锁存。如果将 LIR 设为 0(默认值),则表示中断请求不锁存;如果设为 1,则中断请求被锁存。锁存中断意味着一旦中断被触发,它会保持其激活状态直到被明确地通过软件读取或清除。这通常用于确保不会错过任何中断事件,特别是在多任务环境中,其中一个中断可能会在处理另一个中断时发生。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

irq.enable = 1;
irq.lir = 1;
lsm6dsv16x_interrupt_enable_set(&dev_ctx, irq);

选择滤波和角度阈值

滤波可以通过 TAP_CFG0 (56h) 设置低通滤波。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

角度阈值可以通过 TAP_THS_6D (59h) 设置为60度,用于检测姿态变化。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

设置滤波和角度阈值可用以下函数:

lsm6dsv16x_filt_sixd_feed_set(&dev_ctx, LSM6DSV16X_SIXD_FEED_LOW_PASS);
lsm6dsv16x_6d_threshold_set(&dev_ctx, LSM6DSV16X_DEG_60);

设置量程和速率

速率可以通过CTRL1 (10h)设置加速度速率。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

设置加速度量程可以通过CTRL8 (17h)进行设置。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai
设置加速度的量程和速率可以使用如下函数。

/* Set Output Data Rate.*/
  lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_120Hz);
  /* Set full scale */
  lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);

获取所有中断源的状态

判断是否发生了六维传感器事件,如果有发生,则将不同方向的事件标志位按位组合起来,其中包括了传感器的各种状态,比如 FIFO 状态、自由落体、唤醒、六维方向、数据就绪等状态。然后通过一系列的操作和寄存器读写,获取嵌入式功能执行状态、传感器中枢状态等信息,并将这些信息也保存,最后将这些信息返回给主控。这些数据可以通过以下寄存器进行设置。
ALL_INT_SRC (1Dh) 为所有中断的源寄存器,D6D_IA变量包含了自由落体状态的信息。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

D6D_SRC (47h) 用于六维方向识别,该寄存器包含了用于检测设备方向的相关信息。
每个位都对应一个方向,用于表示设备是否在相应的方向上运动。例如,如果XH位和YL位都被置位,则表示设备正在以X轴正方向向上运动,并且Y轴负方向朝下。通过读取D6D_SRC寄存器的值,可以了解设备当前的运动方向,从而进行相应的处理。LSM6DSV16X传感器中的方向检测是基于重力加速度和线性加速度的,因此需要在使用之前进行校准和配置,以适应不同的应用场景。

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai

通过 int32_t lsm6dsv16x_all_sources_get(stmdev_ctx_t *ctx, lsm6dsv16x_all_sources_t *val) 函数可以获取所有中断源的状态。

	lsm6dsv16x_all_sources_t status;

	/* Read output only if new xl value is available */
	lsm6dsv16x_all_sources_get(&dev_ctx, &status);

	if (status.six_d) {
			sixd_event_catched = (status.six_d    << 6) |
								 (status.six_d_zh << 5) |
								 (status.six_d_zl << 4) |
								 (status.six_d_yh << 3) |
								 (status.six_d_yl << 2) |
							 	 (status.six_d_xh << 1) |
								 (status.six_d_xl << 0);
		}

发送相应信息

检查sixd_event_catched的第7位是否为1,如果第7位为1,表示检测到了六维传感器事件。
根据sixd_event_catched的具体数值,通过switch语句匹配不同的情况。每个情况对应着不同的六维传感器位置,并且针对每种情况都会生成相应的消息并调用tx_com函数发送消息。
最后,在处理完六维传感器事件后,将sixd_event_catched重置为0,以便下一次事件的检测。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		/* wait forever (6D event handle in irq handler) */
		lsm6dsv16x_all_sources_t status;

		/* Read output only if new xl value is available */
		lsm6dsv16x_all_sources_get(&dev_ctx, &status);
		
		if (status.six_d) {
			sixd_event_catched = (status.six_d    << 6) |
													 (status.six_d_zh << 5) |
													 (status.six_d_zl << 4) |
													 (status.six_d_yh << 3) |
													 (status.six_d_yl << 2) |
													 (status.six_d_xh << 1) |
													 (status.six_d_xl << 0);
		}
		if (sixd_event_catched & 0x40) {

      switch (sixd_event_catched) {
      case 0x48:
        printf("6D Position A Y↑\r\n");
        break;
      case 0x41:
        printf("6D Position B X↓\r\n");
        break;
      case 0x42:
        printf("6D Position C X↑\r\n");
        break;
      case 0x44:
        printf("6D Position D Y↓\r\n");
        break;
      case 0x60:
        printf("6D Position E Z↑\r\n");
        break;
      case 0x50:
        printf("6D Position F Z↓\r\n");
        break;
      }
      sixd_event_catched = 0;
		}

		
    /* USER CODE END WHILE */

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

演示

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能,单片机,传感器,stm32cube,stm32cubemx,LSM6DSV16X,陀螺仪,6D,加速度,ai文章来源地址https://www.toymoban.com/news/detail-834789.html

到了这里,关于陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 6轴陀螺仪姿态解算

    之前看过学长姿态解算相关代码,因为要做平衡车的项目,希望陀螺仪处理数据能够达到很好的效果,大概2个星期前,看的学长代码,当时把大部分代码看懂是用来干什么的,但原理还是一窍不通,没办法,太高深了hhhhh。用学长的代码很顺利就完成了基本工作,但当时调

    2023年04月08日
    浏览(26)
  • 陀螺仪MPU6050(IIC&源码)

    1. 陀螺仪 1.1   什么是陀螺仪? 检测角度变化的一个装置。 1.1.1  有什么用?? 用于检测角度变化,用角度变化的值判断物体的运动轨迹。 1.1.2  我们怎么用? 我们是使用这个装置(或者说设备)获取到数据,再使用这个数据得到我们想要的信息。 这里我使用陀螺仪获取板

    2024年02月13日
    浏览(30)
  • 陀螺仪小车(Forerake-Car)

    项目简介:搭建一辆有arduino UNO 与rnf24l01组成的小车;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器,利用手势控制器检测手部状态、发送信号对小车进行前进,实现基于卡尔曼滤波的MPU6050姿态结算。 如果你想搭建一辆有Arduino UNO和nRF24L01组成的小车,并使用手势

    2024年02月14日
    浏览(68)
  • 课题学习(十九)----Allan方差:陀螺仪噪声分析

       Allan方差是一种分析时域数据序列的方法,用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解,是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用于惯性传感器

    2024年01月22日
    浏览(32)
  • MPU6050六轴陀螺仪外围电路分析

    MPU6050六轴陀螺仪常用的外围电路设计分析 AUX_DA引脚:用于传输辅助数据。通过该引脚,MPU6050可以与外部设备或其他传感器进行数据交换。可以将其他传感器(如磁力计)连接到AUX_DA引脚,以获取额外的数据或实现其他特殊功能。 AUX_CL引脚:用于提供辅助时钟信号。MPU6050可

    2024年01月25日
    浏览(30)
  • 三轴陀螺仪解算姿态(四元数)

    三轴陀螺仪可以测量载体在三个轴上的角速度分量,对这些角速度进行积分就可以得到旋转的角度,应用到载体上就可以得到载体的姿态。 假设导航坐标系为东北天,载体坐标系为右前上。 初始载体坐标系和导航坐标系重合,对应的四元数为q=[1,0,0,0],使用此四元数表示 载

    2024年02月05日
    浏览(29)
  • 陀螺仪与加速度计的姿态融合——互补滤波

    本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。 阅读本文需有一定的知识基础,可以参见作者以前MPU6050的两篇文章:《MPU6050陀螺仪和加速度计数据的获取和校准》、《MPU6050官方DMP的移植和使用》,以及了解

    2024年02月03日
    浏览(31)
  • 陀螺仪mpu6050的使用(附带HAL的使用)

    我们日常见的陀螺仪模块的使用就是在平衡小车和控制小车的移动上,那么陀螺仪是怎么使用的呢,首先就是能很好的使用I2C,而看到这里,说的一切都是虚的,首先陀螺仪的配置和数据手册大家也是没少看的,但是还是跟我再了解一遍. MPU6050内部整合了三轴MEMS陀螺仪、三轴

    2024年02月13日
    浏览(38)
  • 【QT】OpenGL显示六轴陀螺仪3D实时姿态

    https://blog.csdn.net/qq_35629971/article/details/126203543?spm=1001.2014.3001.5506 新建一个qt的空白工程,附带UI界面,我的工程名称就叫my_3d UI界面可以可以放一些自己想要的按键、文本或者其他控件。这个不影响3D效果的展示,这些控件都会展示在3D效果图的上层,不会被3D效果覆盖 首先我们

    2024年02月02日
    浏览(29)
  • MPU6050 加速度计和陀螺仪传感器与 Arduino 连接

    MPU6050是一款非常流行的加速度计陀螺仪芯片,具有六轴感应和 16 位测量分辨率。这种意义上的高精度和低廉的成本使其在 DIY 社区中非常受欢迎。甚至许多商业产品都配备了 MPU6050。陀螺仪和加速度计的组合通常被称为惯性测量单元或 IMU。 IMU 传感器用于各种应用,例如手机

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包