基于 FRDM-MCXN236 的三轴加速度采集与位置积分
项目简介
本项目使用 NXP FRDM-MCXN236 开发板,读取板载 FXLS8974CF 三轴加速度传感器的数据,并在 MCXN236 上完成零偏校准、运动状态判断、速度积分和位置积分。传感器通过 LPI2C2 与 MCU 通信,采样数据先进入 FXLS8974CF 内部 FIFO,再由 eDMA 批量搬运到双缓冲区。系统最终通过调试串口每 100 ms 输出一次 X、Y、Z 三轴相对位置。
和直接对加速度做两次积分相比,本项目增加了启动静态校准、噪声门限、静止检测、零速更新(ZUPT)和运动段漂移回改,用于减小传感器零偏及随机噪声造成的位置发散。该方案适合姿态基本不变、具有明确静止起点和终点的短时平移测量,也可以作为惯性测量、运动检测和传感器数据采集的入门实验。
关键词:FRDM-MCXN236、FXLS8974CF、LPI2C、eDMA、三轴加速度、位置积分、ZUPT
开发板

串口输出

一、项目概述
加速度计可以直接测量物体在三个轴向上的加速度。理论上,对加速度积分一次可以得到速度,再积分一次即可得到位置。但实际 MEMS 加速度计存在零偏、噪声、温漂和重力投影误差,即使很小的加速度误差也会在双重积分后迅速累积。因此,本项目不只完成传感器读取,还围绕“怎样让短时间位置积分更稳定”设计了完整的数据链路。
项目实现的主要功能如下:
- 自动探测板载 FXLS8974CF 的 I2C 地址,并读取
WHO_AM_I校验器件身份。 - 以 200 Hz 输出数据率采集三轴加速度,量程设置为 +/-2 g。
- 使用传感器 FIFO 和 LPI2C eDMA,每批读取 16 组三轴样本。
- 上电后自动完成静态基线和三轴噪声估计。
- 根据自适应门限判断运动与静止状态,并对静止段执行零速更新。
- 实时计算三轴速度和相对位置,以毫米为单位通过串口输出。
- 使用 UART TX eDMA 发送日志,并在无任务时执行
WFI,降低 CPU 忙等待开销。
系统数据流如下:

二、硬件平台
1. FRDM-MCXN236 开发板
本项目的主控为 MCXN236,程序运行在 Arm Cortex-M33 内核上,当前工程将系统主频配置为 150 MHz。工程可用片上资源为 512 KB Flash 和 224 KB SRAM,足以容纳传感器驱动、双缓冲、静止检测窗口和位置估计算法。
FRDM-MCXN236 集成板载调试器,可通过一根 USB 线完成供电、程序下载、调试和虚拟串口通信,无需额外连接传感器模块。
2. FXLS8974CF 三轴加速度传感器
FXLS8974CF 是板载低功耗三轴加速度计。本项目使用其普通 12 位输出、+/-2 g 量程和高性能模式,对应灵敏度为 1024 LSB/g。传感器内部带有 32 样本 FIFO,可在 MCU 暂未读取时缓存连续采样结果。
项目涉及的关键参数如下:
项目 | 配置 |
|---|---|
MCU 主频 | 150 MHz |
通信外设 | LPI2C2 |
I2C 速率 | 1 MHz |
传感器输出速率 | 200 Hz |
加速度量程 | +/-2 g |
数据格式 | 普通 12 位、小端 |
FIFO 模式 | Stream Mode |
FIFO 水位 | 16 个样本 |
单批数据量 | 16 x 3 x 2 = 96 字节 |
FIFO 查询周期 | 50 ms |
位置输出周期 | 100 ms |
调试串口 | 115200 bit/s |
板载传感器连接到 LPI2C2,对应 PIO4_0/FC2_P0 与 PIO4_1/FC2_P1。因为传感器已经安装并连接在开发板上,实际使用时只需连接开发板的调试 USB 接口
三、软件工具
本项目使用以下软件环境:
- MCUXpresso IDE:工程导入、编译、下载和在线调试。
- MCUXpresso SDK:提供 LPI2C、eDMA、LPUART、时钟和板级驱动。
- LinkServer:连接 FRDM 板载调试器并下载程序。
- 串口终端:查看校准信息、位置结果、CPU 占用和日志丢弃计数。
工程由 NXP SDK 的 lpi2c_edma_b2b_transfer_master 示例改造而来。原示例用于两块开发板之间的 I2C 主从传输,本项目保留其 LPI2C eDMA 框架,将从机替换为板载 FXLS8974CF,并加入 FIFO 批量采集、运动估计和异步日志输出。

四、功能特性
1. 自动识别传感器
FXLS8974CF 的地址由 SA0 电平决定,可能为 0x18 或 0x19。程序依次尝试这两个地址,并检查 WHO_AM_I(0x13) 是否返回 0x86。这样可以避免将总线 ACK 误认为传感器初始化成功。
2. FIFO 与 eDMA 连续采样
传感器每 5 ms 产生一组三轴样本。FIFO 累积到 16 组数据后置位水位标志,MCU 每 50 ms 查询一次 BUF_STATUS;发现水位有效时,从 BUF_X_LSB(0x0C) 连续读取 96 字节。LPI2C 的发送和接收分别使用 DMA0 通道 0、1,采集缓存采用两个 16 样本的 Ping-Pong 缓冲区,DMA 搬运与 CPU 数据处理可以交替进行。
3. 启动校准与自适应滤波
程序上电后先丢弃 40 个样本,让模拟前端和机械状态稳定;随后使用 400 个静止样本进行 2 秒校准。三轴均值作为当前姿态下的基线,其中同时包含传感器零偏和重力投影。三轴噪声标准差通过 Welford 在线算法计算,不需要保存全部校准数据。
积分时先从原始值中减去基线。如果残差不超过对应轴噪声的 3 倍,则按噪声处理并置零,以减少微小随机量被持续积分放大的问题。
4. 三轴速度与位置积分
在 +/-2 g、12 位输出配置下,加速度换算关系为:
a = corrected_lsb x 9.80665 / 1024
dt = 1 / 200 = 0.005 s
每个样本按匀加速度模型更新位置与速度:
position = position + velocity x dt + 0.5 x acceleration x dt x dt
velocity = velocity + acceleration x dt
计算过程全部在 MCU 本地完成,不依赖上位机。串口每 100 ms 输出一次积分时间、X/Y/Z 位置、运动状态和 ZUPT 次数。
5. 静止检测与零速更新
校准完成后系统初始为静止状态。任一轴连续 3 个样本超过较高退出门限后,系统进入运动状态;最近 40 个样本的三轴均值和标准差均低于进入门限时,系统重新确认静止。不同的进入、退出门限构成迟滞,可避免状态在门限附近反复切换。
设备重新静止时,理论终点速度应为零。程序将当前终点速度视为运动段内累计的线性漂移,执行:
position = position - 0.5 x terminal_velocity x segment_time
velocity = 0
同时对基线做有限幅度更新,以补偿部分慢变零偏。这种 ZUPT 方法不能完全消除误差,但对具有明确“静止 - 运动 - 静止”过程的短时位移比简单双积分稳定得多。
6. 非阻塞日志与低占用运行
位置日志先格式化到 256 字节缓存,再由 DMA0 通道 2 发送到 LPUART4。SysTick 中断仅设置任务标志,I2C 访问和数据处理均放在主循环执行。没有待处理事件时,Cortex-M33 进入 WFI,避免持续轮询占用 CPU。
五、系统工作原理
系统启动后依次完成硬件初始化、传感器探测、寄存器配置、eDMA 初始化和 SysTick 配置。传感器进入 200 Hz Active 模式后,软件状态机按“稳定、校准、积分”三个阶段运行。
主要流程如下:
- 配置系统时钟、LPI2C2、LPUART4 和 DMA0。
- 在
0x18/0x19地址读取WHO_AM_I,确认返回0x86。 - 将传感器配置为高性能、200 Hz、+/-2 g 和 FIFO Stream Mode。
- 丢弃前 200 ms 数据,静止采集 2 秒建立基线和噪声模型。
- 每 50 ms 查询 FIFO,达到 16 点水位后启动 96 字节 eDMA 读取。
- CPU 消费完整缓冲区,对 16 个样本逐个执行修正、状态判断和积分。
- 每 100 ms 通过 UART eDMA 输出一次三轴位置。
- 检测到运动停止后执行 ZUPT,并等待下一段运动。
一次 FIFO 批量读取的 I2C 时序为:
S | Addr+W | ACK | 0x0C | ACK | Sr | Addr+R | ACK |
| D0 | ACK | ... | D95 | NACK | P
在 1 MHz I2C 下,该传输的总线占用时间约为 0.9 ms,明显短于 80 ms 的 16 点采样周期。传感器 FIFO 填满需要约 160 ms,而水位触发后仍有约 80 ms 余量,因此 50 ms 查询周期可以为主循环调度留出足够空间。
六、开发过程
1. 改造 SDK 示例
首先在 MCUXpresso IDE 中导入 FRDM-MCXN236 的 LPI2C eDMA 主机示例,确认工程能够编译和下载。随后将原有的板间主从收发逻辑替换为 FXLS8974CF 寄存器读写,并把 LPI2C2 速率设置为 1 MHz。
2. 完成传感器初始化
初始化时先让传感器进入 Standby,再依次配置性能模式、数据输出率、FIFO 模式和水位,最后置位 Active。程序会回读所有关键寄存器和 SYS_MODE,只有配置值与预期一致才进入采集阶段。
寄存器 | 写入值 | 作用 |
|---|---|---|
|
| Standby 配置、+/-2 g、进入 Active |
|
| 高性能模式、小端 12 位输出 |
|
| WAKE/SLEEP 均为 200 Hz |
|
| 保持默认中断配置 |
|
| 关闭 Boot 中断 |
|
| FIFO Stream Mode |
|
| FIFO 水位为 16 个样本 |
3. 加入双缓冲和异步输出
DMA 直接写入 NonCacheable 区域的双缓冲。DMA 完成回调只发布状态,缓冲切换和样本处理由主循环完成,缩短中断执行时间。串口输出也改为 eDMA,防止 115200 bit/s 日志传输阻塞 200 Hz 采样链路。
4. 实现位置估计算法
位置估计先从基础双积分开始,再逐步加入启动校准、3σ 噪声门限、静止窗口、速度清零和运动段回改。这样既保留了算法过程的可解释性,也能直观看到各种误差抑制方法对积分结果的影响。
5. 编译与运行
使用 Debug 配置编译后生成:
Debug/frdmmcxn236_lpi2c_edma_b2b_transfer_master.axf
当前构建结果占用 37,832 B Flash 和 10,228 B SRAM。下载程序后打开 115200 bit/s 串口,上电后的前 2.2 秒必须保持开发板静止,并在之后的移动过程中尽量保持板子姿态不变。
正常启动时可看到类似输出:
FXLS8974CF detected at 0x18, WHO_AM_I=0x86.
High-performance mode, 200 Hz ODR, +/-2 g range, 1 MHz I2C.
FIFO watermark=16; polling every 50 ms, no INT1 connection required.
Calibration complete: baseline_lsb=(...), noise_rms_ug=(...), samples=400
Position: t=100 ms, X=... mm, Y=... mm, Z=... mm, stationary=1, zupt=0, ...
其中 stationary=1 表示当前确认静止,zupt 表示已经完成的零速更新次数,corr 为最近一次 ZUPT 对三轴位置施加的回改量。cpu 和 uart_cpu 可用于观察 CPU 总负载和日志格式化开销,drop 应保持为 0。
实测截图位置:插入传感器识别与校准完成的串口截图。
实测截图位置:插入开发板沿 X 轴平移并停止后的串口位置结果。
演示视频位置:展示“静止校准 -> 单轴移动 -> 停止 -> ZUPT 后位置保持”的完整过程。
七、使用 MCUXpresso IDE 的优势
MCUXpresso IDE 对 NXP MCU、开发板和 SDK 的集成度较高。通过 SDK 示例可以快速建立正确的时钟、引脚和外设工程,再使用外设驱动完成 LPI2C 与 eDMA 配置。调试器能够直接观察 FIFO 计数、DMA 完成标志、I2C 错误计数、传感器溢出计数以及三轴速度和位置变量,对定位采样时序和积分漂移问题很有帮助。
工程还保留了 Config Tools 生成的时钟和引脚配置,后续需要更换 I2C 实例、调整串口或修改主频时,可以在图形化配置与源码之间对应检查。对于需要同时处理传感器、DMA、中断和算法状态机的项目,这种软硬件一体化调试方式可以明显缩短开发周期。
八、应用场景和后续优化方向
应用场景
- 教学实验:演示 I2C 传感器、FIFO、DMA 和惯性积分的完整数据链路。
- 短时位移估算:测量具有明确静止起止点的单轴或平面运动。
- 运动状态检测:判断设备处于静止、启动、移动或停止状态。
- 低功耗数据采集:利用 FIFO、DMA 和
WFI减少 CPU 持续参与。 - 算法验证平台:比较滤波、阈值检测和 ZUPT 对积分漂移的改善效果。
局限性
单个三轴加速度计无法独立观测姿态。只要开发板发生倾斜,重力在 X、Y、Z 轴上的投影就会改变,并被积分算法误认为运动加速度;加速度计也无法区分静止和无加速度的匀速运动。因此,本项目输出的是校准姿态坐标系下的短时相对位置,不适合作为长期、高精度惯性导航结果。
后续优化方向
- 融合陀螺仪和磁力计,实时估计姿态并从测量值中扣除重力向量。
- 使用卡尔曼滤波或互补滤波融合编码器、光流、UWB、GNSS 等外部位置观测。
- 将传感器 INT1 接入 MCU,用 FIFO 水位中断替代周期查询,进一步降低延迟和功耗。
- 针对具体运动机构标定静止门限、噪声门限和 ZUPT 回改模型。
- 增加按键清零、轨迹绘制和上位机可视化,使实验结果更直观。
- 记录原始加速度到文件,通过离线数据集量化位移误差并优化参数。
总结
本项目在 FRDM-MCXN236 上完成了从板载 FXLS8974CF 三轴加速度采集到相对位置输出的完整实现。传感器 FIFO 与 LPI2C eDMA 保证了连续、低占用的数据搬运,启动校准和自适应噪声门限降低了静止漂移,运动状态机与 ZUPT 则对速度和位置累计误差进行了进一步约束。
项目同时说明了一个重要事实:加速度双积分并不等于可靠定位。只有在姿态基本固定、运动时间较短且具有静止约束时,三轴加速度计才能提供有参考价值的相对位移。通过这一项目,可以完整理解嵌入式传感器采集、DMA 调度、误差建模和惯性位置估算之间的关系。