stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)


前言

本项目基于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

版权声明:本文为CSDN博主「wizard-ly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40249327/article/details/116021624

生成海报
点赞 0

wizard-ly

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

GD32F103基础教程—外部中断实验(八)

一、教程简介 本章主要是讲解GPIO输入实验,通过按键触发外部中断,控制LED2闪烁。 二、实验流程 1、工程配置 外部中断触发实验工程配置方法与第五章的配置方法一致,具体请查看第五章教程&#xff0c

MCU串行通讯和并行通讯的区别以及UART的理解

假如我们需要从一个MCU发送一段数据到另一个MCU,我们可以选择两种通信方式,串行通信或者并行通信。 假如我们要发送的数据是数字198转化为二进制,就是11000110,如果使用串行通信

8522A+7段数码管显示实验

1、8255A简介 8255A是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,