Funpack5-4 用NXP FRDM-MCXN236开发板实现惯性位置测量
该项目使用了NXP FRDM-MCXN236开发板,实现了惯性位置测量(使用加速度积分)的设计,它的主要功能为:使用开发板上的N236 MCU和板载的IMU三轴加速度传感器,实现对三维位置坐标的积分,以及零飘补偿算法。
标签
嵌入式系统
Funpack活动
开发板
fishlovescoding
更新2026-10-16
23

基于 FRDM-MCXN236 的三轴加速度采集与位置积分

项目简介

本项目使用 NXP FRDM-MCXN236 开发板,读取板载 FXLS8974CF 三轴加速度传感器的数据,并在 MCXN236 上完成零偏校准、运动状态判断、速度积分和位置积分。传感器通过 LPI2C2 与 MCU 通信,采样数据先进入 FXLS8974CF 内部 FIFO,再由 eDMA 批量搬运到双缓冲区。系统最终通过调试串口每 100 ms 输出一次 X、Y、Z 三轴相对位置。

和直接对加速度做两次积分相比,本项目增加了启动静态校准、噪声门限、静止检测、零速更新(ZUPT)和运动段漂移回改,用于减小传感器零偏及随机噪声造成的位置发散。该方案适合姿态基本不变、具有明确静止起点和终点的短时平移测量,也可以作为惯性测量、运动检测和传感器数据采集的入门实验。

关键词:FRDM-MCXN236、FXLS8974CF、LPI2C、eDMA、三轴加速度、位置积分、ZUPT


开发板

image.png

串口输出

image.png

一、项目概述

加速度计可以直接测量物体在三个轴向上的加速度。理论上,对加速度积分一次可以得到速度,再积分一次即可得到位置。但实际 MEMS 加速度计存在零偏、噪声、温漂和重力投影误差,即使很小的加速度误差也会在双重积分后迅速累积。因此,本项目不只完成传感器读取,还围绕“怎样让短时间位置积分更稳定”设计了完整的数据链路。

项目实现的主要功能如下:

  1. 自动探测板载 FXLS8974CF 的 I2C 地址,并读取 WHO_AM_I 校验器件身份。
  2. 以 200 Hz 输出数据率采集三轴加速度,量程设置为 +/-2 g。
  3. 使用传感器 FIFO 和 LPI2C eDMA,每批读取 16 组三轴样本。
  4. 上电后自动完成静态基线和三轴噪声估计。
  5. 根据自适应门限判断运动与静止状态,并对静止段执行零速更新。
  6. 实时计算三轴速度和相对位置,以毫米为单位通过串口输出。
  7. 使用 UART TX eDMA 发送日志,并在无任务时执行 WFI,降低 CPU 忙等待开销。

系统数据流如下:

image.png

二、硬件平台

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 批量采集、运动估计和异步日志输出。

image.png


四、功能特性

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 模式后,软件状态机按“稳定、校准、积分”三个阶段运行。

主要流程如下:

  1. 配置系统时钟、LPI2C2、LPUART4 和 DMA0。
  2. 在 0x18/0x19 地址读取 WHO_AM_I,确认返回 0x86。
  3. 将传感器配置为高性能、200 Hz、+/-2 g 和 FIFO Stream Mode。
  4. 丢弃前 200 ms 数据,静止采集 2 秒建立基线和噪声模型。
  5. 每 50 ms 查询 FIFO,达到 16 点水位后启动 96 字节 eDMA 读取。
  6. CPU 消费完整缓冲区,对 16 个样本逐个执行修正、状态判断和积分。
  7. 每 100 ms 通过 UART eDMA 输出一次三轴位置。
  8. 检测到运动停止后执行 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,只有配置值与预期一致才进入采集阶段。

寄存器

写入值

作用

SENS_CONFIG1

0x00 -> 0x01

Standby 配置、+/-2 g、进入 Active

SENS_CONFIG2

0x50

高性能模式、小端 12 位输出

SENS_CONFIG3

0x44

WAKE/SLEEP 均为 200 Hz

SENS_CONFIG4

0x01

保持默认中断配置

INT_EN

0x02

关闭 Boot 中断

BUF_CONFIG1

0x20

FIFO Stream Mode

BUF_CONFIG2

0x10

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 调度、误差建模和惯性位置估算之间的关系。


附件下载
3axisIMU_demo.rar
团队介绍
嵌入式软件工程师FishLee,单兵作战
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号