ADXL372高g加速度计驱动实战:初始化、FIFO与瞬时开关配置

发布时间:2026/9/23 16:26:55
ADXL372高g加速度计驱动实战:初始化、FIFO与瞬时开关配置 简介ADI公司的ADXL372三轴加速度计中文版数据手册PDF面向硬件工程师、嵌入式开发者和物联网产品选型人员用于解决高g冲击检测场景下的器件选型与驱动开发问题。压缩包内共1个PDF文件体积17.65MB为完整中文翻译版数据手册内容覆盖功能框图、引脚配置、SPI/I2C接口规范、典型性能曲线以及冲击检测、FIFO、唤醒模式等关键章节。已有1029人浏览学习。手册重点阐述了±200g量程、3200Hz输出速率下仅22µA的超低功耗特性并结合4极抗混叠滤波器、可调高通滤波器、低功耗唤醒和瞬时开启模式解释了如何在撞击事件发生时既保持微安级功耗又能快速捕获瞬态数据。同时手册对系统级省电策略、自主中断处理和峰值加速度捕获机制也有详细说明可直接帮助开发者在资产健康评估、便携式IoT边缘节点、脑震荡检测等产品设计中缩短验证周期。1. 搜 ADXL372 中文 pdf其实你要的是这颗高 g 加速度计的初始化顺序搜「ADXL372中文pdf」的人多数不是缺那几十页翻译而是手上有一颗 ADXL372正接到 STM32 或 ESP32 上卡在 DEVID 读不对、FIFO 数据顺序怪、瞬时开关节能模式配置不上这类具体问题上。ADXL372 是 ADI 的 ±200 g 三轴 MEMS 加速度计和常见的 ADXL345 不是一类量程固定很高、测量功耗约 22 µA、待机约 0.1 µA还内置 512 字节 FIFO 和超量程检测适合做撞击记录、跌落检测、工业设备冲击监测。这篇文章把「初始化 → 配置 FIFO → 读数据 → 做撞击检测」整条链路讲完顺带把中文手册里容易看岔的位置标出来让新手能按步骤跑通让熟手少踩两个寄存器级的坑。2. 先看清 ADXL372 的定位再选 SPI 或 I2C 接口2.1 同为三轴加速度计ADXL345 和 ADXL362 不能平替 ADXL372ADXL372 出现在手里的原因通常只有一个要测的东西会「撞」而且撞得比 ±16 g 狠。ADXL345 的满量程是 ±16 g日常姿态检测够用但设备跌落或金属部件碰撞时峰值轻易超过 50 g量程小的传感器直接削顶后续所有算法都失去意义。ADXL362 主打微功耗量程却只有 ±8 g适合电池供电的倾斜与活动监测同样接不了冲击信号。ADXL372 的意义在于把「高 g 量程」和「低功耗」放在同一颗芯片里量程 ±200 g输出带宽最高到 3.2 kHz 这一档测量模式典型功耗约 22 µA待机约 0.1 µA。它和 ADXL345 一样是 12 位 ADC但设计目标是撞击记录、跌落检测、工业设备冲击监测这类短时大信号场景。型号量程输出数据速率典型功耗FIFO典型场景ADXL345±16 g最高 3200 Hz测量约 140 µA32 级姿态、倾斜、运动检测ADXL362±8 g最高 400 Hz测量约 2 µA 100 Hz512 样本电池供电活动检测ADXL372±200 g最高 3.2 kHz测量约 22 µA512 字节撞击、跌落、冲击记录选型时还有一层容易忽略撞击事件的脉宽可能只有 1 ms要让峰值不被漏掉ODR 至少要 1 kHz 以上。ADXL375 也是一颗高 g 芯片但 ADXL372 的优势在 FIFO 和超量程检测数据可以不经过主控连续缓存主控休眠时检测到超阈值再醒来读对电池供电的监测节点友好得多。2.2 引脚电平、I2C 地址和上电时序先于代码确认拿到 ADXL372 先别急着写驱动两个引脚问题要先确认。VDD 范围是 2.0~3.5 V接口电平由 IO_VDD 决定MCU 是 3.3 V 就接 3.3 VMCU 是 1.8 V 就接 1.8 V不能直接把 IO_VDD 悬空。ADDR/SDO 这个引脚在 I2C 模式下决定从机地址的前几位常见默认地址是 0x1D在 SPI 模式下它作为 SDO 数据输出复用所以同一个引脚在两种总线下的角色完全不同。如果之前用过 ADXL345别想当然沿用它的地址和字节序寄存器映射并不一样。上电时序是新人最常见的问题来源。VDD 稳定后芯片需要一小段时间完成内部上电复位紧接着还要做一次软复位向寄存器 0x1F 写入 0x52然后等待至少几毫秒。我一般会读三遍 DEVID0x00三次都读到 0xAD 才认为 SPI/I2C 通路正常三次中任何一次读到 0x00 或 0xFF先查 CS 时序和 I2C 地址不要急着调寄存器。uint8_t adxl372_read_reg(uint8_t reg) { uint8_t tx[2] { (uint8_t)(reg 1), 0x00 }; uint8_t rx[2] { 0 }; cs_low(ADXL372_CS_PIN); spi_transfer(tx, rx, 2); cs_high(ADXL372_CS_PIN); return rx[1]; /* 第一个字节是地址第二个字节才是数据 */ }读单字节时SPI 指令由地址字节本身承载reg 左移一位最低位为 0 表示读。这里 addr 是 7 位寄存器地址所以reg 1得到完整 8 位指令。CS 拉低后连续传两个字节第一个字节是地址第二个字节是芯片回的数据。用同样的方式写寄存器时把最低位置 1void adxl372_write_reg(uint8_t reg, uint8_t val) { uint8_t tx[2] { (uint8_t)((reg 1) | 0x01), val }; cs_low(ADXL372_CS_PIN); spi_transfer(tx, NULL, 2); cs_high(ADXL372_CS_PIN); }SPI 模式用模式 3CPOL1、CPHA1SCLK 频率按型号手册标注的上限留一半余量比如手册标 10 MHz驱动里先设 5 MHz 调通再说。上电后先软复位再读 DEVID顺序不能反过来DEVID 读到 0xAD 后可以读相邻的 DEVID_MST0x01和 PART_ID0x02做二次校验这三字节组合能挡住大部分总线错位问题。2.3 读 0x08–0x0D 一组完整样本验证数据通路只用单字节读也能拿数据但每个样本 6 字节逐字节读要发 6 次 CS 周期FIFO 满时容易漏数据。常见的做法是支持地址自动递增的多字节读把起始地址发出去后后续每个时钟直接返回连续寄存器。ADXL372 的输出寄存器组从 0x08 开始顺序是 XDATA_L、XDATA_H、YDATA_L、YDATA_H、ZDATA_L、ZDATA_H千万不要把低字节和高字节的顺序写反。typedef struct { int16_t x; int16_t y; int16_t z; } adxl372_sample_t; adxl372_sample_t adxl372_read_sample(void) { uint8_t buf[6]; adxl372_read_burst(0x08, buf, 6); adxl372_sample_t s; s.x (int16_t)((buf[0] 8) | buf[1]) 4; s.y (int16_t)((buf[2] 8) | buf[3]) 4; s.z (int16_t)((buf[4] 8) | buf[5]) 4; return s; }寄存器里保存的是 12 位左对齐数据低 4 位是无效位。把两字节拼成 16 位后右移 4 位就得到 12 位带符号数范围约 -2048 到 2047。这里符号由int16_t自然承接右移后不需要再手动补符号位。换算成 g 值时不同型号的标称灵敏度不一样驱动里通常用一个常量 scale 表示具体数值按数据手册「芯片属性表」里的灵敏度参数填不要从别的型号驱动里复制。到这里数据通路已经能跑通但离「能测撞击」还差一步测量模式和 FIFO 还没配置。下面进入正式配置。3. 测量模式配置从 DEVID 正确到 FIFO 批量读出3.1 POWER_CTL 三种模式待机、测量、瞬时开寄存器 0x2CPOWER_CTL的低两位决定芯片工作模式0b00 是待机0b01 是测量0b10 是瞬时开Instant On0b11 保留。待机模式下寄存器可读可写但加速度输出通道不更新很多「DEVID 正常、数据恒为 0」的问题最后都发现是忘了写 0x2C。测量模式才是正常输出数据流的模式。瞬时开是给低功耗撞击检测用的芯片内部保持高速采样以做阈值比较但不对外输出连续数据流检测到超阈值后再唤醒主机具体配置放到第 4 节。void adxl372_set_measure_mode(void) { adxl372_write_reg(0x2C, 0x01); /* MODE 字段 0b01 */ }写入模式寄存器后要等一个采样周期数据才有效。ODR 是 1600 Hz 时等待 1 ms 以上再读即可ODR 较低时按1000 / ODR毫秒估算。另外不要在待机模式下测量功耗那样测的是待机功耗不是真实工况。3.2 MEASURE_CTRL 带宽/ODR 与滤波器搭配寄存器 0x2DMEASURE_CTRL负责输出数据速率、带宽和滤波方式。ODR 的选择直接决定能捕捉到多窄的冲击脉冲。撞击事件越短需要的 ODR 越高但 ODR 升高后 FIFO 消耗速度也变快60 个样本在 1600 Hz 下只覆盖 37.5 ms 时间窗。ODR 档位适用场景60 样本时间窗200 Hz长时趋势监测、慢冲击300 ms800 Hz一般碰撞、1~2 ms 脉宽75 ms1600 Hz短脉冲、尖峰捕捉37.5 ms3200 Hz极短冲击、需要看峰值细节18.75 ms滤波搭配上金属碰撞往往伴随高频振铃如果只关心冲击包络打开低通滤波器把振铃滤掉如果要检测的方向包含静态重力分量比如设备从水平桌面跌落还要考虑交流耦合或高通滤波否则 1 g 重力叠加在 ±200 g 量程上虽然量程冗余很大但会影响阈值判断的基线。具体 ODR 和滤波器的位域组合以数据手册 MEASURE_CTRL 章节的表格为准因为不同版本手册对不同 ODR 档位的编码有调整抄旧代码容易踩坑。3.3 FIFO 模式和水位线别把旁路模式当 FIFO 用FIFO 控制寄存器是 0x18高两位选 FIFO 模式低六位配置水位线。四种模式差别很大旁路模式相当于不用 FIFO读寄存器直通FIFO 模式填满指定水位后停止写入适合事件发生后一次性读出流式模式填满后覆盖最旧数据适合持续监测最后 N 个样本触发模式由触发条件决定保存哪些样本。想做撞击记录一般用 FIFO 模式想抓撞击前的背景用流式或触发模式。模式行为典型用法00 旁路不缓存直接读寄存器数据直通、调试01 FIFO装满即停撞击后读一次10 流式覆盖最旧持续监测最后 N 样本11 触发按触发条件存事件前后对比FIFO 物理容量是 512 字节每样本 6 字节理论上能存 85 个样本。但水位线字段只有 6 位最大值 63不能直接配到 85。碰上要等 FIFO 几乎满时才读的场景我一般把水位配到 60然后轮询 FIFO_ENTRIES0x12/0x1312 位样本计数判断实际样本数。#define FIFO_WATERMARK 60u /* 水位上限 63这里取 60 */ void adxl372_fifo_config(void) { uint8_t ctrl (0x01u 6) | (FIFO_WATERMARK 0x3Fu); adxl372_write_reg(0x18, ctrl); }高位置 0b01 表示 FIFO 模式低六位是水位。FIFO 模式在样本数达到水位后停止写入主机读取 FIFO_DATA 后样本计数递减FIFO 随之腾出空间。如果配的是流式模式达到水位后不会停而是继续覆盖最旧样本所以流式场景下水位更像「告警线」而不是「停止线」。uint16_t adxl372_fifo_entries(void) { uint8_t l adxl372_read_reg(0x12); uint8_t h adxl372_read_reg(0x13); return (uint16_t)(((h 0x07) 8) | l); } void adxl372_fifo_read_all(uint8_t *buf, uint16_t max_samples) { uint16_t n adxl372_fifo_entries(); if (n max_samples) { n max_samples; } adxl372_read_burst(0x11, buf, n * 6u); }FIFO_ENTRIES 高寄存器只有低 3 位有效所以h 0x07不能省。批量读时起始地址用 0x11FIFO_DATA连续读 6N 字节每 6 字节按 X_L、X_H、Y_L、Y_H、Z_L、Z_H 排列和输出寄存器组的顺序一致。读完 FIFO 后如果还想继续用 FIFO不需要重新写 0x18样本消耗后自动继续工作但如果在 FIFO 模式停下来没读完新数据不会自动补进来这是 FIFO 模式与流式模式的行为差异。3.4 用 Python 解析原始 FIFO 字节流快速验证波形拿到 FIFO 原始字节后先用 Python 解析一版比在嵌入式端反复改打印效率高。下面的函数输入整段 FIFO 字节流输出每轴的 g 值列表。def parse_fifo(blob: bytes, scale: float 0.049): samples [] for i in range(0, len(blob) - 5, 6): axes [] for j in range(3): lo blob[i j * 2] hi blob[i j * 2 1] v (lo 8) | hi v 4 if v 2048: v - 4096 axes.append(v * scale) samples.append(tuple(axes)) return samplesscale是灵敏度系数单位 g/LSB示例值 0.049 仅用于演示投产后以手册标称值和实际翻转测量为准。v 4之后得到 12 位带符号数范围 -2048~2047再对大于等于 2048 的值减 4096 完成符号修正。解析结果如果看到 X 轴敲击却出现在 Y 轴优先怀疑字节序或三轴映射而不是传感器坏了。把解析出的列表画成曲线能直接看到撞击包络、振铃以及 FIFO 是否覆盖了完整事件。4. 用瞬时开关做低功耗撞击检测附三个高频排错点4.1 瞬时开关平时不输出数据超阈值才唤醒如果设备靠电池供电测量模式 22 µA 的功耗在许多场景下仍然偏高。瞬时开模式是 ADXL372 比较有特点的用法芯片内部保持高速采样检测到超过阈值的加速度后通过 INT 引脚唤醒主控主控从睡眠中醒来再把 FIFO 里的数据读走。这个模式下主机不需要持续读取数据流功耗远低于连读模式。配置顺序很重要要先配 FIFO、先配阈值最后再把 POWER_CTL 的模式位切到瞬时开否则阈值没有生效就切过去芯片检测不到你想让它醒来的信号。void adxl372_start_instant_on(void) { adxl372_fifo_config(); /* 先配 FIFO 模式和水位 */ adxl372_set_overrange_threshold(40); /* 超量程阈值单位按手册换算 */ adxl372_set_measure_mode(); /* 先回测量模式做最后校准 */ adxl372_write_reg(0x2C, 0x02); /* 再切瞬时开模式 */ }当阈值设定为 40 g 时芯片内部以较高采样率持续比较一旦某一轴超过阈值就产生唤醒条件。外部 MCU 进睡眠前确保 INT 引脚已配置为唤醒源唤醒后先切回测量模式0x2C0x01再读 FIFO避免在瞬时开模式下读到不完整的数据流。超量程阈值所在的寄存器组请按数据手册「超量程检测」一节查表不同版本的地址位定义有过调整写驱动时以手册最新 Rev 的位域名为准。void adxl372_wakeup_handler(void) { uint8_t buf[6 * FIFO_WATERMARK]; adxl372_write_reg(0x2C, 0x01); /* 切回测量模式 */ adxl372_fifo_read_all(buf, FIFO_WATERMARK); }4.2 三个高频坑字节序、复位延时、中文手册版本第一个坑是 FIFO 内字节序。寄存器组和 FIFO 输出都是 X_L、X_H 一组很多从 ADXL345 工程迁移过来的代码习惯先读高字节后读低字节导致数值出现奇怪的横向跳变。第二个坑是软复位后不等待。复位寄存器写入 0x52 后立刻读 DEVID偶尔能读到 0xAD但在低 SCLK 和某些 SPI 时序下会读到 0x00建议复位后延时 5 ms 再做三次一致性校验。第三个坑和这篇标题直接相关中文 PDF 版本可能滞后于英文最新版寄存器位定义在小版本升级后有调整中文版适合理解功能和概念但做寄存器级开发、特别是涉及 FIFO 和瞬时开这类复杂功能时以英文原版最新 Revision 为准。/* 稳定的初始化开头按顺序执行 */ adxl372_write_reg(0x1F, 0x52); /* 软复位 */ delay_ms(5); for (int i 0; i 3; i) { if (adxl372_read_reg(0x00) ! 0xAD) { /* 三次都通过再继续否则先查总线 */ } }4.3 静止、翻转、敲击三步验证整条链路驱动写完别急着接真实设备先在桌面上做三个动作。静止平放时水平两轴读数应在 0 g 附近竖直轴应接近 ±1 g翻转设备竖直轴的符号应该跟着变这一步能同时验证字节序和量程方向。最后用笔帽或小螺丝刀轻轻敲击桌面观察读数是否出现明显尖峰。for _ in range(30): x, y, z read_one_sample() print(fX{x:.2f}g Y{y:.2f}g Z{z:.2f}g)如果敲击时读数始终在 ±1 g 附近先查阈值是否写进了超量程检测对应的寄存器而不是误写进了活动检测寄存器组如果 INT 引脚没拉低用逻辑分析仪抓一下写入 0x2C 后的寄存器回读值确认芯片真的处于瞬时开模式。三个动作全部通过后这套初始化代码就可以移到正式产品里跑了。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询