0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

陀螺仪LSM6DSV16X与AI集成(9)----中断获取FIFO数据并应用MotionFX库解析空间坐标

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-07-18 10:46 次阅读

概述

本文将探讨如何使用中断机制获取FIFO数据并应用MotionFX库解析空间坐标。MotionFX库是一种用于传感器融合的强大工具,可以将加速度计、陀螺仪和磁力计的数据融合在一起,实现精确的姿态和位置估计。本文将介绍如何初始化和配置MotionFX库,使用中断机制读取FIFO中的传感器数据。FIFO可以作为数据缓冲区,存储传感器的临时数据,防止数据丢失,特别是在处理器忙于其他任务时。本文将利用这些数据进行空间坐标的解析。本章案例基于上节的demo进行修改。

需要样片的可以加群申请:615061293 。

视频教学

[https://www.bilibili.com/video/BV1rx4y147Yv/]

样品申请

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

源码下载

[https://download.csdn.net/download/qq_24312945/89491135]

开启LED

配置PB14为输出模式。

开启INT中断

陀螺仪LSM6DSV16X的中断管脚接到了PA6,需要将PA6设置为中端口。

开启中断。

参考驱动程序

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

复位 FIFO

  1. 设置 FIFO 进入 Bypass 模式:将 FIFO_CTRL4 寄存器的 FIFO_MODE 位设置为 000。
  2. 将 FIFO 重新设置为所需模式:在复位命令之后,可以通过将 FIFO_CTRL4 寄存器的 FIFO_MODE 位设置为所需的模式(例如 001 表示 FIFO 模式)。

lsm6dsv16x_fifo_mode_set(&dev_ctx, LSM6DSV16X_BYPASS_MODE);
    HAL_Delay(10);

添加到设置FIFO开启之前。

中断读取传感器数据

为了使用回调函数并获取FIFO中的数据,在main.c定义了以下变量。

/* USER CODE END 0 */
stmdev_ctx_t dev_ctx;
lsm6dsv16x_fifo_status_t fifo_status;

/// 用于存储FIFO中读取的数据,每条数据包含7个字节(1个标签字节和6个数据字节)
uint8_t fifo_data[FIFO_WATERMARK*2][7];
// FIFO中当前存储的数据数量
uint16_t fifo_num = 0;
// FIFO中断标志,用于标记是否有新的FIFO数据可供读取
uint8_t fifo_flag=0;

/* USER CODE END 0 */

mian.c中开启中断。

lsm6dsv16x_pin_int_route_t pin_int;
    lsm6dsv16x_pin_int1_route_get(&dev_ctx, &pin_int);
  pin_int.fifo_th = PROPERTY_ENABLE;
  lsm6dsv16x_pin_int1_route_set(&dev_ctx, &pin_int);

stm32h5xx_it.c中添加回调函数引用。

/* USER CODE BEGIN 0 */
extern void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);


/* USER CODE END 0 */

处理PA6外部中断线6(EXTI Line6)的中断。

/**
  * @brief This function handles EXTI Line6 interrupt.
  */
void EXTI6_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI6_IRQn 0 */

HAL_GPIO_EXTI_Callback(GPIO_PIN_6);

  /* USER CODE END EXTI6_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  /* USER CODE BEGIN EXTI6_IRQn 1 */

  /* USER CODE END EXTI6_IRQn 1 */
}

在main.c中添加回调函数的定义,检查中断是否由 GPIO_PIN_6 引脚触发,每次发生中断时从传感器获取当前的FIFO状态,并存储在 fifo_status 变量中。读取FIFO数据,并将这些数据存储在一个全局数组 fifo_data 中,以便在主循环或其他地方进行处理。通过切换 LED 的状态,可以直观地了解中断的发生。

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){

    if(GPIO_Pin == GPIO_PIN_6)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
        lsm6dsv16x_fifo_status_get(&dev_ctx, &fifo_status);
        uint16_t num = 0;
    if (fifo_status.fifo_th == 1) {
            fifo_flag=1;
      num = fifo_status.fifo_level;
            fifo_num=num;
//      printf( "-- FIFO num %d rn", num);    
            uint16_t num_i;
      for(int i=0;i< num;i++)  {
        lsm6dsv16x_fifo_out_raw_t f_data;

        /* Read FIFO sensor value */
        lsm6dsv16x_fifo_out_raw_get(&dev_ctx, &f_data);

                fifo_data[i][0]=f_data.tag;
                fifo_data[i][1]=f_data.data[0];
                fifo_data[i][2]=f_data.data[1];
                fifo_data[i][3]=f_data.data[2];
                fifo_data[i][4]=f_data.data[3];
                fifo_data[i][5]=f_data.data[4];
                fifo_data[i][6]=f_data.data[5];                

//                printf("data[0]=%d,data[1]=%d,data[2]=%d,data[3]=%d,data[4]=%d,data[5]=%d,data[6]=%dn",
//                fifo_data[i][0],
//                fifo_data[i][1],fifo_data[i][2],fifo_data[i][3],fifo_data[i][4],fifo_data[i][5],fifo_data[i][6]);

      }    
        }    

    }
}
/* USER CODE END 4 */

主程序

在主循环中检查FIFO中断标志,如果有新的FIFO数据,则读取并处理这些数据。处理完成后,调用MotionFX库函数进行数据融合计算,以获得传感器的姿态和位置。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {    
    if(fifo_flag)// 如果 FIFO 中断标志被设置
    {
        uint8_t acc_flag=0,gyr_flag=0;//加速度角速度标志位
        uint8_t deltatime_flag=0;//时间标志位
        for(int i=0;i< fifo_num;i++)// 遍历 FIFO 数据数组
        {
            // 获取数据指针
            datax = (int16_t *)&fifo_data[i][1];
            datay = (int16_t *)&fifo_data[i][3];
            dataz = (int16_t *)&fifo_data[i][5];
            ts = (int32_t *)&fifo_data[i][1];
            // 根据数据标签处理不同类型的数据
            switch (fifo_data[i][0]) {
        case LSM6DSV16X_XL_NC_TAG:// 加速度数据
                    acc_flag=1;
                    acc_x=lsm6dsv16x_from_fs4_to_mg(*datax);
                    acc_y=lsm6dsv16x_from_fs4_to_mg(*datay);
                    acc_z=lsm6dsv16x_from_fs4_to_mg(*dataz);                
          break;
        case LSM6DSV16X_GY_NC_TAG:// 角速度数据
                    gyr_flag=1;
                    gyr_x=lsm6dsv16x_from_fs4000_to_mdps(*datax);
                    gyr_y=lsm6dsv16x_from_fs4000_to_mdps(*datay);
                    gyr_z=lsm6dsv16x_from_fs4000_to_mdps(*dataz);                    
          break;                
        case LSM6DSV16X_TIMESTAMP_TAG:// 时间戳数据
                    deltatime_flag=1;
                    if(deltatime_first==0)//第一次
                    {
                        deltatime_1=*ts;
                        deltatime_2=deltatime_1;
                        deltatime_first=1;
                    }
                    else
                    {
                        deltatime_2=*ts;
                    }                
          break;
        default:
          break;                
            }
            // 如果加速度、角速度和时间戳数据都已获取
            if(acc_flag&&gyr_flag&&deltatime_flag)
            {
                lsm6dsv16x_motion_fx_determin();// 调用 MotionFX 处理函数
                acc_flag=0;
                gyr_flag=0;
                deltatime_flag=0;
                deltatime_1=deltatime_2;    // 更新时间戳        
            }            
        }
        // 清除 FIFO 标志和数据量
        fifo_flag=0;
        fifo_num=0;
        }    
//            HAL_Delay(10);

    /* USER CODE END WHILE */

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

演示

初始位置和数据输出如下所示。

逆时针旋转90°

逆时针旋转180°

逆时针旋转270°

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 陀螺仪
    +关注

    关注

    44

    文章

    763

    浏览量

    98077
  • fifo
    +关注

    关注

    3

    文章

    382

    浏览量

    43343
  • AI
    AI
    +关注

    关注

    87

    文章

    28547

    浏览量

    265820
收藏 人收藏

    评论

    相关推荐

    陀螺仪LSM6DSV16XAI集成(1)----轮询获取陀螺仪数据

    会被转换为适当的单位通过串行通信输出。这个代码是一个很好的起点,用于了解如何操作 LSM6DSV16X 传感器获取数据
    的头像 发表于 12-18 10:49 1151次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(1)----轮询<b class='flag-5'>获取</b><b class='flag-5'>陀螺仪</b><b class='flag-5'>数据</b>

    陀螺仪LSM6DSV16XAI集成(2)----姿态解算

    LSM6DSV16X包含三轴陀螺仪与三轴加速度计。
    的头像 发表于 12-18 10:51 1487次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(2)----姿态解算

    陀螺仪LSM6DSV16XAI集成(3)----读取融合算法输出的四元数

    LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗传感器融合(SFLP)算法:
    的头像 发表于 12-18 10:53 865次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(3)----读取融合算法输出的四元数

    陀螺仪LSM6DSV16XAI集成(7)----FIFO数据读取与配置

    LSM6DSV16X是一款高性能、低功耗的6轴IMU传感器,集成了3轴加速度计和3轴陀螺仪。本文将详细介绍如何配置和读取LSM6DSV16X
    的头像 发表于 07-18 10:40 762次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(7)----<b class='flag-5'>FIFO</b><b class='flag-5'>数据</b>读取与配置

    陀螺仪LSM6DSV16XAI集成(8)----MotionFX解析空间坐标

    本文将探讨如何使用MotionFX解析空间坐标MotionFX
    的头像 发表于 07-18 10:43 652次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(8)----<b class='flag-5'>MotionFX</b><b class='flag-5'>库</b><b class='flag-5'>解析</b><b class='flag-5'>空间</b><b class='flag-5'>坐标</b>

    驱动LSM6驱动LSM6DS3TR-C实现高效运动检测与数据采集(7)----MotionFX解析空间坐标DS3TR-C实现高效运动检测与数据

    本文将探讨如何使用MotionFX解析空间坐标MotionFX
    的头像 发表于 07-18 11:02 728次阅读
    驱动<b class='flag-5'>LSM6</b>驱动<b class='flag-5'>LSM6</b>DS3TR-C实现高效运动检测与<b class='flag-5'>数据</b>采集(7)----<b class='flag-5'>MotionFX</b><b class='flag-5'>库</b><b class='flag-5'>解析</b><b class='flag-5'>空间</b><b class='flag-5'>坐标</b>DS3TR-C实现高效运动检测与<b class='flag-5'>数据</b>采

    陀螺仪LSM6DSOW开发(3)----FIFO数据读取与配置

    本文档旨在详细介绍如何配置和读取LSM6DSOW传感器的FIFO数据LSM6DSOW是一款高性能的6轴IMU(惯性测量单元),
    的头像 发表于 08-05 10:03 981次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6</b>DSOW开发(3)----<b class='flag-5'>FIFO</b><b class='flag-5'>数据</b>读取与配置

    陀螺仪LSM6DSOW开发(5)----MotionFX解析空间坐标

    本文将探讨如何使用MotionFX解析空间坐标MotionFX
    的头像 发表于 08-15 18:13 1248次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6</b>DSOW开发(5)----<b class='flag-5'>MotionFX</b><b class='flag-5'>库</b><b class='flag-5'>解析</b><b class='flag-5'>空间</b><b class='flag-5'>坐标</b>

    请问lsm6dsv16x可以直接读取触摸手势吗?

    已经读出来了LSM6DSV16x的QVRmv值,也写出了单击的状态机。但是在写触摸滑动手势时没有找到好的计算方式。请问是不是有直接读出这些手势的函数?
    发表于 07-02 08:14

    LSM9DS1 FIFO适用于陀螺仪和acc吗?

    不同的阈值。我对如何设置FIFO中断服务感到有点困惑。在9DS0中,可以在DRDY_G引脚上直接设置陀螺仪fifo
    发表于 10-10 16:04

    求助,是否有在LSM6DSV16X中使用传感器融合低功耗算法的示例

    你好我想知道是否有在 LSM6DSV16X 中使用传感器融合低功耗算法的示例。我想检索当前的 Heading、Pitch 和 Roll 信息。或者我也很高兴有一个例子解释如何从 SFLP 中获取四元
    发表于 02-03 09:12

    ST LSM6DSV16X iNEMO惯性模块相关的使用信息和应用提示

    AN5763,LSM6DSV16X是一款ST的3 轴加速度计和 3 轴陀螺仪LSM6DSV16X 是系统级封装的 3 轴数字加速度计和 3 轴数字陀螺仪,具有数字 I²C、SPI
    发表于 08-31 11:12 0次下载

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

    陀螺仪通常可以读取三个方向上的旋转,即绕X轴、Y轴和Z轴的旋转。每个方向上的旋转包括正向旋转和反向旋转,因此一共有六个位置。这六个位置分别是:1.X轴正向旋转、2.X轴反向旋转、3.Y
    的头像 发表于 01-09 16:14 731次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(5)----<b class='flag-5'>6</b>D方向检测功能

    驱动LSM6DS3TR-C实现高效运动检测与数据采集(8)----中断获取FIFO数据应用MotionFX解析空间坐标

    本文将探讨如何使用中断机制获取FIFO数据应用MotionFX
    的头像 发表于 07-21 10:02 350次阅读
    驱动<b class='flag-5'>LSM6</b>DS3TR-C实现高效运动检测与<b class='flag-5'>数据</b>采集(8)----<b class='flag-5'>中断</b><b class='flag-5'>获取</b><b class='flag-5'>FIFO</b><b class='flag-5'>数据</b><b class='flag-5'>并</b>应用<b class='flag-5'>MotionFX</b><b class='flag-5'>库</b><b class='flag-5'>解析</b><b class='flag-5'>空间</b><b class='flag-5'>坐标</b>

    陀螺仪LSM6DSOW开发(4)----中断获取FIFO数据

    本文将探讨如何使用中断机制获取FIFO数据应用MotionFX
    的头像 发表于 08-08 16:03 196次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6</b>DSOW开发(4)----<b class='flag-5'>中断</b><b class='flag-5'>获取</b><b class='flag-5'>FIFO</b><b class='flag-5'>数据</b>