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

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

3天内不再提示

三轴加速度计LIS2DW12开发(4)----测量倾斜度

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-05-16 17:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

本文将介绍如何驱动和利用LIS2DW12三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。

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

视频教学

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

样品申请

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

源码下载

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

计算倾斜角度

加速度计广泛用于消费电子和工业应用中的倾斜检测,如屏幕旋转和汽车安全报警系统。低g加速度计的另一个广泛用途是用于地图转换和个人导航设备的倾斜补偿式电子罗盘。该应用笔记描述了如何通过对一些可能导致角度倾斜计算错误的非理想因素进行补偿,从而准确测量相对于本地地球水平面的倾斜角度。

工作原理

下图显示用于倾斜测量的加速度计的单一感应轴。

下图显示用于倾斜测量的加速度计的单一感应轴。

加速度计测量重力向量在感应轴上的映射。被测加速度的振幅随感应轴与水平面的夹角α的正弦值的变化而变化。 A=g*sin(α) 使用上面公式可以估算倾斜角度。 α=arcsin(A/g) 其中: • A = 测量的加速度 • g = 地球的重力向量

加速度计的单轴(360°旋转)显示在下图中。

单轴倾斜检测

上图可以看出,当感应轴垂直于重力方向时,传感器对倾斜角度的变化最敏感。在这种情况下,灵敏度约为17.45 mg/° [= sin(1°) - sin(0°)]。由于正弦函数的导数函数,当感应轴接近其 +1 g 或 -1 g位置时,传感器的灵敏度较低(对倾斜角度变化的响应较慢)。在这种情况下,灵敏度仅有0.15 mg/° [= sin(90°) - sin(89°)]。表 1显示不同倾斜角度下的灵敏度。也就是说,如上图所示,正弦函数在[0° 45°]、[135° 225°]和[315°360°]处具有良好的线性度。

双轴倾斜检测

当使用双轴倾斜传感方法时,用户应了解在两种不同的情况下,这种方法可能会限制总体精度,甚至阻止倾斜计算。 例A:绕虚线箭头将加速度计逆时针旋转β角度。当β小于 45°时,X轴灵敏度较 高,Y轴灵敏度较低。当β大于 45°时,X轴灵敏度较低,Y轴灵敏度较高。因此,如果使用两轴方法,通常建议根据正交轴±1 g条件计算角度。 例B:在此位置,X轴和Y轴的灵敏度都很高。但是,如果不借助第三个轴(例如Z 轴),就不可能区分30°的倾斜角和150°的倾斜角,因为X轴在这两个倾斜角度具有相同的输出。

三轴倾斜检测

借助三轴加速度计,用户可以组合使用Z轴与X轴和Y轴进行倾斜感应,以提高倾斜灵敏度和精度。 有两种方法计算图 5中的三个倾角。第一种方法是利用基本三角函数公式3、4和5,其中Ax1、Ay1和Az1是将加速度计校准应用到原始测量数据后得到的值(Ax、Ay、Az):

第二种方法是利用三角函数公式6和7计算俯仰和滚转倾斜角,在360度旋转时保持恒定灵敏度。

通信模式

对于LIS2DW12,可以使用SPI或者IIC进行通讯。 最小系统图如下所示。

在CS管脚为1的时候,为IIC模式。

本文使用的板子原理图如下所示。

管脚定义

IIC通信模式

在使用IIC通讯模式的时候,SA0是用来控制IIC的地址位的。 对于IIC的地址,可以通过SDO/SA0引脚修改。SDO/SA0引脚可以用来修改设备地址的最低有效位。如果SDO/SA0引脚连接到电源电压,LSb(最低有效位)为'1'(地址0011001b);否则,如果SDO/SA0引脚连接到地线,LSb的值为'0'(地址0011000b)。

对应的IIC接口如下所示。 主要使用的管脚为CS、SCL、SDA、SA0。

速率

该模块支持的速度为普通模式(100k)和快速模式(400k)。

生成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/lis2dw12-pid]

初始换管脚

由于需要向LIS2DW12_I2C_ADD_H写入以及为IIC模式。

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

HAL_GPIO_WritePin(GPIOC, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, SA0_Pin, GPIO_PIN_SET);

获取ID

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

lis2dw12_device_id_get为获取函数。

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

/* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lis2dw12_device_id_get(&dev_ctx, &whoamI);
    printf("LIS2DW12_ID=0x%x,whoamI=0x%x",LIS2DW12_ID,whoamI);
  if (whoamI != LIS2DW12_ID)
    while (1) {
      /* manage here device not found */
    }

复位操作

可以向CTRL2 (21h)的SOFT_RESET寄存器写入1进行复位。

lis2dw12_reset_set为重置函数。

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

/* Restore default configuration */
  lis2dw12_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lis2dw12_reset_get(&dev_ctx, &rst);
  } while (rst);

BDU设置

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

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

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

设置传感器的量程

FS[1:0] - 全量程选择:这两个位用于设置传感器的量程。量程决定了传感器可以测量的最大加速度值。例如,量程可以设置为±2g、±4g、±8g或±16g。这允许用户根据应用的特定需求调整传感器的灵敏度。

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

/* Set full scale */
  lis2dw12_full_scale_set(&dev_ctx, LIS2DW12_2g);

配置过滤器链

lis2dw12_filter_path_set(&dev_ctx, LIS2DW12_LPF_ON_OUT);:设置加速度计输出的过滤器路径。这里选择了输出上的低通滤波器(LPF),用于去除高频噪声。
lis2dw12_filter_bandwidth_set(&dev_ctx, LIS2DW12_ODR_DIV_4);:设置过滤器的带宽。这里的设置是将输出数据率(ODR)除以4,进一步决定了滤波器的截止频率。

配置电源模式

lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_HIGH_PERFORMANCE);:这个调用设置加速度计的电源模式为高性能模式。这通常意味着更高的功耗,但提供更精确的测量。

设置输出数据速率

lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_ODR_25Hz);:设置加速度计的输出数据速率为每秒25次。输出数据速率决定了传感器多久采集一次数据,并影响数据的实时性和功耗。

/* Enable Block Data Update */
  lis2dw12_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  /* Set full scale */
  lis2dw12_full_scale_set(&dev_ctx, LIS2DW12_2g);
  /* Configure filtering chain
   * Accelerometer - filter path / bandwidth
   */
  lis2dw12_filter_path_set(&dev_ctx, LIS2DW12_LPF_ON_OUT);
  lis2dw12_filter_bandwidth_set(&dev_ctx, LIS2DW12_ODR_DIV_4);
  /* Configure power mode */
  lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_HIGH_PERFORMANCE);
  /* Set Output Data Rate */
  lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_ODR_25Hz);

轮询获取加速度

检查新数据是否可用:
lis2dw12_flag_data_ready_get(&dev_ctx, ®);:这个函数调用检查加速度计是否有新的数据可读。如果有新数据,reg 变量将被设置为非零值。
主要为读取STATUS (27h)的DRDY位。

如果 reg 是非零的,说明有新的加速度数据可读。
lis2dw12_acceleration_raw_get(&dev_ctx, data_raw_acceleration);:这个函数调用实际读取加速度计的原始数据,并存储在 data_raw_acceleration 数组中。
数据在28h-2Dh中。

加速度数据首先以原始格式(通常是整数)读取,然后需要转换为更有意义的单位,如毫重力(mg)。这里的转换函数 lis2dw12_from_fs2_to_mg() 根据加速度计的量程(这里假设为±2g)将原始数据转换为毫重力单位。
acceleration_mg[0] = lis2dw12_from_fs2_to_mg(data_raw_acceleration[0]); 等三行代码分别转换 X、Y、Z 轴的加速度数据。

● LIS2DW12 加速度计通常会有一个固定的位分辨率,比如 16 位(即输出值是一个 16 位的整数)。这意味着加速度计可以输出的不同值的总数是 2^16=65536。这些值均匀地分布在 -2g 到 +2g 的范围内。
● 因此,这个范围(4g 或者 4000 mg)被分成了 65536 个步长。
● 每个步长的大小是 4000 mg/65536≈0.061 mg/LSB
所以,函数中的乘法 ((float_t)lsb) * 0.061f 是将原始的整数值转换为以毫重力(mg)为单位的加速度值。这个转换对于将加速度计的原始读数转换为实际的物理测量值是必需的。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    uint8_t reg;
    /* Read output only if new value is available */
    lis2dw12_flag_data_ready_get(&dev_ctx, ®);

    if (reg) {
      /* Read acceleration data */
      memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
      lis2dw12_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
      //acceleration_mg[0] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[0]);
      //acceleration_mg[1] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[1]);
      //acceleration_mg[2] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[2]);
      acceleration_mg[0] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[0]);
      acceleration_mg[1] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[1]);
      acceleration_mg[2] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[2]);
      printf("Acceleration [mg]:X=%4.2ftY=%4.2ftZ=%4.2frn",acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);
    }
HAL_Delay(100);

    /* USER CODE END WHILE */

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

计算倾角

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    uint8_t reg;
    /* Read output only if new value is available */
    lis2dw12_flag_data_ready_get(&dev_ctx, ®);

    if (reg) {
      /* Read acceleration data */
      memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
      lis2dw12_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
      //acceleration_mg[0] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[0]);
      //acceleration_mg[1] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[1]);
      //acceleration_mg[2] = lis2dw12_from_fs8_lp1_to_mg(data_raw_acceleration[2]);
      acceleration_mg[0] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[0]);
      acceleration_mg[1] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[1]);
      acceleration_mg[2] = lis2dw12_from_fs2_to_mg(
                             data_raw_acceleration[2]);
      printf("Acceleration [mg]:X=%4.2ftY=%4.2ftZ=%4.2frn",acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);


            float g = 1000;
    // 计算X轴的倾角
    float x_angle = atan(acceleration_mg[0] / sqrt(acceleration_mg[1] * acceleration_mg[1] + acceleration_mg[2] * acceleration_mg[2]));
    // 计算Y轴的倾角
    float y_angle = atan(acceleration_mg[1] / sqrt(acceleration_mg[0] * acceleration_mg[0] + acceleration_mg[2] * acceleration_mg[2]));
    // 计算Z轴的倾角
    float z_angle = atan(acceleration_mg[2] / sqrt(acceleration_mg[0] * acceleration_mg[0] + acceleration_mg[1] * acceleration_mg[1]));

    // 将弧度转换为度数
    x_angle = x_angle * 180.0 / 3.14159265;
    y_angle = y_angle * 180.0 / 3.14159265;
    z_angle = z_angle * 180.0 / 3.14159265;

    // 打印结果
    printf("X轴倾角: %.2f 度n", x_angle);
    printf("Y轴倾角: %.2f 度n", y_angle);
    printf("Z轴倾角: %.2f 度n", z_angle);

    }

HAL_Delay(100);        

    /* USER CODE END WHILE */

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

演示

在平放时候数据如下所示。

审核编辑 黄宇

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

    关注

    129

    文章

    4529

    浏览量

    199569
  • 加速度计
    +关注

    关注

    6

    文章

    823

    浏览量

    48323
  • stm32cubemx
    +关注

    关注

    5

    文章

    290

    浏览量

    17477
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度剖析LIS3DE:超低功耗高性能3加速度计的卓越之选

    深度剖析LIS3DE:超低功耗高性能3加速度计的卓越之选 在电子设备的设计中,加速度计是一个关键的组件,它能为设备带来感知运动和方向的能力。今天,我们要深入探讨的是ST公司的
    的头像 发表于 04-16 11:10 162次阅读

    石英加速度计让空间受限的平台拥有“高精度感知”

    在惯性测量领域,传统加速度计往往面临两难:要么体积庞大,挤占宝贵的系统空间;要么温漂严重,一遇温度变化数据就“飘忽不定”。普通石英加速度计虽有一定精度,但零偏稳定性差、温度系数高,在长时间连续工作中
    的头像 发表于 04-14 15:01 152次阅读
    石英<b class='flag-5'>加速度计</b>让空间受限的平台拥有“高精度感知”

    突破极限,精准感知:双MEMS加速度计引领高精度运动测量新时代

    在需要精确捕捉运动状态与振动变化的工业与科研领域,一款可靠的加速度计往往是实现精准控制与智能监测的核心。ER-2MA-5双MEMS加速度计,以其卓越的性能与稳定的输出,成为高要求应用
    的头像 发表于 01-04 14:53 324次阅读
    突破极限,精准感知:双<b class='flag-5'>轴</b>MEMS<b class='flag-5'>加速度计</b>引领高精度运动<b class='flag-5'>测量</b>新时代

    TDK InvenSense IAM - 20381HT:高性能汽车级加速度计的卓越之选

    概述 基本信息 IAM - 20381HT是一款适用于汽车非安全应用的2加速度计,采用了3×3×0.75 mm³的16引脚LGA超薄封装。这种小巧的封装设计,使得
    的头像 发表于 12-25 17:15 663次阅读

    TDK InvenSense ICM - 42370 - P:高性能加速度计的深度剖析

    TDK InvenSense ICM - 42370 - P:高性能加速度计的深度剖析 在当今的电子设备设计领域,高性能、低功耗的传感器需求日益增长。TDK InvenSense的ICM
    的头像 发表于 12-25 17:10 625次阅读

    探索NXP FXLS8964AF 3低g加速度计:特性、应用与设计要点

    探索NXP FXLS8964AF 3低g加速度计:特性、应用与设计要点 在汽车电子领域,对于高性能、低功耗的传感器需求日益增长。NXP的FXLS8964AF 3低g加速度计,凭借其
    的头像 发表于 12-25 10:20 571次阅读

    深入解析FXLS8971CF:3低g加速度计的卓越性能与应用

    深入解析FXLS8971CF:3低g加速度计的卓越性能与应用 在当今工业和医疗物联网(IoT)领域,对于高性能、低功耗的传感器需求日益增长。NXP Semiconductors
    的头像 发表于 12-24 14:00 677次阅读

    深入解析FXLS8961AF:汽车应用中的3低g加速度计

    深入解析FXLS8961AF:汽车应用中的3低g加速度计 在汽车电子领域,传感器技术的发展日新月异。其中,3加速度计在汽车安全和便利性应用中扮演着至关重要的角色。今天,我们就来详细
    的头像 发表于 12-24 13:55 525次阅读

    加速度计都有哪些分类?

    加速度计的分类主要依据其工作原理和测量维度(数),以下是详细的分类:按工作原理分类(这是最核心的分类方式)这是根据加速度计内部如何感知和转换加速度
    的头像 发表于 12-04 15:55 741次阅读
    <b class='flag-5'>加速度计</b>都有哪些分类?

    加速度计伺服电路模块原理与应用

    、石英挠性加速度计等高精度传感器设计,是实现其力平衡回路的“大脑”与“神经中枢”。 一、模块的核心功能与定位 加速度计伺服电路模块的核心使命,是为传感器提供完整的力平衡回路解决方案。它集成了大关键功能:
    的头像 发表于 11-28 15:43 610次阅读

    精准捕捉维运动:MEMS加速度计的高精度之道

    在工业机器人、无人机和结构监测等领域,对维运动的精确测量是实现智能控制的基础。这一任务的核心执行者,便是MEMS加速度计。它将物理运动
    的头像 发表于 11-11 15:50 922次阅读
    精准捕捉<b class='flag-5'>三</b>维运动:<b class='flag-5'>三</b><b class='flag-5'>轴</b>MEMS<b class='flag-5'>加速度计</b>的高精度之道

    LIS2DUX12:面向可穿戴与物联网的超低功耗智能加速度计

    STMicroelectronics LIS2DUX12超低功耗加速度计 是一款智能数字3轴线性加速度计。STMicroelectronics LIS2DUX12 MEMS和ASIC
    的头像 发表于 10-29 15:24 673次阅读
    <b class='flag-5'>LIS2DUX12</b>:面向可穿戴与物联网的超低功耗智能<b class='flag-5'>加速度计</b>

    LIS2DUXS12:集成AI与Qvar感知的超低功耗加速度计

    STMicroelectronics LIS2DUXS12超低功耗加速度计是一款智能、数字、3轴线性加速度计。 MEMS和ASIC旨在让常开抗混叠滤波和有限状态机 (FSM) 等功能有尽可能低
    的头像 发表于 10-29 14:41 917次阅读
    <b class='flag-5'>LIS2DUXS12</b>:集成AI与Qvar感知的超低功耗<b class='flag-5'>加速度计</b>

    MEMS加速度计与石英加速度计的发展现状与水平对比

    在工程测量与惯性导航领域,加速度计是感知运动与振动的核心传感器。其中,微机电系统(MEMS)加速度计和石英加速度计是两种技术路线迥异但应用广泛的重要类型。它们各自的发展现状和技术水平呈
    的头像 发表于 09-19 14:55 1453次阅读
    MEMS<b class='flag-5'>加速度计</b>与石英<b class='flag-5'>加速度计</b>的发展现状与水平对比

    贸泽开售提供精确工业状态监测维护的 Amphenol Wilcoxon 883M数字MEMS加速度计

    的工业和自动化应用而设计。   Amphenol Wilcoxon 883M加速度计配备加速度计和温度传感器,可测量高达 ±16 g峰值
    的头像 发表于 07-23 16:13 1895次阅读
    贸泽开售提供精确工业状态监测维护的 Amphenol Wilcoxon 883M数字<b class='flag-5'>三</b><b class='flag-5'>轴</b>MEMS<b class='flag-5'>加速度计</b>