【STM32 CubeMX】adxl345加速度传感器

这篇具有很好参考价值的文章主要介绍了【STM32 CubeMX】adxl345加速度传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇文章使用I2C进行通信
在嵌入式系统中,加速度传感器是一种常见的传感器,用于检测物体的加速度或者倾斜角度。ADXL345是一款常用的数字三轴加速度传感器,由ADI(Analog Devices)公司制造。它具有高精度、低功耗和可编程的特点,因此在很多嵌入式应用中被广泛使用。本文将介绍如何在STM32 CubeMX中配置和使用ADXL345加速度传感器。


一、硬件连线

对于I2C adxl345,由于adxl345不仅可以进行I2C通信,也可以进行SPI通信,所以对于I2C通信,我们不仅需要连接VCC、GND、SCL、SDA等常规的引脚,我们还需要对CS片选引脚连到电源3.3V.
我们不仅需要连接CS到电源,我们还需要连接SDO引脚连接到电源。
通过这两步的连线,得到adxl345的读写地址为:写:0x3A 读:0x3B
【STM32 CubeMX】adxl345加速度传感器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c,c++,mcu,51单片机

二、CubeMX配置I2C

首先,我们选择一个可用的I2C
【STM32 CubeMX】adxl345加速度传感器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c,c++,mcu,51单片机
接下来,开启该I2C即可。
【STM32 CubeMX】adxl345加速度传感器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c,c++,mcu,51单片机

三、adxl345的读取操作

3.1 读取adxl345的设备id

阅读芯片手册可得读取0x00地址,我们可以得到他的设备id,并且这个地址只能读,如果得到的数据为0xE5
代表设备读取成功
【STM32 CubeMX】adxl345加速度传感器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c,c++,mcu,51单片机

3.2 初始化adxl345

初始化DATA_FORMAT寄存器

DATA_FORMAT寄存器的各个位的意义如下,我们可以通过组合,然后发送给adxl345的0x31地址
位7 - Self-Test Bit(自检位):
可取值:0或1
0:禁用自检功能
1:启用自检功能。在自检模式下,传感器会在每个轴上施加一个已知的加速度,用于自我测试和校准。

位6 - SPI Bit(SPI接口位):
可取值:0或1
0:选择4线SPI模式(默认模式)
1:选择3线SPI模式

位5 - Interrupt Invert Bit(中断输出反转位):
可取值:0或1
0:中断输出极性不反转(默认)
1:中断输出极性反转。可用于将中断信号与外部器件的期望极性匹配。

位4 - 不使用(保留位)

位3 - Full-Resolution Bit(完整分辨率位):
可取值:0或1
0:禁用完整分辨率模式(默认)
1:启用完整分辨率模式。在完整分辨率模式下,传感器提供最高分辨率的数据输出。

位2 - Justify Bit(数据对齐位):
可取值:0或1
0:左对齐模式
1:右对齐模式(默认)。决定了数据在输出寄存器中的对齐方式。

位1-0 - Range Bits(范围位):
可取值:00、01、10、11
00:±2g
01:±4g
10:±8g
11:±16g。这两位用于选择加速度的测量范围,影响传感器的灵敏度和测量范围。

数据输出速率

我们可以通过设置BW_RATE寄存器来设置数据输出速率。数据输出速率就是输出数据的快慢。
该寄存器是8位的,其中高4位用于设置数据输出速率,低4位用于设置电源模式。
他的地址为0x2C

以下是BW_RATE寄存器中高4位的数据输出速率选项及其对应的取值:

取值 0000:数据输出速率为 0.10 Hz
取值 0001:数据输出速率为 0.20 Hz
取值 0010:数据输出速率为 0.39 Hz
取值 0011:数据输出速率为 0.78 Hz
取值 0100:数据输出速率为 1.56 Hz
取值 0101:数据输出速率为 3.13 Hz
取值 0110:数据输出速率为 6.25 Hz
取值 0111:数据输出速率为 12.5 Hz
取值 1000:数据输出速率为 25 Hz
取值 1001:数据输出速率为 50 Hz
取值 1010:数据输出速率为 100 Hz
取值 1011:数据输出速率为 200 Hz
取值 1100:数据输出速率为 400 Hz
取值 1101:数据输出速率为 800 Hz
取值 1110:数据输出速率为 1600 Hz
取值 1111:数据输出速率为 3200 Hz

低4位用于设置电源模式,但在大多数情况下,这些位应该设置为默认值(0),以选择正常功耗模式。
比如我们要使用100Hz,正常电源模式就要写入0x0A

POWER_CRL寄存器设置

ADXL345的POWER_CTL寄存器用于控制传感器的电源和操作模式。它是一个8位寄存器,每一位都有特定的功能。以下是各位的作用及取值:

位 7(0x80):HSE(High-Speed Enable)
当此位设置为 1 时,传感器工作在高速模式下(3.2 kHz)。否则,传感器在正常模式下工作。
取值:1(高速模式),0(正常模式)。

位 6(0x40):休眠模式
当此位设置为 1 时,传感器进入休眠模式,功耗降低到最低水平。
取值:1(进入休眠模式),0(退出休眠模式)。

位 5(0x20):测量
设置此位为 1 时,传感器开始进行测量。
取值:1(开始测量),0(停止测量)。

位 4(0x10):AUTO_SLEEP
如果启用自动睡眠模式,传感器将在没有活动时自动进入睡眠模式。
取值:1(启用自动睡眠模式),0(禁用自动睡眠模式)。

位 3(0x08):测量
如果测量位设置为 1,传感器处于测量模式。在这种模式下,传感器将执行测量,并在测量完成后将该位清零。
取值:1(正在测量),0(测量结束)。

位 2(0x04):休眠模式
设置此位为 1,将传感器置于休眠模式。
取值:1(休眠模式),0(正常模式)。

位 1(0x02):休眠
如果设置为 1,传感器进入休眠模式。
取值:1(进入休眠模式),0(退出休眠模式)。

位 0(0x01):休眠
与位 1 具有相同的功能,但是当此位和位 1 同时设置时,优先级更高。
取值:1(进入休眠模式),0(退出休眠模式)。

如果你想写入数据,你应该写0x2D地址
如果你想测量的话,你需要设置该寄存器为0x28

禁止中断

在adxl345上面可以看到INT1,INT2,这些是中断引脚,但是我们并不需要使用中断,我们可以使用下面的代码进行禁用:

HAL_I2C_Mem_Write(&hi2c1,WRITE,0x2E,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
HAL_I2C_Mem_Write(&hi2c1,WRITE,0x1E,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
HAL_I2C_Mem_Write(&hi2c1,WRITE,0X1F,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
HAL_I2C_Mem_Write(&hi2c1,WRITE,0X20,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);

3.3 读取x、y、z轴的加速度

通过芯片手册可以知道,我们读下面的寄存器即可得到x、y、z轴的加速度
【STM32 CubeMX】adxl345加速度传感器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c,c++,mcu,51单片机
DATAX0为低位,DATAX1为高位。
我们可以通过下面的公式进行转换:

(short)(((uint16_t)readData[1]<<8)+readData[0])

3.4 读取示例

#define WRITE 0x3A
#define READ 0x3B

int BeginADXL345(void)
{
	uint8_t id,val;
  HAL_I2C_Mem_Read(&hi2c1,READ,0x00,I2C_MEMADD_SIZE_8BIT,&id,1,0xff);   
	if(id ==0XE5){      //读器件ID,ADXL345的器件ID为0XE5
			val = 0x2B;     //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0x31,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			val = 0x0A;     //数据输出速度为100Hz
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0x2C,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			val = 0x28;     //链接使能,测量模式
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0x2D,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			val = 0x00;     //不使用中断
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0x2E,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0x1E,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0X1F,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			HAL_I2C_Mem_Write(&hi2c1,WRITE,0X20,I2C_MEMADD_SIZE_8BIT,&val,1,0xFF);
			return 0;
	}           
	return 1;
}

typedef struct ADXLData
{
	short x;
	short y;
	short z;
}ADXLData;

ADXLData readADXL345()
{
	uint8_t readData[6] = {0};
	ADXLData ret;
	
	int r = HAL_I2C_Mem_Read(&hi2c1,READ,0x32,I2C_MEMADD_SIZE_8BIT,readData,6,1000);
	if(r == HAL_OK)
		printf("read OK\n");
	else
		printf("Error %d\n",r);
	
	int16_t x_accel, y_accel, z_accel;
	int16_t x_accel_raw, y_accel_raw, z_accel_raw;

	ret.x=(short)(((uint16_t)readData[1]<<8)+readData[0]);   //DATA_X1为高位有效字节    
	ret.y=(short)(((uint16_t)readData[3]<<8)+readData[2]);   //DATA_Y1为高位有效字节        
	ret.z=(short)(((uint16_t)readData[5]<<8)+readData[4]);   //DATA_Z1为高位有效字节   
	
	return ret;
}

/* USER CODE BEGIN 2 */
	
BeginADXL345();

 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	data = readADXL345();
	printf("X: %hd   Y:%hd  Z:%hd\n",data.x,data.y,data.z);
	printf("angle_X:%hd\n",ADXL345_Get_Angle((double)data.x,(double)data.y,(double)data.z,0));
	HAL_Delay(1000);
   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */
 }

3.5 得到角度

adxl345不仅可以测量各个轴的加速度,还可以根据他们测量出各个轴的角度:
我们可以使用下面这个函数进行角度的计算:

short ADXL345_Get_Angle(float x,float y,float z,uint8_t dir){
    float temp;
    float res=0;    //弧度值
    switch(dir){
        case 0:     //0表示与Z轴的角度
            temp=sqrt((x*x+y*y))/z;
            res=atan(temp);
            break;
        case 1:     //1表示与X轴的角度
            temp=x/sqrt((y*y+z*z));
            res=atan(temp);
            break;
        case 2:     //2表示与Y轴的角度
            temp=y/sqrt((x*x+z*z));
            res=atan(temp);
            break;
    }
    return res*180/3.14;    //返回角度值
}

3.6 滤波处理

对于adxl345可能读取的有一定的偏差,这时我们可以使用多次测量取平均值,得到最后一个较为准确的值:

/*读取ADXL345的数据并做滤波处理,读times次再取平均值*/
void ADXL345_Read_Average(short *x,short *y,short *z,uint8_t times){
    uint8_t i;
    ADXLData data;
    *x=0; *y=0; *z=0;
    if(times){
        for(i=0;i<times;i++){
            data = readADXL345();
            *x+=data.x; *y+=data.y; *z+=data.z;
            HAL_Delay(5);
        }
        *x/=times; *y/=times; *z/=times;
    }
}   

总结

本文简要介绍了如何在STM32 CubeMX中配置和使用ADXL345加速度传感器。首先,我们介绍了ADXL345传感器的基本原理和特点,然后详细说明了在CubeMX中如何配置I2C接口以及相关的GPIO引脚。接着,我们演示了如何通过I2C总线与ADXL345通信,并读取其加速度数据。最后,我们提供了一些示例代码和调试技巧,以帮助开发者更好地理解和使用ADXL345传感器。

通过本文的学习,读者可以掌握在STM32嵌入式系统中使用ADXL345加速度传感器的基本方法,为实际项目的开发和应用提供了参考和指导。文章来源地址https://www.toymoban.com/news/detail-833048.html

到了这里,关于【STM32 CubeMX】adxl345加速度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无线传感器基础:获取手机传感器、加速度

    一些实验过程中的疑问: 如何知道设备上有哪些传感器? 如果手机不支持的传感器,程序运行往往不会抛出异常,只是无法获得传感器传回的数据。那么如何知道设备上有哪些传感器可用呢?有两种方式,一种是直接方式,一种是间接方式。直接方式就是遍历获取得到传感

    2024年02月02日
    浏览(42)
  • SC7A20(士兰微-加速度传感器)示例

            做个笔录,最近项目使用了此款gsensor,实现了简单示例         硬件平台(RTL8762DK)         IDE:keil5.29 1、原理图    1、sc7a20.h   2、sc7a20.c

    2024年02月16日
    浏览(28)
  • SC7A20 三轴加速度传感器 驱动

    使用的时候需要找对文档,之前文档不对,导致读取的数据计算角度一直不成功,发现要关闭高通滤波,由于高通滤波寄存器里面的滤波阈值没有文档说明,我直接关闭掉就可以使用了,代码与硬件平台无关,需要底层IIC接口支持,软件IIC或HC32的硬件IIC可以查阅我其他博客;

    2024年02月11日
    浏览(28)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)

    本文的初衷一方面是将我的一些关于STM32开发方面浅显的个人经验分享给初学者、并期望得到大佬的批评指正,另一方面是记录自己的实验过程便于回顾。 我预感应该要写很多,不过鉴于之前的数篇笔迹中,对于SPI/DMA/ADXL3XX系列加表的使用已经详细描述过了,所以这篇博客只

    2024年02月10日
    浏览(37)
  • 【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言~~~ 传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具。 因为具体的感应信息依赖于相关硬件,所以虽然Android定义了众多感应器,但是并非每部手机都能支持这么多感应器。 传感器一般借助于硬件监听

    2024年02月09日
    浏览(37)
  • STM32+onenet+M5311+GPS+ADXL345+RS485+RS232+后台管理+定位+轨迹+接口+小程序+电话通知+短信通知+公众号通知+远程控制+支付控制+固件升级方案设计

    目录 1 功能简介 1.1 硬件设备 1.2 应用系统 2 硬件设计 2.1 电路设计 2.2 PCB设计 2.3 存储空间 3 通信协议 3.1 下行通信 3.2 上行通信 4 应用设计 4.1 运行日志 4.2 数据分析 4.3 监测通知 4.4 远程控制 4.5 支付控制 5 日常管理 5.1 手机网页 5.2微信小程序 6 系统扩展 6.1 获取token接口 6.2

    2024年02月19日
    浏览(35)
  • 怎么加速网速?如何加速网络下载速度真正提高网速

    怎么加速网速?我们经常在下载东西的时候,会觉得网速很不给力。其实这不仅关系到你的带宽,还关系到你的电脑。下面我介绍一个比较适合新手的方法,使我们计算机发挥到最佳下载模式。达到宽带最大利用率。 软媒魔方电脑大师 V6.25 绿色免费版 类型: 系统增强 大小:

    2024年02月07日
    浏览(28)
  • 跑出创新加速度,AI基础软件成AIGC产业发展加速器

    2023年中国国际服务贸易交易会(以下简称“服贸会”)受世界瞩目正在火热进行,9月4日,服贸会专题论坛之“2023中国AIGC创新发展论坛” 在大会期间成功举办, 九章云极DataCanvas公司副总裁周晓凌受邀出席论坛,并发表题为“AI基础软件促进大模型与AIGC应用快速发展”的精

    2024年02月09日
    浏览(37)
  • [足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-5 刚体的加速度与角加速度

    本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有帮助请引用 本文参考: . 食用方法 求解逻辑:速度与

    2024年01月25日
    浏览(49)
  • ABB、FANUC机器人点位加速度用法

    机器人在点位与点位之间的运动,会存在速度上的变化,加速度指令的添加可以减小机器人在运动中,由高速到低速间惯性的带来的影响,修正机器人的路径误差,让机器人的运动更加顺滑。 ABB机器人加速度指令为ACCSET指令 ACCSET指令中的第一个参数是设置加速度,第二个参

    2024年04月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包