陀螺仪LSM6DSV16X与AI集成(5)----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/
样品申请[https://www.wjx.top/vm/ohckxjk.aspx#]
源码下载[https://download.csdn.net/download/qq_24312945/88719389]
生成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↑rn); break; case 0x41: printf(6d position b x↓rn); break; case 0x42: printf(6d position c x↑rn); break; case 0x44: printf(6d position d y↓rn); break; case 0x60: printf(6d position e z↑rn); break; case 0x50: printf(6d position f z↓rn); break; } sixd_event_catched = 0; } /* user code end while */ /* user code begin 3 */ } /* user code end 3 */演示


昆虫机器人diy详解
STM32中AHB总线_APB2总线_APB1总线这些是什么
Micro USB母座精密复杂模具的热处理变形预防方法
L4级自动驾驶巴士“阿波龙”正式量产下线,商业化落地也同步展开
喜迎2023|力合微总经理新年寄语
陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能
遥控开关控制门锁—让门也智能起来
Artomatix正利用人工智能打造大批僵尸军团,将虚拟世界带入真实生活中
dfrobot太阳能充电器模块Solar Lipo Charger简介
什么样的网线比较好
示波器与普通的电压表相比有什么优缺点
集成电路的分类有几种
一个基本的共源电路
2019年新华三集团刀片服务器已连续四季度获得市场份额第一
连接器的选择及应用
是哪两难让区块链热潮在逐渐走冷?
魅族16th和魅族16X的区别在哪里
Rfid案例CK-FR08读写器实现无缝工业钢材切割的工艺生产识别
电动工具控制与充电技术研讨会议程出炉
DC电源模块隔离电路的影响