前言

本项目基于STM32F103C8T6平台驱动ADXL345模块,主要用于三轴加速度的测量,也可用于平衡性检测,跌倒检测,PID控制等领域。
大多数博客的代码带入都不能使用,经过一上午调试,终于可以获取数据了。目前可通过IIC方式驱动(当然自己可以修改成SPI驱动,因为感觉IIC驱动节约一些引脚,当然有利有弊)获取x,y,z三个方向的变化量。现在将程序工程分享出来大家一起交流学习。


温馨提示:若存在表述错误或知识性错误望海涵指出,仅供学习交流,非作者同意不可转载,感谢支持吖~

一、介绍ADXL345传感器

ADXL345是三轴加速度传感器,根据官方网站以及官方手册(https://www.analog.com/cn/products/adxl345.html#product-overview)上的描述,它具有以下特性:

1、超低功耗:VS = 2.5 V时(典型值),测量模式下低至23μA,待机模式下为0.1 μA
2、功耗随带宽自动按比例变化
3、用户可选的分辨率:10位固定分辨率/全分辨率
分辨率随g范围提高而提高,±16 g时达到最高分辨率13位(在所有g范围内保持4 mg/LSB的比例系数)

使用的模块如下图:ADXL345(GY-291)
正面图
背面图
在这里插入图片描述

根据参考手册可知,引脚号分配:
在这里插入图片描述
根据官方手册可知,通信方式可参考下表:
在这里插入图片描述
在这里插入图片描述
说明:CS接入高电平则选择IIC通信,反之则SPI通信。SDO(地址引脚)接入高电平,根据手册器件的7位I2C地址是0x1D,后面跟上读取/写入位(R/W),则写寄存器为0x3A,读寄存器为0x3B;接入低电平,则7位I2C地址是0x53,同理,跟上读写标志位后写寄存器为0xA6,读寄存器为0xA7;

那么就简要介绍以下寄存器,它的寄存器很多,但是我们只需要先关注以下三个即可
在这里插入图片描述
只需要配置好这三个寄存器就可以开始工作,其余寄存器如下图(读取数据关注0x32开始的6个寄存器即可):
在这里插入图片描述

二、STM32驱动使用步骤

1.配置IIC通信协议

可以使用硬件iic也可使用软件iic,我这里为了方便就用硬件配置了:

//配置GPIO的复用模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
//配置IIC的外设工作条件
  I2C_DeInit(I2C2);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x30;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 200000;

2.寄存器初始化配置

void adxl345_init(void)
{
  iic_rw(0x0d, 1, BW_RATE, ADXL345_ADDR, WRITE);//数据速率以及功率模式配置
  iic_rw(0x08, 1, POWER_CTL, ADXL345_ADDR, WRITE);//省电特性配置
  iic_rw(0x09, 1, DATA_FORMAT, ADXL345_ADDR, WRITE);//数据格式控制
}

3.读入数据串口打印

通过读寄存器的值来读取此时三轴加速度三方位的状态(这里是通过16位的数据格式获取,大家可配置,最大值为65535,将读取的数值转化为16位整型数据):

void adxl345_get_data(u16 *aax, u16 *aay, u16 *aaz)
{
  u8 data_rev[6];
  
  iic_rw(&data_buf[0], 6, ADXL345_BURST_ADDR, ADXL345_ADDR, READ);
  *aax = data_rev[1] * 0x100 + data_rev[0];
  *aay = data_rev[3] * 0x100 + data_rev[2];
  *aaz = data_rev[5] * 0x100 + data_rev[4];
	
}
adxl345_get_data(x_temp, y_temp,z_temp);
printf("x is %d,y is %d,z is %d \r\n",*x_temp,*y_temp,*z_temp);

获取x,y,z的值将其串口打印。


三、成果输出

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

在这里插入图片描述

通过更改ADXL345模块方位,摇晃等,可以明显看出xyz发送了改变,说明我们已经驱动ADXL345模块,同时能获取相关数据。可后期对该数据进行采集,平均值,卡尔曼滤波等处理,使得更加稳定。

CSDN工程下载链接(已调试通过):https://download.csdn.net/download/qq_40249327/16822565

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐