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

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

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 2026-06-07 13:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

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

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

视频教学

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

样品申请

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

源码下载

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

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。

主控为STM32H503CB,加速度计为LIS2DW12。

在这里插入图片描述

参考程序

[https://github.com/CoreMaker-lab/STM32H503_LIS2DW12]

[https://gitee.com/CoreMaker/STM32H503_LIS2DW12]

计算倾斜角度

加速度计广泛用于消费电子和工业应用中的倾斜检测,如屏幕旋转和汽车安全报警系统。低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为STM32H503CB。
配置时钟树,配置时钟为250M。

在这里插入图片描述

串口配置

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

在这里插入图片描述

配置串口,速率为115200。

IIC配置

在这里插入图片描述

在这里插入图片描述

配置IIC为快速模式,速度为400k。

在这里插入图片描述

CS和SA0设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ICASHE

在这里插入图片描述

修改堆栈

在这里插入图片描述

若无法正常运行需要修改优化等级。

在这里插入图片描述

串口重定向

打开魔术棒,勾选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(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_SET);
	HAL_Delay(100);

获取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:设置加速度计的滤波带宽,LIS2DW12_ODR_DIV_4 表示滤波器的截止频率为输出数据率(ODR)的四分之一。

配置电源模式

lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_CONT_LOW_PWR_12bit);配置电源模式。这里设置为连续低功耗模式,且以 12 位分辨率运行。

设置输出数据速率

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

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

演示

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

在这里插入图片描述

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

    关注

    10

    文章

    5819

    浏览量

    117216
  • 加速度计
    +关注

    关注

    6

    文章

    838

    浏览量

    48457
  • 倾斜角
    +关注

    关注

    0

    文章

    6

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计倾斜检测理论和倾斜测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字
    的头像 发表于 05-17 15:00 2891次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(<b class='flag-5'>4</b>)----<b class='flag-5'>测量</b><b class='flag-5'>倾斜度</b>

    e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 IS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 08-09 14:54 3260次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据

    加速度计的幻想与现实

    调理设备的成本非常高。 现在,具有宽带宽(22 kHz) 和内部信号调理功能的ADXL001已成为低成本轴承维护应用的理想之选。自动校平。 加速度计测量大型机器或活动房屋等物体的绝对倾斜度。微控制器利用
    发表于 10-11 10:33

    压电薄膜传感器能当做加速度计吗?

    加速度计可以用在仪表中,测量加速度(速度对时间的变化率)和测量倾斜度(物体的纵轴和与地球表面相切
    发表于 10-15 06:30

    LIS2DW12如何实现很小的倾斜度也能中断?

    我使用的是 STMicroelectronics 的加速度计 (LIS2DW12)。仅当设置为 6D 方向模式时,才会为 (50,60,70,80) 度生成中断。作为我项目的一部分,我希望从 10
    发表于 12-01 07:31

    LIS2DW12定向位问题求解

    您好,我们正在使用加速度计 LIS2DW12。根据数据表中的图表。如果加速度计处于这种状态,我们会看到 zlzh 方向位升高了吗?
    发表于 01-03 09:35

    是否可以使用LIS2DW12加速度计进行倾斜角度检测呢?

    我正在使用 LIS2DW12 加速度计进行倾斜角度检测是否可以如图所示检测两个方向的倾斜角度(A和B)并在唤醒中断模式下触发中断事件?在 6d 方向模式下是可能的,但我需要唤醒中断模式
    发表于 01-05 07:01

    LIS2DW12相关资料分享

    LIS2DW12 是系统级封装的 3D 数字加速度计,具有数字 I²C/SPI 串口标准输出,在高分辨率模式下功耗 90 µA,在低功耗模式下功耗低于 1 µA。由于加速度计具有超低噪声性能,始终
    发表于 09-06 06:03

    LIS2DW12的应用笔记

    本文档旨在提供 ST 的 LIS2DW12 运动传感器相关的使用信息和应用提示。LIS2DW12 是系统级封装的 3D 数字加速度计,具有数字 I²C/SPI 串口标准输出,在高分辨率模式下功耗
    发表于 09-13 06:58

    LIS2DW12 3D数字加速度计应用笔记

    电子发烧友网站提供《LIS2DW12 3D数字加速度计应用笔记.pdf》资料免费下载
    发表于 07-31 09:40 1次下载
    <b class='flag-5'>LIS2DW12</b> 3D数字<b class='flag-5'>加速度计</b>应用笔记

    使用低g三轴加速度计测量倾斜度

    电子发烧友网站提供《使用低g三轴加速度计测量倾斜度.pdf》资料免费下载
    发表于 07-31 10:16 1次下载
    使用低g三轴<b class='flag-5'>加速度计</b><b class='flag-5'>测量</b><b class='flag-5'>倾斜度</b>

    e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 IS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 01-09 16:21 2268次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据

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

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计倾斜检测理论和倾斜测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字
    的头像 发表于 05-16 17:18 3786次阅读
    三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b><b class='flag-5'>开发</b>(<b class='flag-5'>4</b>)----<b class='flag-5'>测量</b><b class='flag-5'>倾斜度</b>

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

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计倾斜检测理论和倾斜测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字
    的头像 发表于 08-09 16:00 2999次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(<b class='flag-5'>4</b>)----<b class='flag-5'>测量</b><b class='flag-5'>倾斜度</b>

    加速度计LIS2DW12开发(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 LIS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 06-02 10:43 491次阅读
    <b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b><b class='flag-5'>开发</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据