这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【let'sdo|2026年第3期】尝试读取加速度计

共1条 1/1 1 跳转至页

【let'sdo|2026年第3期】尝试读取加速度计

菜鸟
2026-10-13 17:19:07     打赏

很开心参加Let's Do|2026年第3期活动,这次我选择的开发板为:NUCLEO-H533RE。除了开发板之外,还有两个小模块和一个步进电机。LIS3DH:三轴数字加速度计 (LIS3DHTR) 是一款低成本的三轴加速度计,属于 Grove 产品系列。基于 LIS3DHTR 芯片,提供多种量程和接口选择。体积小巧,测量范围:±2g、±4g、±8g、±16g,多种量程选择,支持 I2C、SPI 和 ADC GPIO 接口。

f7ced7c26956f481510246598e279765.jpg

首先使用NUCLEO-H533RE来读取三轴数字加速度计 (LIS3DHTR)。

第一步:使用STM32CubeMX来生成一个项目。

image.pngLIS3DHTR传感器使用I2C总线读取。所以要开启I2C支持。然后生成项目。

image.pngimage.png

查看电路图,NUCLEO开发板这点挺好的,排针、排母都有安排,所以杜邦线很容易连接。I2C对应管脚PB6、PB7,LIS3DHTR模块使用5V供电。

image.pngimage.png

参考着论坛中老师的帖子,用vscode做编辑器,打开项目。让AI帮忙写一下LIS3DHTR的驱动。

image.png

/**
  ******************************************************************************
  * @file    lis3dh.c
  * @brief   Minimal LIS3DH (3-axis accelerometer) driver over I2C1
  ******************************************************************************
  */

#include "lis3dh.h"
#include "i2c.h"

#define I2C_TIMEOUT_MS  200U

static const uint8_t lis3dh_addr = LIS3DH_I2C_ADDR_SA0_1;

uint8_t LIS3DH_ReadReg(uint8_t reg)
{
  uint8_t data = 0;
  HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(lis3dh_addr << 1),
                   (uint16_t)reg, I2C_MEMADD_SIZE_8BIT, &data, 1, I2C_TIMEOUT_MS);
  return data;
}

void LIS3DH_WriteReg(uint8_t reg, uint8_t val)
{
  HAL_I2C_Mem_Write(&hi2c1, (uint16_t)(lis3dh_addr << 1),
                    (uint16_t)reg, I2C_MEMADD_SIZE_8BIT, &val, 1, I2C_TIMEOUT_MS);
}

uint8_t LIS3DH_ReadID(void)
{
  return LIS3DH_ReadReg(LIS3DH_WHO_AM_I);
}

uint8_t LIS3DH_Init(void)
{
  uint8_t retry;

  HAL_Delay(20);

  for (retry = 0; retry < 5; retry++)
  {
    if (LIS3DH_ReadID() == 0x33U)
    {
      LIS3DH_WriteReg(LIS3DH_CTRL_REG1,
                      LIS3DH_CTRL_REG1_ODR_100HZ | LIS3DH_CTRL_REG1_XYZ_EN);
      LIS3DH_WriteReg(LIS3DH_CTRL_REG4,
                      LIS3DH_CTRL_REG4_BDU | LIS3DH_CTRL_REG4_HR | LIS3DH_CTRL_REG4_FS_2G);
      return 1;
    }
    HAL_Delay(5);
  }
  return 0;
}

HAL_StatusTypeDef LIS3DH_ReadAccel(LIS3DH_Accel_t *acc)
{
  uint8_t buf[6];
  HAL_StatusTypeDef st;

  st = HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(lis3dh_addr << 1),
                        (uint16_t)(LIS3DH_OUT_X_L | 0x80U),
                        I2C_MEMADD_SIZE_8BIT, buf, 6, I2C_TIMEOUT_MS);
  if (st == HAL_OK)
  {
    acc->x = (int16_t)(((uint16_t)buf[1] << 8) | buf[0]) >> 4;
    acc->y = (int16_t)(((uint16_t)buf[3] << 8) | buf[2]) >> 4;
    acc->z = (int16_t)(((uint16_t)buf[5] << 8) | buf[4]) >> 4;
  }
  return st;
}

让AI帮忙添加驱动,修改主函数中的调用。然后就可以成功读取三轴的加速度信息了。

e32eaff4d7665fa8a2a049d2ee1d4cd2.jpgimage.png

用手移动传感器,可以看见数据变化情况。

LIS3DH  X=   23  Y=  -14  Z= 1030  mg
LIS3DH  X=   23  Y=   -8  Z= 1032  mg
LIS3DH  X=   22  Y=  -11  Z= 1030  mg
LIS3DH  X=   22  Y=  -10  Z= 1030  mg
LIS3DH  X=   26  Y=  -10  Z= 1036  mg
LIS3DH  X=   25  Y=  -12  Z= 1034  mg
LIS3DH  X=   20  Y=   -6  Z= 1032  mg
LIS3DH  X=   21  Y=   -7  Z= 1035  mg
LIS3DH  X=   28  Y=  -12  Z= 1030  mg
LIS3DH  X=  129  Y= -105  Z= 1064  mg
LIS3DH  X=  -25  Y= -203  Z= 1033  mg
LIS3DH  X=   60  Y= -311  Z=  946  mg
LIS3DH  X=  209  Y= -727  Z=  955  mg
LIS3DH  X= -371  Y= -775  Z=  197  mg
LIS3DH  X=    6  Y= -951  Z=  -45  mg
LIS3DH  X= -362  Y= -424  Z= -537  mg
LIS3DH  X= -498  Y= -201  Z= -756  mg
LIS3DH  X= -536  Y=   53  Z= -547  mg
LIS3DH  X=  590  Y= -375  Z= -770  mg
LIS3DH  X=  651  Y=  -23  Z= -832  mg
LIS3DH  X=  530  Y=  298  Z= -808  mg
LIS3DH  X= 1651  Y=  450  Z= -263  mg
LIS3DH  X= -384  Y= -344  Z= -678  mg
LIS3DH  X= -772  Y=  187  Z= -798  mg
LIS3DH  X=  140  Y=  467  Z= -398  mg
LIS3DH  X=  878  Y=  249  Z=  538  mg
LIS3DH  X=  655  Y= -954  Z=  550  mg
LIS3DH  X=   86  Y= -932  Z=   33  mg
LIS3DH  X= -616  Y=  -32  Z= -814  mg
LIS3DH  X= -524  Y=  165  Z= -689  mg
LIS3DH  X=  729  Y= 1028  Z=  361  mg
LIS3DH  X= 1313  Y= -167  Z=  376  mg
LIS3DH  X=  -36  Y=  -95  Z= -303  mg
LIS3DH  X= -899  Y=   35  Z= -913  mg
LIS3DH  X=  411  Y=  198  Z= -764  mg



共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]