SC7A21三轴加速度计寄存器配置与调试避坑指南
发布时间:2026/10/29 22:30:02 锦皓数字建站

简介面向嵌入式硬件与运动传感开发者的SC7A21三轴数字加速度计技术手册聚焦士兰微2G/4G/8G/16G全量程器件的选型、设计与调试参考。整包仅含1个PDF文件大小2.07MB篇幅约39页围绕寄存器描述展开并配套内部框图、管脚排列、极限参数、机械与电气参数、I²C/SPI时序及中断配置等内容。已有1150人学习下载说明其在传感器驱动移植与硬件评估中具有一定参考价值。读者可据此核对±2G至±16G量程、12bit数据输出、6D/4D方向与自由落体/单击双击检测、计步与睡眠监测、FIFO及1.71V3.6V低功耗设计等关键指标也能结合寄存器表完成初始化、中断映射和通信接口调试减少反复查表与试错成本。1. 一颗三轴加速度计为什么值得把 39 页寄存器手册逐位读完板子焊好、MCU 跑起来姿态数据却一直在飘换了两颗料还是飘——这种时候先别怀疑滤波算法八成是加速度计没配对。SC7A21 这份 39 页的寄存器级说明书解决的正是这件事它不是只给一张电气参数表的简版规格书而是把 ±2G/±4G/±8G/±16G 四档量程、1.5Hz 到 400Hz 的输出速率、12bit 数据在寄存器里的对齐方式、I²C 与 SPI 的时序边界以及计步、抬手、睡眠这些内置算法模块的每一个控制位逐条摊开写清楚。对做运动学采集链路的人来说它更像一张设计底图从敏感质量块的差分电容变化到 ADC 量化再到 INT1 引脚上的一次电平跳变中间每个环节都能在寄存器表里找到对应的开关和阈值。刚接触 MEMS 的人可以拿它搞明白“为什么读出来全是 0x00”已经在做可穿戴、手持云台、室内导航模块的固件工程师则可以拿它压缩 BOM 和主控负载。2. 上电到第一组数据CS 电平、WHO_AM_I 与 12bit 左对齐一颗传感器从焊上板子到吐出可信数据中间隔着三层电气层总线和电源对不对、配置层量程和速率选没选、数据层字节怎么拼、单位怎么换。这三层里任何一层出问题现象都长得很像——读出来是 0、是 0xFF或者数值大得离谱。所以我把 bring-up 拆成四步走每一步都留一个可以单独验证的锚点出问题时能立刻定位到是哪一层。2.1 两种总线在一根 CS 上分家SC7A21 是 LGA-12、2×2×1mm 的封装12 个引脚里真正干活的没几个pin12 是 SCL/SCKpin2 是 SDA/SDI/SDOpin1 是 SDO仅在 SPI 四线模式或 I²C 地址选择时有用pin10 是 CSpin5/pin6 是 INT1/INT2剩下是电源和地。这颗芯片最容易被忽略的设计是I²C 和 SPI 共用同一组引脚靠 CS 电平硬切换——CS 拉高走 I²CCS 拉低走 SPI。这个设计的直接后果是硬件上必须给 CS 一个确定电平。我见过太多板子把 CS 直接悬空指望内部上拉结果芯片在两种模式之间反复横跳读出来的 ID 一会儿 0x13 一会儿 0xFF。稳妥做法是 I²C 方案里用 10kΩ 电阻把 CS 硬拉到 VDDIO不留给软件任何反悔的余地SPI 方案则由主机 GPIO 驱动空闲时保持高电平。另外 pin1 在 I²C 模式下不是数据脚它是地址选择脚这个后面单独说。电源这边有两组VDD 供核心电路VDDIO 供 IO 口两者都在 1.71V 到 3.6V 之间VDDIO 上限是 VDD0.1V。1.8V 的 MCU 直接对接不需要电平转换这一点在可穿戴方案里省事不少。去耦电容按常规给 100nF 加 1μF靠近 pin3 和 pin7 放别省。2.2 上电顺序与 WHO_AM_I先确认芯片活着上电之后别急着写配置第一件事是读 0x0F 寄存器值应该是 0x13。这一个字节能同时验证四件事供电正常、总线通了、CS 电平正确、从机地址没搞错。读不到 0x13后面所有调试都是白费。上电时序上手册给的开启时间 Ton 在 ODR100Hz 时是 1ms 量级实际工程里我一般在上电后延时 5ms 再发起第一次通信留足余量。如果系统做过软复位向 0x68 写任意值复位后同样要等 5ms并且所有寄存器回到默认值配置得重来一遍。/* SC7A21 bring-up 第一步确认芯片在线 */ #define SC7A21_ADDR_W 0x32 /* SDO 悬空/接高时的 8 位写地址 */ #define SC7A21_ADDR_R 0x33 /* 对应 8 位读地址 */ #define REG_WHO_AM_I 0x0F #define REG_SOFT_RESET 0x68 #define WHO_AM_I_VAL 0x13 int sc7a21_probe(void) { uint8_t id 0; uint8_t rst 0x01; /* 软复位清掉上一次掉电前的残留配置 */ if (i2c_write_reg(SC7A21_ADDR_W, REG_SOFT_RESET, rst, 1) ! 0) return -1; delay_ms(5); /* 等内部 NVM 重新加载修调值 */ if (i2c_read_reg(SC7A21_ADDR_R, REG_WHO_AM_I, id, 1) ! 0) return -2; return (id WHO_AM_I_VAL) ? 0 : -3; }这段代码的关键不在读写而在两个延时和一次复位。软复位不是可选项芯片内部 NVM 存着出厂校准的灵敏度和零漂修调值上电时自动搬进寄存器如果上一次运行把某些配置位写花了复位是唯一干净的起点。返回值设计成三级错误码-1 写失败、-2 读失败、-3 ID 不符现场排查时能直接区分是总线问题还是芯片问题。2.3 量程、ODR 与灵敏度换算表确认芯片活着之后第二件事是把量程和输出速率定下来。这两项直接决定后面所有数据的物理含义一旦定错读出来的数字看着正常换算成 mg 就整体偏了 2 倍、4 倍甚至 8 倍。量程由 CTRL_REG40x23里的 FS[1:0] 决定四档对应关系很清楚但灵敏度不是线性的整数倍关系那么简单得看手册的机械参数表FS[1:0]量程灵敏度高性能模式零漂典型值说明00±2G1 mg/digit±40 mg分辨率最高适合姿态01±4G2 mg/digit—折中选择10±8G4 mg/digit—运动检测常用11±16G8 mg/digit—抗冲击、高 g 场景输出速率由 CTRL_REG10x20的 ODR[3:0] 控制手册列了七档1.5Hz、12.5Hz、25Hz、50Hz、100Hz、200Hz、400Hz对应编码从 0001 到 0111 递增。选 ODR 有个容易被忽略的约束系统带宽是 ODR/2所以 400Hz 输出对应的有效带宽只有 200Hz想做高频振动分析这颗芯片的上限就在这里。还有一条隐藏路径值得单独提高性能模式。手册明确写了开启方法是向 0x1F 写 0x0F、向 0x23 写 0x88。开了之后在 ±2G 量程下能做到 12bit 有效位代价是电流从正常模式的 14μA 涨到 290μA。穿戴设备做连续姿态解算时这个代价值得付做长期待机监测时就别开。/* 量程 速率 高性能模式三件套 */ #define REG_CTRL_REG1 0x20 #define REG_CTRL_REG4 0x23 #define REG_CTRL_REG0 0x1F int sc7a21_config(uint8_t fs, uint8_t odr_code, uint8_t high_perf) { uint8_t v; /* CTRL_REG1: ODR[3:0] 在 bit7..4bit2..0 是三轴使能 */ v (uint8_t)((odr_code 4) | 0x07); if (i2c_write_reg(SC7A21_ADDR_W, REG_CTRL_REG1, v, 1) ! 0) return -1; /* CTRL_REG4: BDU1 防止高低字节撕裂FS[1:0] 在 bit5..4 */ v (uint8_t)(0x80 | ((fs 0x03) 4)); if (high_perf) v | 0x08; /* HR 位高分辨率 */ if (i2c_write_reg(SC7A21_ADDR_W, REG_CTRL_REG4, v, 1) ! 0) return -2; if (high_perf) { v 0x0F; if (i2c_write_reg(SC7A21_ADDR_W, REG_CTRL_REG0, v, 1) ! 0) return -3; } return 0; }参数说明fs取 0 到 3 对应四档量程odr_code取 1 到 7high_perf非零时开高性能模式。BDU 位bit7建议永远置 1它的作用是锁住高低字节防止在读取 0x28 和 0x29 之间来了新数据导致拼出一个不存在的值——这个坑在高 ODR 下出现概率不低表现为偶尔冒出一个尖峰。2.4 一次突发读六字节代码与逐行说明数据寄存器从 0x28 到 0x2DX/Y/Z 各两个字节小端排列。手册里有个细节很多人第一次会漏子地址的最高位是地址自增位要连读必须把它置 1。所以读三轴的子地址不是 0x28而是 0x28|0x80 0xA8。手册给的原话就是这个例子照着写就行。另一个细节是数据对齐。寄存器名标着 OUT_X_L(BLE0)说明默认 BLE012bit 数据左对齐放在 16 位里低 4 位是补零。所以拼出 16 位整数之后必须右移 4 位否则读出来的数值是真实值的 16 倍。/* 突发读三轴一次 I2C 事务拿完 6 字节保证三轴同一采样点 */ #define REG_OUT_X_L 0x28 int sc7a21_read_xyz(int16_t *x, int16_t *y, int16_t *z) { uint8_t buf[6]; uint8_t sub REG_OUT_X_L | 0x80; /* 关键bit7 置 1 开启地址自增 */ if (i2c_write(SC7A21_ADDR_W, sub, 1) ! 0) return -1; if (i2c_read (SC7A21_ADDR_R, buf, 6) ! 0) return -2; /* 小端拼接后右移 4 位得到 12bit 有符号补码 */ *x (int16_t)(((uint16_t)buf[1] 8) | buf[0]) 4; *y (int16_t)(((uint16_t)buf[3] 8) | buf[2]) 4; *z (int16_t)(((uint16_t)buf[5] 8) | buf[4]) 4; return 0; }逻辑说明先发子地址带自增位再发重复起始加读地址然后连续收 6 个字节这是标准 I²C 复合事务。之所以强调“一次事务”是因为分成三次单字节读三轴可能落在不同采样点上做倾角计算时会出现几毫克的假分量静态看不出来动态一滤波就暴露。参数说明返回的*x/*y/*z是原始 LSB换算成 mg 要乘灵敏度系数——±2G 时乘 1±4G 乘 2±8G 乘 4±16G 乘 8。别把这个系数写成常量量程一改就得跟着改我一般用一个全局变量存当前系数配置函数里同步更新比到处改宏定义靠谱。3. 中断引脚怎么用6D 方向、自由落体与单击双击的阈值组合把这颗芯片当纯数据源用等于浪费了一半功能。INT1 和 INT2 两根引脚背后是一整套可编程事件引擎方向检测、自由落体、运动唤醒、单击双击、计步溢出、抬手状态全都能硬件判定并直接给 MCU 一个电平。用好这套东西主控可以从“每 10ms 轮询一次”变成“睡着等中断”整机功耗差一个数量级。难点在于这些事件的阈值、持续时间、映射关系分散在十几个寄存器里配错一个就是“中断一直触发”或者“永远不触发”这两种极端。3.1 中断映射INT1/INT2 到底挂什么两根中断脚不是随便分配的每个功能都有自己的映射位。运动检测和方向检测走 AOI1/AOI2 两组寄存器0x30 到 0x37映射在 CTRL_REG30x22和 CTRL_REG60x25里单击双击有自己的 CLICK_CFG0x38计步和抬手则是各自控制寄存器里的 I1_/I2_ 位段。这个设计的好处是同一根引脚可以同时挂多个事件源坏处是排查时必须逐个关掉才能定位。我的习惯是 bring-up 阶段只开一个事件验证波形正常之后再叠加。比如先只开自由落体映射到 INT1用示波器抓一次自由落体动作确认脉宽和极性都对再往上加运动唤醒。曾经有个项目两根脚同时挂了四个事件结果中断线一直低电平查了两天才发现是其中一个事件的阈值设成了 0等于常触发——这种翻车经历过一次就长记性了。中断输出的极性、推挽/开漏配置也在 CTRL_REG3 里默认推挽高有效。如果 MCU 那边配的是下降沿触发记得把极性翻过来或者干脆用双边沿加读状态寄存器的方式省得纠结。3.2 自由落体与运动唤醒阈值和持续时间是一对自由落体的判定逻辑很朴素三轴加速度的绝对值同时小于设定阈值并且持续超过设定时间就认为失重。手册里明确写了“三轴理论输出为零”这个前提所以阈值要设在噪声底之上、真实自由落体之下。常见的消费电子方案里阈值取 0x20 到 0x30按 1mg/LSB 换算约 32 到 48mg持续时间取 3 到 5 个采样周期。这里有个换算的坑持续时间寄存器的单位不是毫秒是采样周期数。ODR 设成 100Hz 时一个周期 10ms写 5 就是 50ms如果后来为了省电把 ODR 降到 25Hz同样的 5 就变成 200ms自由落体检测会明显变迟钝。所以调这个参数必须和 ODR 绑定着看我一般在代码里写个宏把毫秒换算成周期数再写寄存器。运动唤醒是反向逻辑某一轴的输出超过阈值并持续一段时间判定为有动作。它和睡眠检测是一对ACT_THS0x3E配阈值、ACT_DURATION0x3F配持续时间两者配合能把系统从低功耗状态叫醒。阈值设太低放在桌上被空调吹一下都能触发设太高用户走两步都不响应。经验值是按应用场景定腕戴设备取 0x10 到 0x18手持设备取 0x20 往上。3.3 单击双击四组时间参数别写反单击双击检测有四个时间寄存器名字很像功能完全不同TIME_LIMIT0x3B是判定单击的最大脉宽TIME_LATENCY0x3C是第一次点击到第二次点击的等待窗口TIME_WINDOW0x3D是双击的第二击必须落在这个窗口内CLICK_THS0x3A是触发电平阈值。写反的后果很典型把 LATENCY 和 WINDOW 搞混表现是单击正常但双击永远识别不出来或者反过来轻轻碰一下就报双击。手册给的是寄存器地址和默认值具体毫秒换算跟 ODR 相关得按 ODR 周期去算。我的做法是先按官方评估板的典型值抄一版比如 LIMIT0x30、LATENCY0x10、WINDOW0xC0跑通之后再按产品手感微调不要一上来就从零推公式。还有一点单击双击检测对安装方向敏感芯片贴片时的轴向和外壳按键的方向必须一致。倾斜安装的板子得先做倾斜补偿手册里叫产品倾斜校准否则同一个敲击在不同姿态下判定结果不一样。3.4 6D/4D 方向检测的配置顺序6D 检测是把三维空间切成六个面芯片判断当前重力矢量落在哪个面上并可以在进入或离开某个面时产生中断。4D 则是把 Z 轴的两个方向合并只分四个象限。这个功能在屏幕自动旋转、设备正反放置识别里用得很多。配置顺序有讲究不能乱先写 AOI1_THS0x32设阈值再写 AOI1_DURATION0x33设持续时间最后写 AOI1_CFG0x30使能并选择 6D 还是 4D、以及中断触发条件进入、离开还是两者。顺序反了会出现“配置写完但状态寄存器不动”的现象原因是 CFG 寄存器里的使能位一旦置起芯片立刻开始按当前阈值判定此时阈值还是旧值判出来的结果自然不对。状态从 AOI1_SOURCE0x31读里面有位标识当前处在哪个方向、以及是否发生了方向切换。读这个寄存器要注意它是“读清”还是“读不清”手册在寄存器描述里有说明如果是读清型主循环里读一次就得处理一次别在中断里读、又在主循环里读否则第二次读到的是空的。4. 内置算法模块计步器、抬手识别与睡眠监测的寄存器组可穿戴产品最贵的不一定是传感器是主控跑算法的那部分功耗和内存。SC7A21 把计步、抬手、睡眠这三套算法做进了芯片内部主控只需要读结果。这不是噱头——计步算法如果放主控里跑光是维持加速度计常开加 MCU 定期唤醒功耗就下不来放进芯片MCU 可以睡到计步中断来了再醒。代价是这些模块的参数可调范围有限得按场景调调不好就出现“走路不计数”或者“坐着也在涨步数”。4.1 计步器24 位计数值怎么拼计步相关的寄存器从 0x10 排到 0x1A核心是三个STEP_CTRL0x10管使能和中断映射STEP_DELTA0x11设步数变化量阈值STEP_WTM0/10x12/0x13设总步数阈值。计数值本身在 0x15、0x16、0x17 三个字节里24 位低位在前。手册给了一段拼接示例思路是对的但有个细节值得强调这三个字节必须一次性连读不能分三次读。因为计步值在两次读之间可能进位先读低字节再读高字节遇到 0xFF 进位的瞬间会拼出一个巨大的跳变值。这类问题在实验室里几乎复现不了到用户手上就是“步数偶尔暴涨几万步”。/* 计步值读取三字节连读 24 位拼接 */ #define REG_STEP_CNT0 0x15 uint32_t sc7a21_read_steps(void) { uint8_t b[3]; uint8_t sub REG_STEP_CNT0 | 0x80; /* 同样要开地址自增 */ if (i2c_write(SC7A21_ADDR_W, sub, 1) ! 0) return 0xFFFFFFFF; if (i2c_read (SC7A21_ADDR_R, b, 3) ! 0) return 0xFFFFFFFF; return ((uint32_t)b[2] 16) | ((uint32_t)b[1] 8) | b[0]; }使能计步有两个前提条件写在 STEP_CTRL 里STEP_EN 置 1以及 STEP_MODE 选对。STEP_MODE 的作用是限定 ODR 下限——置 0 要求 ODR 不低于 25Hz置 1 要求不低于 50Hz。ODR 没达到要求计步器照样能写进去但计数值不动这个现象特别容易被误判成芯片坏了。STEP_DELTA 默认 0x01意思是步数变化超过 1 就置 DELTA_STEP 状态位并可以触发中断。如果你希望每走 10 步上报一次把 DELTA 设成 10 更省电。STEP_CLR 位用于清零计数值写 1 后硬件自动回 0不用手动清。4.2 抬手识别角度、灵敏度、持续时间三个旋钮抬手识别WRIST是给腕戴设备准备的判断手腕是否抬起到可观看角度抬起和放下各能产生中断。四个寄存器管全部参数WRIST_CTRL00x08管使能和中断映射WRIST_CTRL10x09管角度误差和贴片位置WRIST_CTRL20x0A管目标角度WRIST_CTRL30x0B管灵敏度和两个持续时间。目标角度 T_Angle 是补码手册给了换算规则补码转原码后乘 2 就是对应的加速度值静止时加速度值最大 64 约等于 90 度最小 -64 约等于 -90 度。这句话翻译成工程语言就是这个寄存器不是直接写角度是写角度对应的重力分量。灵敏度 Sen[1:0] 的实际值是 (设定值2)×4单位 LSB1G 对应 64 LSB。默认 Sen10 时灵敏度是 16 LSB约 0.25G这个量级适合大多数手腕动作。两个时间参数最容易搞混TT_TH[2:0] 是进入抬手状态需要的持续时间FT_TH[2:0] 是离开抬手状态需要的持续时间公式都是 (2^设定值)×0.1 秒。默认 TT010 即 0.4sFT011 即 0.8s。为什么离开要比进入长因为抬手看表时手腕会微抖如果离开判定太灵敏屏幕会反复亮灭。这个设计细节在手动手表项目里被验证过很多次别随意缩短。4.3 睡眠与活动检测睡眠监测相关寄存器在 0x6B 到 0x6FSLEEP_CTRL0x6B管使能SLEEP_CONFIG0x6C管参数SLEEP_SRC0/1/20x6D 到 0x6F是状态输出。手册的描述是“提供多等级的活动情况同时根据睡眠参数的设定提供内置算法处理后的睡眠情况支持中断触发或定时查询”。实际用起来这套模块输出的是活动等级和睡眠判定不是原始波形。如果你的产品需要做睡眠分期浅睡、深睡、REM芯片给的结果粒度不够还是得拿原始三轴数据自己跑算法。但如果是做“久坐提醒”“睡眠时长统计”这类轻量功能直接用内置结果能省掉一整块固件。配置上要注意的是阈值和时间窗口的联动。活动阈值设太低翻个身就被判成清醒设太高整晚都判成深睡。我一般先用默认参数跑一晚数据把 SLEEP_SRC 的原始输出和录像对一遍再回来调比凭空猜参数快得多。4.4 FIFO把 MCU 的轮询频率降下来FIFO 控制寄存器是 0x2E状态在 0x2F。这颗芯片的 FIFO 深度不算大但足够把 MCU 的唤醒频率从 100Hz 降到 10Hz。用法很直接配好 FIFO 模式旁路、FIFO、流模式、触发模式让芯片自己攒数据攒到水位线或者溢出时给个中断MCU 一次性把一批数据读走。这一步的收益在功耗上很直观假设 ODR100Hz不用 FIFO 时 MCU 每秒醒 100 次用 FIFO 攒 10 个样本每秒只醒 10 次。每次唤醒的功耗开销远大于读数据本身所以降频带来的收益是乘法关系。坑在于水位线的设置。水位设太高FIFO 溢出丢数据设太低等于没用。经验公式是水位 FIFO 深度 × 0.75留四分之一余量给中断响应延迟。另外流模式下溢出会覆盖最老的数据触发模式下溢出就停止写入做振动分析要用触发模式保证数据连续做姿态追踪用流模式保证数据新鲜。5. 避坑记录五个让读数变玄学的问题调试加速度计时最折磨人的不是“完全读不到”而是“有时候对有时候不对”。这类问题往往不是芯片的锅是配置和硬件细节没对齐。下面五条是我在不同项目里真实踩过的每一条都按现象、原因、解决三段写照着排查能省不少时间。5.1 现象ID 读出来是 0x00 或 0xFF偶尔跳 0x13原因CS 引脚悬空或驱动能力不足芯片在 I²C 和 SPI 模式之间摇摆。悬空时引脚电平受漏电流和干扰影响可能刚好落在阈值附近。解决I²C 方案用 10kΩ 电阻把 CS 硬拉到 VDDIO不要依赖内部上拉。SPI 方案确认主机 GPIO 在初始化前是输入态避免上电瞬间被拉低。改完用示波器看一眼 CS 在上电后 10ms 内的电平稳定在高位才算过关。5.2 现象地址发 0x32 没响应发 0x30 偶尔有反应原因SDO 引脚pin1的接法决定了 I²C 从机地址。手册给了两种SDO 悬空或接高时 7 位地址是 0x198 位写地址 0x32SDO 接逻辑低时 7 位地址是 0x188 位写地址 0x30。很多人照着参考原理图焊却没注意参考板上 SDO 是接低的。解决先确认板上 SDO 的实际电平再选对应地址。SDO 接低的情况还有个附加动作芯片内部对 SCL/SDA 有 50k 到 60k 的上拉SDO 接低时要通过 I²C 写 0x0E 寄存器关掉内部上拉否则会有持续漏电。这一步手册写得很明确但很容易被跳过。5.3 现象连读六个字节X/Y/Z 数值一模一样或者明显错位原因子地址最高位没置 1芯片按单字节模式处理每次读都返回同一个寄存器的值或者地址不自增导致数据整体偏移。解决所有多字节读的子地址都要或上 0x80。0x28 要写成 0xA80x15 要写成 0x95。另外确认 I²C 事务里用了重复起始而不是停止再起始中间夹一个 STOP 会让部分主机丢上下文。5.4 现象改完量程数值整体放大或缩小了 2 的整数倍原因量程寄存器和灵敏度换算系数没同步。FS 从 00 改成 01寄存器配置生效了但代码里的换算常量还是按 1mg/LSB 算结果所有数据都偏了一倍。解决把灵敏度系数和量程配置绑在同一个结构体里配置函数写寄存器时同步更新系数读数据的地方只引用这个结构体不写死常量。更彻底的做法是在初始化时读回 CTRL_REG4 的值反推当前量程再定系数防止配置被别的代码路径改掉。5.5 现象SPI 三线模式怎么都切不过去读回来全是 0xFF原因三线模式的切换必须先在四线写模式下完成。手册写得很清楚三线模式通过向 SIM 位写 1 来设置而四线写模式和三线写模式的写时序完全一样所以要先在四线模式下把配置位写进去芯片才会切到三线。解决初始化流程固定成三步——CS 拉低进 SPI 模式、用四线写时序写 SIM 位、然后按三线时序读写。切完之后 SDO 脚变成数据输入输出复用硬件上要确认这根线没有被其他地方占用。另外多设备共用 SPC/MOSI/MISO 时要写 0x0E 寄存器关掉 I²C 功能避免总线冲突。6. 校准与验证零漂、灵敏度与自测试的三步走出厂校准已经把大部分误差补掉了手册写着修调值存在内部 NVM 里上电自动加载用户“无需更深层次的校准就可以使用”。但“无需”不等于“不用管”——贴片应力、焊接温度、外壳装配都会让零漂发生偏移手册给的零漂典型值是 ±40mg焊到板子上之后这个值可能变大。产品要求高的时候还是得自己做一轮验证。第一步是零漂验证。把板子水平静置X 和 Y 轴理论输出应该是 0Z 轴是 1G。实测读一组数据取平均X/Y 的偏差就是零漂Z 的偏差是 1G 减去实测值。偏差在几十 mg 以内可以直接用软件减掉超过 100mg 就要怀疑是不是贴片应力太大或者焊接有问题。这一步要注意静置时间上电后至少等 100ms 再采等内部电路稳定。第二步是灵敏度验证手册给的翻转法很实用把待测轴正对地心记录输出 A1在垂直该轴的平面内旋转 180 度让轴的另一端对准地心记录 A2灵敏度就是 |A2-A1|/2。这个方法不需要转台手持就能做误差主要来自旋转角度不准。做三轴的话要重复三次每次都从同一个静止姿态开始。第三步是自测试这是最省事的功能验证手段。手册给了自测试使能后的输出变化量FS0 时 X 轴约 276 LSB、Y 轴约 276 LSB、Z 轴约 984 LSB。使能自测试位后芯片会通过静电驱动力给质量块一个等效加速度读出的数据和关闭自测试时的差值落在手册范围内就说明机械结构和信号链都正常。这一招在产线测试里特别值钱省掉了机械振动台。验证项操作方法合格判据常见异常零漂水平静置X/Y 理论为 0Z 为 1G偏差 100mg偏差大贴片应力或焊接不良灵敏度单轴翻转 180°取 |A2-A1|/2与手册灵敏度偏差 5%偏差大量程系数写错自测试使能自测试位比较输出差值X/Y ≈ 276 LSBZ ≈ 984 LSB无变化机械结构或驱动电路异常还有一项容易被忽略的是温漂。手册给的温漂典型值是 ±0.5mg/°C温变灵敏度是 ±0.01%/°C。这两个数字看着小但从 0°C 到 40°C 走一遍零漂能漂 20mg做高精度倾角测量时这个量级不能忽略。我的做法是在产品的工作温度范围内取三个点低温、常温、高温各测一次零漂拟合成线性补偿系数写进固件比固定值补偿靠谱得多。从那次因为没做零漂验证、导致一批货在客户手上出现倾角偏差之后我每次拿到新的加速度计方案不管手册写得多乐观都强制走一遍零漂、灵敏度、自测试这三步一个都不跳。这三步加起来不到半小时省下的返工时间是以天计的。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。