
1. 项目概述LSM6DSR是一颗什么样的芯片做惯性测量、运动检测、姿态解算的工程师对ST意法半导体的LSM6D系列应该不陌生。LSM6DSR是这颗产品线里比较有分量的一颗单芯片集成3D加速度计和3D陀螺仪出厂即带校准支持I2C、SPI和MIPI I3C三种通信接口功耗控制做得不错最关键是支持“始终开启”Always-On工作模式配合内置的FIFO和可编程中断引擎可以做到让MCU一直睡大觉只在需要时才被传感器叫醒。我第一次拿到这颗片子是做一个工业设备振动监测的预研项目。设备装在产线振动台上不能频繁唤醒主控又要在异常振动出现时马上响应。当时对比了好几个厂家最后选了LSM6DSR核心就三点加速度计噪声密度低到60µg/√Hz级别陀螺仪零偏稳定性好内部数字处理链够丰富能在传感器端直接做阈值判断把事件上报不需要主控陪跑。这篇应用笔记不是什么官方文档的翻译而是我实际调试LSM6DSR时整理出来的完整经验包括选型思路、硬件连接、寄存器配置、FIFO事件上报、常见坑点以及校准操作。如果你正在做机器人、无人机、振动监测、跌倒检测、电子罗盘辅助导航这类项目打算用这颗芯片或者正在被它折磨这篇内容应该能帮你少走不少弯路。2. 硬件与协议层选型、接口和电路设计要点2.1 LSM6DSR在LSM6D家族里的定位LSM6DSR不是一颗新片子但它相对LSM6DS3、LSM6DSL这些老将强在指标更硬。加速度计量程最高到±8g陀螺仪最高到±4000dps输出数据率ODR最高6.66kHz这个输出速率在消费级和工业级MEMS里算是非常能打的了。对比一下同系列的几颗常用型号方便在选型时心里有底型号加速度计量程陀螺仪量程ODR上限调制阶数核心特点LSM6DS3±16g±2000dps1.6kHz12bit低功耗、入门常用LSM6DSL±16g±2000dps1.6kHz12bit支持传感器集线器Sensor HubLSM6DSR±8g±4000dps6.66kHz14bit高ODR、低噪声、工业级LSM6DSOX±16g±2000dps1.6kHz12bit支持机器学习内核ML Core高ODR的好处做振动分析和高速运动捕捉的人一听就懂。比如设备转速达到每分钟几万转叶片通过频率一算就得上千赫兹Nyquist采样定理卡在那里ODR低了根本采不到有效频谱。LSM6DSR拉到6.66kHz能覆盖的机械故障特征频率范围宽了一大截这是很多做工业预测性维护的团队选它的直接原因。还有一点接口支持MIPI I3C。这玩意儿在传统嵌入式里用得少但在手机、可穿戴设备主控上越来越多见如果你做的是低功耗消费电子产品I3C支持意味着后续换平台、升级主控的适配成本会低一些。2.2 电源、引脚和布线的关键细节硬件设计上LSM6DSR的电源引脚有几个要留意的点供电范围是1.71V到3.6V数字IO供电VDD_IO单独引出来范围也是1.71V到3.6V。我习惯把VDD和VDD_IO分开供电VDD给1.8VVDD_IO跟主控IO电平跑这样传感器数字接口可以直接连3.3V的MCU引脚不需要加电平转换电路。注意如果你VDD和VDD_IO共用同一路电源当IO电平需求为1.8V时可以但要是主控是3.3V的系统尽量别公用不然很容易出现逻辑不稳的毛病。引脚方面SDO/SA0引脚的功能有点特殊在I2C模式下它是7位地址的LSB位用来切换器件地址在SPI模式下它是SPI的数据输出脚MISO。这就带来一个隐藏设计问题——如果你在SPI模式下把SDO/SA0当地址脚用直接拉高拉低那就把SPI读数据的通路给断了。另一个容易忽略的引脚是SD0/SA1和CS。I2C模式下CS必须拉高SPI模式下CS由主控控制。板子画完后最好像我一样习惯性先打个表把引脚、方向、默认电平、连接对象都列清楚上个版本我在PCB上不小心把CS下拉接了地导致SPI怎么都读不到数据结果查了半天发现是板子问题非常低级但真实存在。供电去耦电容数据手册里要求VDD和VDD_IO上都要放100nF电容而且尽量靠近引脚摆放。我实测过传感器靠近电机或者电源模块时如果去耦电容不够或者距离太远加速度计数据里会出现周期性噪声频点大概在几十kHz到几百kHz之间肉眼看不出来频谱分析一查就露馅。另外10µF的大电容建议放一个在电源入口处对低频电源纹波抑制有帮助。2.3 I2C和SPI项目里怎么选通信接口选I2C还是SPI取决于你的读数和更新频率需求。I2C最大速率在快速模式下是1MHz地址是0x6ASA01或0x6BSA00。对低速率传感器应用I2C完全够用代码也简单只用两根线资源占用少适合引脚紧张的小板子。但如果你要用6.66kHz的ODR去读陀螺仪和加速度计数据I2C就不合适了。算一笔账6.66kHzODR每次读6个轴各2字节加速度3轴、陀螺仪3轴加上状态数据至少得12字节有效数据加上寄存器地址和协议开销实际I2C上要传接近20字节那每秒就是6.66k乘以20字节大概133KB/s已经顶到1MHz I2C速率的理论极限还超了。而且I2C每次传输还有地址字节、起始停止条件这些额外开销总线直接被占满主控还得干别的活基本会卡死。SPI的最高速率我常用10MHz传同样数据量是绰绰有余而且SPI是全双工还能一边写地址一边收旧数据效率高不少。我做高ODR采集时全部走SPII2C只用来做寄存器读写、低速率FIFO读取这类轻活。还有一个实操经验SPI模式下读取数据可以不带寄存器地址自动递增。LSM6DSR支持在连续读取时寄存器地址自增所以一次Burst Read可以把FIFO里的数据整包读出来。做这步的先决条件是CS全程拉低直到读完整包再释放。很多开发者在这里犯毛病读一半释放了CS或者CS没拉低就发SCLK数据读出来一塌糊涂。3. 核心功能玩明白ODR、滤波器、量程这些参数怎么配3.1 ODR和量程先搞清楚物理含义再动手LSM6DSR的加速度计ODR可以配到1.6Hz到6.66kHz陀螺仪是12.5Hz到6.66kHz。量程加速度计有±2、±4、±8g陀螺仪有125、250、500、1000、2000、4000dps共6档。我不建议把这些参数当填空题去配最好是根据项目实际物理需求算一遍。拿加速度计量程举例如果做倾角测量长期静止安装物体角度变化很小量程选±2g就够了分辨率最细噪声密度的相对值也最低。但如果是做手持设备比如一个带GPS定位的便携终端走路时手臂摆动会带来峰值几个g的加速度±2g肯定削顶这时候选±4g是个平衡点。而做车载碰撞检测或者跌落检测那瞬间冲击可以到几十gLSM6DSR最大只有±8g可能不够用需要外接大量程加速度计配合使用。陀螺仪量程怎么选很关键量程大角速度上限高但灵敏度降低量程小小角速度分辨更细。比如做稳定云台电机转动慢但又需要捕捉细微抖动250dps是个好选择做VR头显人快速转头瞬间角速度能到几百dps甚至上千dps需要1000或2000dps。4000dps这档一般很少用除非做高速旋转设备监测否则配置它只会白白牺牲分辨率。配置量程时注意数据手册里的灵敏度系数是典型值实际每颗芯片会有细微偏差。比如±2g时加速度计灵敏度一般是0.061mg/LSB但这不代表所有芯片都精确等于这个值对姿态解算有高精度要求的项目后面要单独校准这部分在第6节展开。3.2 数字滤波器链路Low-Pass和High-Pass怎么配合LSM6DSR内部滤波链路其实有三条路径理解了这个配置寄存器心里就特别清楚输入信号首先经过一个不可配置的模拟抗混叠滤波器然后进入数字部分。数字部分第一个选择是内部平均滤波器这个可以用较宽的带宽换取低噪声对加速度计和陀螺仪都适用ODR是6.66kHz高速模式时可以使用。再接下去是一个可配置的数字低通滤波器通过寄存器里的LPF2设置来调整截止频率。路径选型时有个常见困惑加速度计内部有数字低通滤波器和高通滤波器选择陀螺仪也有类似选项。一般建议想要平滑数据做姿态解算开低通截止频率根据实际运动频率来选。比如人走路的步频大概1-3Hz手势解锁动作的频率也就几Hz低通截止设个10Hz基本能滤掉大部分高频毛刺。想要观察动态冲击、振动信号低通截止设高或者旁路避免把关键冲击峰削掉。想要滤除直流偏置比如重力分量的影响来研究动态运动打开高通滤波器把重力相关分量滤掉只留下高频动态成分。还有个细节LSM6DSR内部低通滤波器的截止频率不是随意设的数据手册里有一个ODR与截止频率的对应表格。最稳妥的办法是直接查表不要自己发明组合我在项目里遇到过一种看起来合法、但实际效果是“滤波后数据毛刺反而更大”的组合查了半天发现是选了一个低通截止频率比ODR还高的配置等于没滤波。3.3 始终开启功能的架构和运行模式“始终开启”是LSM6DSR的看家本领。它的核心逻辑是传感器自身保持后台采样和数据处理主控完全不参与等到某个事件满足条件时传感器通过中断引脚通知主控去读数据。这种模式下有两个硬件部件很重要内置FIFO和可编程事件中断。FIFO最大的价值是“攒数据”。举个例子你配置陀螺仪ODR是208Hz但主控只需要每100ms读一次数据。FIFO可以设置为连续模式传感器自行往里存数据主控每100ms一次性读20个采样点大大降低通信次数与唤醒时间。而且FIFO快满时可以触发中断主控可以按批次处理不用跟着传感器节奏跑。事件中断更灵活。你可以配一个加速度计阈值比如加速度超越设定阈值时触发中断也可以配6D方向检测识别设备发生翻面、翻转甚至可以把陀螺仪也拉进来做事件判断。这些判断在传感器内部完成不需要主控在中断回调里做任何处理真正实现了传感器与主控解耦。运行功耗方面LSM6DSR有几种功耗模式高性能模式、正常模式、低功耗模式。低功耗模式下ODR和滤波器能力会受限陀螺仪在低功耗下能达到的ODR上限会降低。我的经验是需要始终监视加速度计做运动唤醒时把加速度计放低功耗模式跑一个低频ODR比如50Hz或更低陀螺仪保持关闭检测到运动后再由主控把陀螺仪拉满到高性能模式。这样平均功耗可以做得很低又能保证关键时刻的数据质量到位。4. 实战配置从寄存器到工程代码4.1 寄存器配置清单按顺序来初始化LSM6DSR的时候不要零散地往各个寄存器里写值建议按顺序把关键寄存器一次配完这样排查问题也容易定位是哪个环节出错。先看器件是否在线读取WHO_AM_I寄存器地址0x0FLSM6DSR的固定值是0x6A。如果读出来不是0x6A先别急着调软件检查接线和焊接这个问题第5节详细讲。确认在线之后按以下顺序配置/* 1. 软复位并等待完成 */ uint8_t ctrl3 0x01; // BOOT1 lsm6dsr_write_reg(CTRL3_C, ctrl3, 1); lsm6dsr_read_reg(CTRL3_C, ctrl3, 1); while (ctrl3 0x01) { lsm6dsr_read_reg(CTRL3_C, ctrl3, 1); } /* 2. 配置陀螺仪量程±2000dpsODR 6.66kHz低通滤波开启 */ uint8_t ctrl2 0; // CTRL2_G: FS_G[3:0]0011 (-2000dps), ODR_G[3:0]0110 (6.66kHz) ctrl2 | (0x03 4) | (0x06 0); lsm6dsr_write_reg(CTRL2_G, ctrl2, 1); /* 3. 配置加速度计量程±4gODR 6.66kHz低通滤波开启 */ uint8_t ctrl1 0; // CTRL1_XL: FS_XL[3:0]0010 (-4g), ODR_XL[3:0]0110 (6.66kHz) ctrl1 | (0x02 4) | (0x06 0); lsm6dsr_write_reg(CTRL1_XL, ctrl1, 1); /* 4. 配置FIFO连续模式阈值设为FIFO_SIZE/2 */ uint8_t fifo_ctrl5 0; // FIFO模式选择连续模式 0x06 fifo_ctrl5 0x06; lsm6dsr_write_reg(FIFO_CTRL5, fifo_ctrl5, 1); uint8_t fifo_ctrl1 0; // 阈值低字节取FIFO大小的一半FIFO大小是3KB单位是字2字节 fifo_ctrl1 (512 0) 0xFF; // 512字 1024字节 lsm6dsr_write_reg(FIFO_CTRL1, fifo_ctrl1, 1); uint8_t fifo_ctrl2 0; fifo_ctrl2 (512 8) 0xFF; lsm6dsr_write_reg(FIFO_CTRL2, fifo_ctrl2, 1); /* 5. 配置中断FIFO阈值中断推挽输出高电平有效 */ uint8_t ctrl4 0; // INT1_DRDY_XL | INT1_FIFO_TH | INT1_FIFO_OVR 等配置在TAP_CFG0、INT_CFG0等 lsm6dsr_write_reg(INT1_CTRL, int1_ctrl, 1); // 例如0x08打开FIFO阈值中断第2步和第3步的顺序不能颠倒我遇到过先配加速度计后配陀螺仪时陀螺仪寄存器误写了加速度计地址空间的问题虽然不经常发生但按顺序配可以彻底规避这类低级错误。4.2 加速度和角速度数据怎么换算成物理单位读出原始寄存器数据后重要一步是换算成真实物理单位。LSM6DSR的原始数据是16位有符号数14位有效分辨率高两位符号扩展换算公式很简单float accel_g[3]; float gyro_dps[3]; int16_t raw_acc[3], raw_gyro[3]; // 以±4g加速度计、±2000dps陀螺仪为例 const float accel_sensitivity 0.000122f; // 单位g/LSB const float gyro_sensitivity 0.070f; // 单位dps/LSB for (int i 0; i 3; i) { accel_g[i] (float)raw_acc[i] * accel_sensitivity; gyro_dps[i] (float)raw_gyro[i] * gyro_sensitivity; }灵敏度系数从哪里来从数据手册里查表。注意不同量程对应不同灵敏度值我用过的几个量程灵敏度如下量程灵敏度加速度计±2g0.061 mg/LSB±4g0.122 mg/LSB±8g0.244 mg/LSB陀螺仪也一样量程灵敏度陀螺仪±125dps4.375 mdps/LSB±250dps8.75 mdps/LSB±500dps17.50 mdps/LSB±1000dps35 mdps/LSB±2000dps70 mdps/LSB±4000dps140 mdps/LSB我建议把灵敏度系数定义为常量数组或者宏不要散落在代码里到处用后面换量程时只需要改一处省得排查问题时翻代码翻到头疼。4.3 FIFO读取和事件上报主控“睡大觉”的实现始终开启的核心应用场景就是主控大部分时间处于低功耗睡眠状态传感器自行工作。预置的FIFO数据由传感器不断往里头填充一旦FIFO里数据的数目超过阈值中断引脚被拉起来把主控唤醒去读。具体实现分三步第一步配置好FIFO为连续模式并设置阈值。这里的阈值要按单次读取的数据量计算。比如你要做100ms一次批量读取ODR 208Hz那每100ms会产生约21个采样点每个采样点若包含加速度3轴和陀螺仪3轴共12字节那FIFO阈值可以设置为21×12字节/2因为FIFO单位是字约126字。留有少许余量别卡的太死。第二步开启FIFO阈值中断。通过INT1_CTRL或MD1_CFG等寄存器配置将FIFO_TH中断映射到INT1引脚。我习惯把INT1映射成FIFO阈值中断INT2映射成FIFO溢出中断因为溢出中断是异常事件需要单独处理如果数据被覆盖丢失至少能知道哪一段丢了。第三步在主控中断回调里只置一个标志位主循环感知到标志再启动SPI DMA传输。这样中断服务程序里没有耗时的读写操作不会影响其他中断实时性。代码片段可以参考void EXTI0_IRQHandler(void) { // 清除中断挂起位 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0); data_ready_flag 1; } void main_process(void) { while (1) { if (data_ready_flag) { data_ready_flag 0; lsm6dsr_read_fifo(fifo_buffer, 21); // 读取21组数据 process_imu_data(fifo_buffer, 21); // 进入低功耗模式前确保所有事务完成 enter_sleep_mode(); } } }FIFO读了之后要注意FIFO里的数据是按照写入顺序排列的。如果同时开了加速度计和陀螺仪FIFO里的数据默认可能是交叉排列也可能分块存储取决于FIFO格式配置。读完一批数据后需要重新调整FIFO水位也就是更新FIFO_CTRL1和CTRL2寄存器里的阈值让它继续产生中断。很多人踩过这个坑第一次中断来了数据读了但中断永远只来一次就是忘记重新设置FIFO阈值。5. 常见问题与排查技巧实录5.1 WHO_AM_I读不到从哪个方向查这个问题排第一因为它是调试LSM6DSR的第一步也是大家最常卡住的地方。WHO_AM_I寄存器读不到或读出来不是0x6A排查思路按优先级排列供电有没有到位用万用表量VDD和VDD_IO确认电压在数据手册范围内。我见过把VDD_IO接到地只给VDD供电导致芯片不通信的情况。复位引脚RESETLSM6DSR没有专用复位引脚但芯片内部有上电复位所以刚上电时不要立刻通信最好等至少10ms。上电太快SCLK就发过去芯片还没准备好导致第一帧通信失败。复位后加上10ms延时这是几乎所有IMU调试的标准操作。地址是否正确I2C模式下如果SA0接的是地地址还按0x6A发芯片自然不应答。对照原理图确认SA0电平重新算地址。焊接问题QFN封装的底部焊盘如果是散热焊盘兼地虚焊时芯片也能工作但会出现各种诡异现象用放大镜检查焊点或者用热风枪重新焊接一次。我在自己的板子上遇到过一次WHO_AM_I读出来是0x00所有寄存器都读成0。排查到最后发现是SPI模式下MISO引脚没有启用内部上拉主控的SPI配置成输入浮空所有数据线在空闲时全是低电平读取时自然全是0。5.2 数据漂移严重是芯片坏了还是配置问题陀螺仪零偏漂移是IMU应用的永恒话题。LSM6DSR出厂时做了校准数据手册里给出了零偏典型值但那是在理想条件下的。实际项目中数据漂移主要有三个来源。第一个来源是温度漂移。MEMS陀螺仪对温度变化比较敏感LSM6DSR虽然内置了温度补偿但温度和零偏并非完全线性。解决方法是做分段温度校准把工作温度范围分成几段每段记录一组零偏偏置运行时根据当前温度插值补偿。这个方法在工业设备上实测能显著降低温漂误差。第二个来源是PCB应力。这是很多人忽略的芯片焊接在PCB上PCB受热膨胀或者机械形变应力传导到MEMS器件的封装内部会改变零偏。对策是PCB布局时芯片尽量远离板边、螺丝孔、连接器等容易受力的地方。我做过一个对比实验把同样的板子拧紧螺丝后松开陀螺仪零偏变化了大约0.5到1dps这个数值在低成本姿态解算里其实不小了。第三个来源是噪声也就是数据在零偏附近来回跳动。这个是不可避免的需要区分零偏bias和噪声noise零偏是长期平均值偏移噪声是随机波动。降低噪声的有效手段是使用前文说的数字低通滤波器或者利用FIFO做多次采样平均。5.3 FIFO溢出导致数据丢失怎么处理FIFO溢出最常见的原因是主控响应慢没能赶在FIFO填满之前把数据读走。解决办法有几个方向提高读取优先级把FIFO数据读取放在高优先级中断或DMA里不让它排队等别的任务。 放大FIFO阈值如果单次处理的实时性要求高可以把阈值设置到接近FIFO最大值低频率读取但一次读很多数据。 降低ODR如果业务场景不需要那么高的采样率适当降低ODRFIFO里能存的时间窗就长了。但有个陷阱FIFO在连续模式下数据积压到溢出后新数据不会覆盖旧数据而是停止写入。如果主控一直不复位FIFO新数据就永远写不进去。所以我的处理方案是开启FIFO溢出中断在溢出中断里做一次FIFO清空与重置丢弃旧数据保证后续数据流不断。同时把溢出作为异常事件记录便于事后分析是哪一环节出错。现象可能原因解决措施数据一直不变FIFO停止写入未恢复重置FIFO配置清除溢出标志数据序列跳变读取时序没有对齐检查读取起始地址与数据长度确认自动递增开启第一次中断后不再触发FIFO阈值未重新设置读数据后重新写FIFO_CTRL1/CTRL2数据对不上FIFO存储模式配置错误确认按轴交叉还是分块存储5.4 中断引脚一直拉高主控永远被唤醒这个问题比数据丢失隐蔽多了主控老是醒着功耗飙高但查数据又好像没异常。用示波器测INT引脚发现一直是高电平。原因是中断标志没有清除。读取FIFO数据本身不会自动清除FIFO阈值中断标志你需要额外执行一步操作读FIFO_STATUS1和FIFO_STATUS2寄存器或者把FIFO_CTRL5里的FIFO模式寄存器重新写一遍触发其内部状态机复位。数据手册里关于这个细节讲得比较含蓄我是在实际使用中反复测试才确认的。另外如果开了ODR中断DRDY这个中断标志也需要在读取完数据后清除。而且IMU类传感器有个特点中断标志通常是水平触发而非边沿触发也就是说标志位不复位引脚就一直维持有效电平。这跟很多普通外设的边沿中断习惯完全不同代码逻辑要适应这个特性。6. 提升数据质量校准、温度补偿和实用技巧6.1 陀螺仪零偏校准30秒搞定虽然LSM6DSR出厂前做了校准但板级装配产生的应力、焊接温度变化都会引入附加零偏上电后做一次现场零偏校准还是很有必要的。最简单的校准方法设备静止放置采集至少100个采样点对3轴分别取平均得到的就是当前温度下的零偏偏置。这个值保存到Flash或EEPROM里每次上电加载在姿态解算前从原始数据里减掉它。有一点要注意陀螺仪的零偏不是固定不变的温度变了之后会漂移。如果项目工作温度范围宽不能只存一个零偏值建议做简单的多温度点校准。把设备放进温箱从-20℃到60℃每10℃一个点静止采集零偏得到一组零偏-温度曲线运行时用查表加线性插值的方式实时补偿。这个做法在工业级项目里几乎必备民用消费电子项目中如果姿态误差要求不那么苛刻可以只做常温单点校准。6.2 加速度计校准六面法快速标定加速度计出厂已经很准但板级装配时的倾斜、焊接应力同样会引入比例因子和零偏误差。做高精度倾角测量时建议做一次六面法校准。六面法原理很朴素把设备依次按X、-X、Y、-Y、Z、-Z六个方向水平放置每个方向采一组静止数据理想情况下每个方向的重力加速度分量应该是±1g。通过解方程组可以求出各轴的零偏和比例因子。实际操作中不用搞严格的水平台面用桌面加直角靠尺辅助就够了重点是要保证每个方向至少采集30秒数据取平均减少随机噪声的影响。标定完成后把零偏和比例因子存到非易失区校准精度大概能做到0.5到1mg以内对倾角测量来说这已经非常够了。6.3 数据融合和姿态输出的架构建议LSM6DSR本身不带姿态解算它不是惯性导航单元只输出原始角速度和加速度。姿态解算要靠外部MCU或DSP来做。常见的方案有互补滤波、Mahony滤波和卡尔曼滤波。对于新手我建议先用Mahony滤波它实现简单、调参参数少、效果稳定网上有很多成熟代码可以参考。等做复杂项目对动态精度要求高再上卡尔曼或误差状态卡尔曼滤波。如果你的系统需要磁力计提供航向角LSM6DSR没有内置磁力计外部通过Sensor Hub模式连接一颗磁力计芯片或者直接主控读取再融合。Sensor Hub模式我建议非老手先别碰它省电但不省心配置比较复杂可读性又差不如让主控直接读磁力计做融合来得直接。6.4 几个数据质量的常用技巧最后分享几个我自己测试下来效果很好的技巧第一ODR设置成后面处理所需频率的2倍以上如果做姿态解算解算频率50Hz那么ODR至少配到104Hz或更高。ODR和解算频率严格对应的话时间戳对齐容易出问题。第二使用FIFO批量读取时优先用SPI DMA这样可以减少CPU介入时间同时保证数据一包一包完整读走不容易被中断或任务切换打断导致半包数据。第三PCB布板时传感器尽量远离大电流走线和开关电源MEMS传感器对高频电磁干扰比较敏感我见过一个案子传感器放在板子边缘靠近DC-DC电感的位置静止时加速度计噪声比其他板子高了一倍多挪远之后噪声立刻就下来了。第四数据读出来后不要直接用于控制建议先做一次简单离群值剔除把超过3倍标准差的异常值丢弃或者重算能避免很多控制回路的抖动问题。这个是用来处理偶发尖峰毛刺的那些毛刺往往来自外界冲击或通信错误不是真实运动。7. 写在最后LSM6DSR适合什么项目不适合什么项目用这块芯片做了几个项目之后我对它的边界比当初看数据手册时清楚了很多。适合它的场景很明确需要中高ODR的振动监测低功耗、主控制器需要长期睡眠的电池供电设备对零偏稳定性有一定要求的工业级应用以及需要通过FIFO批量数据传输来降低通信负载的系统。在这些场景里LSM6DSR的表现稳定参数余量也大属于那种“你不太需要担心它拖后腿”的器件。不适合的场景也有如果你做的是机器人足端力控制级别的高动态响应它6.66kHz的ODR加上MEMS本身的带宽限制可能不够如果你做的是需要长期连续高精度导航的惯性导航系统LSM6DSR作为消费级/工业级MEMS其陀螺仪零偏稳定性跟光纤陀螺或者高精度石英陀螺完全不在一个量级如果你是做低成本消费电子、只需要计步和简易抬手亮屏那LSM6DS3之类的低端型号性价比会更高。我在调试这颗芯片时最深的一个体会是MEMS传感器的绝大多数问题并不出在传感器本身而是出在电路板设计、通信时序和配置逻辑上。数据手册读明白了引脚时序搞清楚了寄存器配置按逻辑顺序来很多看似玄学的问题其实都能从文档里找到答案。给准备用这颗芯片的同行们一个建议第一次打板时把所有通信引脚、中断引脚都引出测试点板上预留一个SPI Flash或者串口方便调试时把原始数据导出来分析。别问我为什么这么建议我踩过没有调试口的坑那感觉太难受了。希望这篇笔记能帮你把LSM6DSR顺利搞起来。有问题欢迎在评论区交流或者分享你在项目中遇到的奇葩问题大家一起长经验。