当前位置: 首页 > news >正文

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代码正确
在这里插入图片描述
在这里插入图片描述
遇事不决,可问春风!

相关文章:

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

STM32HAL库驱动ADXL345传感器&#xff08;SPI协议&#xff09; ADXL345传感器简介实物STM32CubeMX配置SPI配置片选引脚配置串口配置 特别注意&#xff08;重点部分&#xff09;核心代码效果展示 ADXL345传感器简介 ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加…...

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…...

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX&#xff1a;hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…...

宝塔发布网站问题汇总和记录

1、添加网站站点后打不开 解决办法&#xff0c;关闭防跨站攻击2 2、laravel项目部署到linux的时候出现The stream or file "/home/www/storage/logs/laravel.log" could not be opened in append mode 给目录加权限 chmod -R 777 storage 3、Class "Redis"…...

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …...

自动化网络监控:每分钟自动检测网站可用性

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…...

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的微…...

MSSQL行转列、列转行

行转列 SELECT * FROM student PIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语) ) AS PivotedData; 列转行 SELECT * FROM student1 UNPIVOT ( score FOR subject IN ("语文","数学","英语") )AS PivotedData;...

【MySQL】创建和管理表

文章目录 前置 标识符命名规则一、MySQL数据类型二、创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 三、创建表3.1 创建方式一3.2 创建方式二3.3 查看数据表结构 四、修改表4.1 增加一个列4.2 修改一个列4.3 重命名一个列4.4 删除一个列 五、重命…...

缓存和数据库一致性

前言&#xff1a; 项目的难点是如何保证缓存和数据库的一致性。无论我们是先更新数据库&#xff0c;后更新缓存还是先更新数据库&#xff0c;然后删除缓存&#xff0c;在并发场景之下&#xff0c;仍然会存在数据不一致的情况&#xff08;也存在删除失败的情况&#xff0c;删除…...

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…...

transbigdata 笔记: 轨迹密集化/稀疏化 轨迹平滑

1 密集化 transbigdata.traj_densify(data, col[Vehicleid, Time, Lng, Lat], timegap15) 轨迹致密化&#xff0c;保证至多每隔timegap秒都有一个轨迹点 这边插补使用的是pandas的interpolate&#xff0c;method设置的是index 1.1 举例 transbigdata 笔记&#xff1a; 官方…...

反向代理的本质是什么?

反向代理是一种网络架构模式&#xff0c;通常用于提供静态内容、处理安全、负载均衡和缓存等任务。在这种架构中&#xff0c;客户端发送的请求首先到达反向代理服务器&#xff0c;然后由反向代理服务器将请求转发给后端的实际服务器。反向代理服务器可以处理和修改请求和响应&a…...

Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)

作为一名从事网络安全的技术人员&#xff0c;不懂Kali Linux的话&#xff0c;连脚本小子都算不上。 Kali Linux预装了数百种享誉盛名的渗透工具&#xff0c;使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集&#xf…...

UML-用例图

提示&#xff1a;用例图是软件建模的开始&#xff0c;软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能&#xff0c;除了用于软件开发的需求分析阶段&#xff0c;也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…...

jmeter--8.加密传输

目录 1. Base64加密 2. MD5加密 3. SHA加密&#xff08;sha1\sha\sha224\sha256\sha384\sha512&#xff09; 4. RSA加密-公钥加密&#xff0c;私钥解密 1. Base64加密 1.1 在需要加密传输的接口下新增BeanShell 预处理程序&#xff0c;${username}可替换成value值&#xff…...

微信小程序canvas画布转图片转pdf文件

关键步骤介绍 步骤一:将canvas页面保存为图片 for(var a=0;a<this.data.page_canvas.length;++a){ var t_page_img = await this.canvas_to_image(this.data.page_canvas[a]) t_img.push(t_page_img) } this.data.page_canvas是保存的canvas界面,this.c…...

【Linux操作】国产Linux服务管理操作

【Linux操作】国产Linux服务管理操作 前言SAMBA配置服务器端1. 安装相关包2. 配置/etc/samba/smb.conf&#xff0c;在此文件末尾添加如下内容&#xff0c;并保存退出。3. 创建/home/share并更改权限4. 启动samba服务 客户端• Windows客户端• 麒麟客户端 Telnet1、telnet语法2…...

大语言模型系列-word2vec

文章目录 前言一、word2vec的网络结构和流程1.Skip-Gram模型2.CBOW模型 二、word2vec的训练机制1. Hierarchical softmax2. Negative Sampling 总结 前言 在前文大语言模型系列-总述已经提到传统NLP的一般流程&#xff1a; 创建语料库 > 数据预处理 > 分词向量化 > …...

vue项目运行报错this[kHandle] = new _Hash(algorithm, xofLen)

自从昨天分盘重装了最新版本的Node之后&#xff0c;项目是一启一个报错 出现这个报错时&#xff0c;需要在package.json文件中 dev命令行 增加&#xff1a;set NODE_OPTIONS–openssl-legacy-provider 出现该问题的原因&#xff1a; node.js V17开始版本中发布的是OpenSSL3.0,…...

用 MinIO 搭建 S3 兼容对象存储服务

用 MinIO 搭建 S3 兼容对象存储服务 分类&#xff1a;开源项目部署 MinIO 适合附件、备份归档和 S3 兼容对象文件。这类主题真正跑起来并不难&#xff0c;难的是上线后稳定、可备份、能排错。本文按实操方式整理一套可以直接落地的流程&#xff0c;默认你已经会登录 Linux 服务…...

AI辅助编程:发展现状、效率评估与未来展望

引言:AI如何重塑编程范式? 在过去的几年里,人工智能(AI)正以前所未有的速度渗透到软件开发的各个角落。从最初的代码补全工具,到如今能够理解复杂需求、生成完整函数甚至设计系统架构的智能体,AI辅助编程已经从科幻概念演变为开发者日常工作中不可或缺的“副驾驶”。它…...

HS2-HF_Patch:Honey Select 2 终极汉化与功能增强完整指南

HS2-HF_Patch&#xff1a;Honey Select 2 终极汉化与功能增强完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch 是专为 Honey Select 2 游戏…...

GitHub资源精准下载:3分钟掌握DownGit的完整使用指南

GitHub资源精准下载&#xff1a;3分钟掌握DownGit的完整使用指南 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 还在为下载GitHub上单个文件而烦恼吗&#xff1f;DownGit是你的终极解决方案&#xff01;这个…...

Unity+C#开发万人MMO服务器的实战架构与同步优化

1. 这不是“写个服务器”那么简单&#xff1a;先撕开“万人在线”的真实含义很多人看到“UnityC#开发万人MMO服务器”这个标题&#xff0c;第一反应是&#xff1a;“哦&#xff0c;用Unity做客户端&#xff0c;C#写个后端&#xff0c;Socket连一连&#xff0c;再加个数据库&…...

Source Sans 3:让数字界面阅读体验焕然一新的开源字体解决方案

Source Sans 3&#xff1a;让数字界面阅读体验焕然一新的开源字体解决方案 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans 你是否曾经在设计网页或应用时&#xff0c;…...

通过用量看板与成本管理功能实现团队API支出精细化管控

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板与成本管理功能实现团队API支出精细化管控 对于依赖大模型API进行开发的团队而言&#xff0c;成本控制与资源分配的透…...

交互形态的深层迭代:从文本到具象化表达

行业在探索智能交互形态时&#xff0c;会发现一个共性现象&#xff1a;不少智能体的逻辑与生成能力已经成熟&#xff0c;但对外交互始终局限在文本对话框。 过去一年&#xff0c;行业主流做法高度趋同&#xff1a;大模型对接知识库、工具调用、流程编排&#xff0c;最终收敛为文…...

LoRA参数高效微调:低秩适配原理与可视化实战

1. 项目概述&#xff1a;这不是调参&#xff0c;是给大模型“打补丁”的手艺活LoRA&#xff08;Low-Rank Adaptation&#xff09;不是什么新潮概念&#xff0c;它本质上是一种参数高效微调&#xff08;PEFT&#xff09;的工程实践智慧——当你要让一个百亿参数的GPT或BERT模型去…...

KMS智能激活终极指南:三步永久激活Windows和Office的完整教程

KMS智能激活终极指南&#xff1a;三步永久激活Windows和Office的完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文档突然…...