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

    文章

    781

    浏览量

    98650
  • fifo
    +关注

    关注

    3

    文章

    387

    浏览量

    43634
  • AI
    AI
    +关注

    关注

    87

    文章

    30643

    浏览量

    268825
收藏 人收藏

    评论

    相关推荐

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

    会被转换为适当的单位通过串行通信输出。这个代码是一个很好的起点,用于了解如何操作 LSM6DSV16X 传感器获取数据
    的头像 发表于 12-18 10:49 1699次阅读
    <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 2181次阅读
    <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 1190次阅读
    <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 1473次阅读
    <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 1167次阅读
    <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 1113次阅读
    驱动<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开发(5)----MotionFX解析空间坐标

    本文将探讨如何使用MotionFX解析空间坐标MotionFX
    的头像 发表于 08-15 18:13 1639次阅读
    <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>

    陀螺仪LSM6DSV16XAI集成(11)----融合磁力计进行姿态解算

    MotionFX包含用于校准陀螺仪、加速度计和磁力计传感器的例程。 将磁力计的数据与加速度计和陀螺仪
    的头像 发表于 09-06 16:57 1921次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(11)----融合磁力计进行姿态解算

    陀螺仪LSM6DSV16XAI集成(13)----中断获取SFLP四元数

    本文将介绍如何通过中断机制获取 LSM6DSV16X 传感器的 SFLP(Sensor Fusion Low Power)四元数数据LSM6DSV
    的头像 发表于 11-25 11:44 551次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(13)----<b class='flag-5'>中断</b><b class='flag-5'>获取</b>SFLP四元数

    陀螺仪LSM6DSV16XAI集成(14)----上报匿名上位机

    本文介绍了如何将 LSM6DSV16X 传感器的姿态数据通过匿名通信协议上报到上位机。通过获取传感器的四元数数据,并将其转换为欧拉角(Roll、Pitch、Yaw),然后按照协议格式化
    的头像 发表于 11-25 11:53 570次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(14)----上报匿名上位机

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

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

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

    本文将探讨如何使用中断机制获取FIFO数据应用MotionFX
    的头像 发表于 07-21 10:02 669次阅读
    驱动<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 645次阅读
    <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>

    LSM6DSV16X基于MLC智能笔动作识别(1)----轮询获取陀螺仪数据

    会被转换为适当的单位通过串行通信输出。这个代码是一个很好的起点,用于了解如何操作 LSM6DSV16X 传感器获取数据
    的头像 发表于 10-16 10:38 344次阅读
    <b class='flag-5'>LSM6DSV16X</b>基于MLC智能笔动作识别(1)----轮询<b class='flag-5'>获取</b><b class='flag-5'>陀螺仪</b><b class='flag-5'>数据</b>

    LSM6DSV16X基于MLC智能笔动作识别(4)----中断获取智能笔状态

    LSM6DSV16X 支持通过中断(INT)输出 MLC(机器学习核)识别的动作。具体来说,MLC 可以配置为在满足某些条件或机器学习分类结果发生变化时生成中断信号。 LSM6DSV16X
    的头像 发表于 11-25 11:39 160次阅读
    <b class='flag-5'>LSM6DSV16X</b>基于MLC智能笔动作识别(4)----<b class='flag-5'>中断</b><b class='flag-5'>获取</b>智能笔状态