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

#include #include //Keil library #include //Keil library #include #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD1602数据端口 sbit SCL=P1^0; //IIC时钟引脚定义 sbit SDA=P1^1; //IIC数据引脚定义 sbit LCM_RS=P2^0; //LCD1602命令端口 sbit LCM_RW=P2^1; //LCD1602命令端口 sbit LCM_EN=P2^2; //LCD1602命令端口 #define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修 //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量 int dis_data; //变量 void delay(unsigned int k); void InitLcd(); //初始化lcd1602 void Init_ADXL345(void); //初始化ADXL345 void WriteDataLCM(uchar dataW); void WriteCommandLCM(uchar CMD,uchar Attribc); void DisplayOneChar(uchar X,uchar Y,uchar DData); void conversion(uint temp_data); void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据 uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据 void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据 //------------------------------------ void Delay5us(); void Delay5ms(); void ADXL345_Start(); void ADXL345_Stop(); void ADXL345_SendACK(bit ack); bit ADXL345_RecvACK(); void ADXL345_SendByte(BYTE dat); BYTE ADXL345_RecvByte(); void ADXL345_ReadPage(); void ADXL345_WritePage(); //-----------------------------------
ADXL345是ADI公司推出的基于iMEMS技术的3轴、数字输出加速度传感器。它具有最高13位的分辨率、可变的测量范围、能测量不到1.0°的倾斜角度变化等特点。ADXL345支持标准的I2C或SPI数字接口,自带32级FIFO存储,并且内部有多种状态检测和灵活的中断方式等特性。在STM32驱动ADXL345的过程中,可以按照以下步骤进行操作: 1. 初始化ADXL345传感器,可以使用ADXL345_Init函数进行初始化。该函数会初始化IIC总线,并设置ADXL345的一些参数,如数据格式、数据输出速度、工作模式等。 2. 读取ADXL345三个方向的加速度值,可以使用ADXL345_RD_Reg函数读取传感器的寄存器值。 3. 通过加速度的值计算角度值,可以根据加速度值的变化来计算传感器的倾斜角度。 4. 在主函数中显示测试结果,可以通过串口打印显示传感器的加速度值和转换后的角度值。 需要注意的是,以上是一个简单的程序框架,具体的实现还需要根据具体的硬件平台和编程语言进行适配。可以参考引用\[2\]中提供的程序框架进行具体的驱动开发。 #### 引用[.reference_title] - *1* [STM32CubeMX系列|ADXL345传感器](https://blog.csdn.net/Chuangke_Andy/article/details/108987310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32——库函数版——ADXL345驱动程序](https://blog.csdn.net/qq_45844792/article/details/118565633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wizard-ly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值