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

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

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS和SA0设置
  • 串口重定向
  • 参考程序
  • 初始换管脚
  • 获取ID
  • 复位操作
  • BDU设置
  • 6D方向检测功能配置
  • 选择滤波和角度阈值
  • 设置量程和速率
  • 获取所有中断源的状态
  • 发送相应信息
  • 演示

概述

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

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

在这里插入图片描述

视频教学

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

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

样品申请

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

源码下载

生成STM32CUBEMX

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

在这里插入图片描述

串口配置

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

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

在这里插入图片描述

IIC配置

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

CS和SA0设置

在这里插入图片描述

串口重定向

打开魔术棒,勾选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 */

参考程序

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

初始换管脚

由于需要向LSM6DSV16X_I2C_ADD_L写入以及为IIC模式。
在这里插入图片描述

所以使能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_device_id_get为获取函数。

在这里插入图片描述

对应的获取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_reset_set为重置函数。
在这里插入图片描述

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

  /* 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进行开启。

在这里插入图片描述

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

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

6D方向检测功能配置

1.使能六维位置检测功能,配置陀螺仪模块的中断引脚,使得当六维传感器检测到某种运动时,能够通过中断方式通知主控制器。
可以通过使能MD1_CFG (5Eh)中的INT1_6D开启6D事件。
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

选择滤波和角度阈值

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

在这里插入图片描述

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

在这里插入图片描述

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

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

设置量程和速率

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

在这里插入图片描述

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

在这里插入图片描述
设置加速度的量程和速率可以使用如下函数。

/* 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变量包含了自由落体状态的信息。

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

通过 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 */

演示

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果&#xff1a;sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接&#xff0c;其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

避免重复扣款:分布式支付系统的幂等性原理与实践

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;6&#xff09;篇。 本文主要讲清楚什么是幂等性原理&#xff0c;在支付系统中的重要应用&#xff0c;业务幂等、全部幂等这些不同的幂等方案选型带来的收益和复杂度权衡&#xff0c;幂等击穿场景及可能的严重…

供应链安全-镜像 Trivy kubesec

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 Dockerfile 文件优化 减少镜像层&#xff1a;一次RUN指令形成新的一层&a…

世微AP3464 DC-DC同步降压恒压IC 4-30V2.4A输出同步降压驱动芯片

AP3464 是一款支持宽电压输入的同步降压 电源管理芯片&#xff0c;输入电压 4-30V 范围内可实现 2.4A 的连续电流输出。通过调节 FB 端口的分压 电阻&#xff0c;设定输出 1.8V 到 28V 的稳定电压。 AP3464 具有的恒压/恒流(CC/CV)特性。 AP3464 采用电流模式的环路控制原理&am…

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml 不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条…

Django配置日志系统的最佳实践

概要 日志是跟踪应用行为、监控错误、性能分析和安全审计的重要工具。在Django框架中&#xff0c;合理配置日志系统可以帮助开发者有效管理项目运行过程中的关键信息。本文将详细介绍Django日志系统的最佳实践。 日志系统概述 Django使用Python的 logging 模块来实现日志系统…

服务器宕机怎么办?怎么预防宕机?

相信不少用户会听到或者在文章中提到电脑宕机或者服务器宕机&#xff0c;不少用户对宕机的意思不太理解。那么服务器宕机是什么意思&#xff1f; 宕机属于计算机的术语&#xff0c;指电脑或者服务器不能正常工作。口语中我们简单的把停掉机器叫做down机&#xff0c;转换为汉字是…

【计算机毕业设计】基于springboot的校园跑腿任务管理系统java+vue

校园跑腿管理系统又称“效率鸭”跑腿系统&#xff0c;是在学校进行现代化的信息管理和提供信息服务的基础&#xff0c;引导人们快速、准确地获取快递资源、预约洗浴并对外卖资源进行有效管理的保证。疫情当下&#xff0c;为了减少人员的聚集&#xff0c;因此&#xff0c;迫切需…

【每日一词】数据隐私

每日一词&#xff1a;数据隐私 数据隐私是指个人或组织对其个人信息的控制权和保护需求。在互联网时代&#xff0c;大量的个人数据被收集、存储和处理&#xff0c;数据隐私的重要性日益凸显。 解释和示例 数据隐私涉及个人信息的保护&#xff0c;包括但不限于身份信息、联系方…

WebGL在实验室方向的应用

WebGL在实验室方向的应用涉及到实验过程的可视化、数据分析、模拟等方面。以下是一些WebGL在实验室领域的应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.分子模型和化学反应模拟&#xff…

二进制部署

HOST HostnameIP地址flannedAPPmaster192.169.116.10ETCD\APIserver\Scheduler\Controller-Managernode1192.168.116.11172.17.28.0ETCD,Flanned,Kubelet,kube-proxynode2192.168.116.12172.17.26.0ETCD,Flanned,Kubelet,kube-proxy Kubernetes社区 Kubernetes文档 ETCD mas…

抖去推账号矩阵+无人直播+文案引流系统开发搭建--开源

核心技术 1. AI自动直播&#xff1a; 智能系统通过丰富可定制的文案库&#xff0c; 拥有有料有趣的灵魂。不仅能自动语音讲解内容&#xff0c;还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2. AI剪辑 可一键智能批量成片&#xff0c;也可跟着模板剪…