STM32+HAL库驱动ADXL345传感器(SPI协议)

STM32+HAL库驱动ADXL345传感器(SPI协议)

  • ADXL345传感器简介
  • 实物
  • STM32CubeMX配置
    • SPI配置
    • 片选引脚配置
    • 串口配置
  • 特别注意(重点部分)
  • 核心代码
  • 效果展示

ADXL345传感器简介

在这里插入图片描述
ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器。该加速度传感器的特点有:

a. 分辨率高。最高 13 位分辨率。

b. 量程可变。具有+/-2g, +/-4g, +/-8g, +/-16g 可变的测量范围。

c. 灵敏度高。最高达 3.9mg/LSB,能测量不到 1.0°的倾斜角度变化。

d. 功耗低。 40~145uA 的超低功耗,待机模式只有 0.1uA。

e. 尺寸小。整个 IC 尺寸只有 3mm5mm1mm, LGA 封装。

ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内部有多种运动状态检测和灵活的中断方式等特性。
引脚如下所示:
在这里插入图片描述

实物

使用的是STM32F103ZET6单片机,使用了SPI2
主要接线为:CS接PB6;SCL接PB13;SDA接PB15;SDO接PB14。
在这里插入图片描述

STM32CubeMX配置

使用的是STM32F103ZET6单片机,使用SPI2,通过串口进行数据显示
时钟配置如下:
在这里插入图片描述

SPI配置

在这里插入图片描述

使用硬件SPI,根据ADXL345的SPI时序图,选择SPI的模式3,片选使用软件片选
在这里插入图片描述

片选引脚配置

片选使用的是PB6引脚
在这里插入图片描述

串口配置

在这里插入图片描述

特别注意(重点部分)

1.模块默认使用IIC通信,如果需要使用四线SPI通信,需要将模块的R4电阻取掉,如果不取,就抓不到时序。原因如下图所示:
在这里插入图片描述
模块将芯片的SDO引脚通过R4电阻直接连接到GND,如果不把R4电阻取掉,接线上去读时序是读不到信号的。
在这里插入图片描述
2.对于SPI采集,需要注意一下,有的MCU会把SPI1的SCK引脚用作调试引脚,导致使用逻辑分析仪抓取波形的时候,SCK引脚一直处于拉高状态,解决方案:A.将SCK引脚重映射去其他引脚;B.换一组SPI

核心代码

ADXL345.C的代码


#include "ADXL345.h"
#include "spi.h"
#include "stdio.h"
/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
#define SET_SPI_CS_H	HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
#define SET_SPI_CS_L	HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);

//写字节
void ADXL345_Write(uint8_t addr, uint8_t value)
{
	addr &= 0x3F;
	SET_SPI_CS_L;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
	HAL_SPI_Transmit(&hspi2, &value, 1, 10);
	SET_SPI_CS_H;
}
//读字节
void ADXL345_Rread(uint8_t addr, uint8_t *value)
{
	addr &= 0x3F;	
	addr |= (0x80);
	SET_SPI_CS_L;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
	HAL_SPI_Receive(&hspi2, value, 1, 10);
	SET_SPI_CS_H;
}

//读ID
uint8_t Get_Adxl345_ID(void)
{
	uint8_t DEVICEID = 0x00;
	uint8_t result = 0;
	ADXL345_Rread(DEVICEID, &result);

	return result;
}
//初始化
void ADXL345_Init(void)
{
	while (Get_Adxl345_ID() != 0xE5)//e5
	{
		printf("ADXL345 Init Fail:%x\r\n", Get_Adxl345_ID());
		HAL_Delay(1000);
	}

	ADXL345_Write(INT_ENABLE, 0x00);
	ADXL345_Write(DATA_FORMAT, 0x0B);
	ADXL345_Write(BW_RATE, 0x1A);
	ADXL345_Write(POWER_CTL, 0x08);
	ADXL345_Write(INT_ENABLE, 0x14);

	printf("ADXL345 Init Success\r\n");
}
//读取X轴数据
void ADXL345_XTest(void)
{
	short x;
	uint8_t addrxl = 0x32;
	uint8_t addrxh = 0x33;
	uint8_t xl, xh;

	ADXL345_Rread(addrxl, &xl);
	ADXL345_Rread(addrxh, &xh);

	x = (short)(((uint16_t)xh << 8) + xl);

	printf("X:%d\r\n", x);
}

//读取Y轴数据
void ADXL345_YTest(void)
{
	short Y;
	uint8_t addrYl = 0x34;
	uint8_t addrYh = 0x35;
	uint8_t Yl, Yh;

	ADXL345_Rread(addrYl, &Yl);
	ADXL345_Rread(addrYh, &Yh);

	Y = (short)(((uint16_t)Yh << 8) + Yl);

	printf("Y:%d\r\n", Y);
}
//读取Z轴数据
void ADXL345_ZTest(void)
{
	short Z;
	uint8_t addrZl = 0x34;
	uint8_t addrZh = 0x35;
	uint8_t Zl, Zh;

	ADXL345_Rread(addrZl, &Zl);
	ADXL345_Rread(addrZh, &Zh);

	Z = (short)(((uint16_t)Zh << 8) + Zl);

	printf("Z:%d\r\n", Z);
}


ADXL345.H的代码

#ifndef ADXL345_H_
#define ADXL345_H_

#include "main.h"
/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
 
/******************ADXL345寄存器命令定义**********************/
#define DEVICE_ID           0X00        //获取器件ID,0XE5
#define THRESH_TAP          0X1D        //敲击阀值
#define OFSX                0X1E	//x轴调整偏移值
#define OFSY                0X1F
#define OFSZ                0X20
#define DUR                 0X21
#define Latent              0X22
#define Window              0X23
#define THRESH_ACK          0X24
#define THRESH_INACT        0X25
#define TIME_INACT          0X26
#define ACT_INACT_CTL       0X27
#define THRESH_FF           0X28
#define TIME_FF             0X29
#define TAP_AXES            0X2A
#define ACT_TAP_STATUS      0X2B
#define BW_RATE             0X2C
#define POWER_CTL           0X2D
 
#define INT_ENABLE          0X2E
#define INT_MAP             0X2F
#define INT_SOURCE          0X30
#define DATA_FORMAT        0X31
#define DATA_X0            0X32
#define DATA_X1            0X33
#define DATA_Y0            0X34
#define DATA_Y1            0X35
#define DATA_Z0            0X36
#define DATA_Z1            0X37
#define FIFO_CTL            0X38
#define FIFO_STATUS         0X39
 
#define I_M_DEVID      ((uint8_t)0xE5) //器件ID=0XE5
 
//初始化
void ADXL345_Init(void);
//读取X轴数据
void ADXL345_XTest(void);
//读取Y轴数据
void ADXL345_YTest(void);
//读取Z轴数据
void ADXL345_ZTest(void);
#endif /* ADXL345_H_ */


main的代码

/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
  /* USER CODE END 2 */
	ADXL345_Init();		
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {          
		//读取X轴数据
		ADXL345_XTest();
		//读取Y轴数据
		ADXL345_YTest();
		//读取Z轴数据
		ADXL345_ZTest();
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

效果展示

初始化模块的时序图:回读E5代码正确
在这里插入图片描述
在这里插入图片描述
遇事不决,可问春风!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security- 基于角色的访问控制

基于角色 或权限 进行访问控制 hasAuthority方法 如果当前的主体具有指定的权限,则返回true,否则返回false 修改配置类 //当前登录用户 只有具备admins权限才可以访问这个路径.antMatchers("/test/index").hasAuthority("admins") 代码如下: package c…

达芬奇调色软件DaVinci Resolve Studio 18 中文激活版

DaVinci Resolve Studio 18是一款功能强大的视频编辑软件&#xff0c;它可以帮助用户轻松完成视频剪辑、调色、音频处理和特效合成等任务。 软件下载&#xff1a;DaVinci Resolve Studio 18 中文激活版下载 这款软件具有友好的用户界面和易于使用的功能&#xff0c;使得用户能够…

云服务器CVM_云主机_云计算服务器_弹性云服务器

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

transbigdata笔记:轨迹停止点和行程提取

1 traj_stay_move——标识停靠点和行程 1.1 方法介绍 如果两个连续轨迹数据点&#xff08;栅格化处理之后&#xff09;之间的持续时间超过设定的阈值&#xff0c;将其视为停靠点。两个停靠点之间的时间段被视为一个行程 1.2 使用方法 transbigdata.traj_stay_move(data, pa…

从零开始搭建ubuntu 16.04 pwndocker环境

1.安装VMware-tools 1.1遇到问题 在使用 VMware Workstation时遇到了VMware Tools不能安装的问题&#xff0c;具体表现为&#xff1a;在要安装VMware Tools的虚拟机上右键 ----》安装VMware Tools(T)… 为灰色&#xff0c;不能够点击。 1.2解决方案    1. 关闭虚拟机&…

设计Twitter时间线和搜索功能

设计Twitter时间线和搜索功能 设计 facebook feed 和 设计 facebook search是相同的问题 第一步&#xff1a;定义用例和约束 定义问题的需求和范围&#xff0c;询问问题去声明用例和约束&#xff0c;讨论假设 ps: 没有一个面试官会展示详细的问题&#xff0c;我们需要定义一些用…

【软件测试】学习笔记-测试基础架构

这篇文章探讨什么是测试基础架构。 什么是测试基础架构&#xff1f; 测试基础架构指的是&#xff0c;执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此&#xff0c;我们也把测试基础架构称之为广义的测试执行环境。通常来讲&#xff0c;测试基础 架构主要包括…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

Spring Security-用户注销及记住我

用户注销 在配置类增加退出映射地址 Overrideprotected void configure(HttpSecurity http) throws Exception {//退出/注销http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();} 完整代码: package com.config;​import o…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒&#xff0c;以中国红为主题&#xff0c;为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计&#xff0c;无不体现出中国红的热情与活力&#xff0c;象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

设计模式之依赖倒转原则

在软件开发的世界里&#xff0c;设计模式一直是提升代码质量、确保软件稳定性以及优化软件可维护性的重要工具。而在这其中&#xff0c;依赖倒转原则无疑是其中最具代表性的设计模式之一。那么&#xff0c;什么是依赖倒转原则&#xff1f;它又为何如此重要&#xff1f;让我们一…

Android 系统启动过程纪要(基于Android 10)

前言 看过源码的都知道&#xff0c;Launcher系统启动都会经过这三个进程 init ->zygote -> system_server。今天我们就来讲解一下这三个进程以及Launcher系统启动。 init进程 准备Android虚拟机环境&#xff1a;创建和挂载系统文件目录&#xff1b;初始化属性服务&…

解决哈希冲突的几种方法

什么是hash冲突 哈希函数是一个映像&#xff0c;把任意长度的输入&#xff0c;通过Hash算法变换成固定长度的输出&#xff0c;这个输出就是Hash值&#xff1b; 当两个不同的输入&#xff0c;产生了同一个输出值即为哈希冲突 解决方式 开放定址法 开放寻址法的核心思想是&am…

PyQt5多线程使用

PyQt5多线程使用 本案例使用PyQt5多线程实现一个UI界面同时显示3个时间实时更新控件&#xff0c;从而直观地了解到Qt多线程是如何进行工作的。 from PyQt5.QtCore import QThread,pyqtSignal,QDateTime from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit,QVBoxLay…

[Android]实现一个权限申请类

[Android]实现一个权限申请类 导言 在引入了动态权限申请之后&#xff0c;Android的权限申请就变得尤为繁琐&#xff0c;若是按照原有的方法一板一眼地进行申请&#xff0c;样板代码未免太多。因此本篇文章就使用ActivityResult API&#xff0c;来实现一个简单的权限申请类来帮…

【漏洞复现】Kubernetes PPROF内存泄漏漏洞(CVE-2019-11248)

Nx01 产品简介 Kubernetes&#xff08;简称K8S&#xff09;是Google在2014年开源的一个容器集群管理系统。它用于容器化应用程序的部署、扩展和管理&#xff0c;目标是让部署容器化应用简单且高效。 Nx02 漏洞描述 漏洞存在于Kubernetes的1.18.6版本之前&#xff0c;可能导致未…

「解析」Jetson配置 git服务

这两天感冒了在家休养&#xff0c;想着把之前买的 Jetson 开发板用起来&#xff0c;买Jetson的初衷就是用来学习Linux系统&#xff0c;顺道可以部署算法&#xff0c;以及一些其他需求&#xff0c;相比树莓派而言&#xff0c;Jetson开发相对更贵&#xff0c;但是其配备了英伟达的…

conda 安装, 配置以及使用

文章目录 1. 安装2. 配置2.1 如何配置2.2 快速设置取消自动进入 base 环境conda 添加清华源pip 添加清华源pip 更新为最新版本 3. 使用 conda 是 python 的环境管理工具包&#xff0c;非常好用&#xff0c;特别是 miniconda 相对于 conda 不需要安装其他的工具&#xff0c;而且…

详细讲解Python中的aioschedule定时任务操作

目录 前言1. 基本概念2. 基本API3. Demo 前言 如果下面的函数库无法执行&#xff0c;出现类似&#xff1a;&#xff08;前提是python3.7以上&#xff09; AttributeError: module ‘asyncio‘ has no attribute ‘run‘请检查run是否可跳转&#xff0c;如果无法跳转&#xff…