一、项目简介
本项目以 MAX78000FTHR 为核心,在 Zephyr RTOS 4.3.0 上实现三轴振动采集、实时参数计算、CSV 遥测和状态报警。【入门级题目2:振动信号采集与分析仪】
二、项目介绍
2.1 功能概览
- 首次写寄存器前执行只读身份探测:LIS3DSH 必须满足
0x1D/0x1E + 0x0F=0x3F。 - 将当前LIS3DSH配置为1600 Hz ODR、±2 g、16位、BDU、400 Hz抗混叠带宽和Stream FIFO。
- 设置16点FIFO水位,每5 ms查询
FIFO_SRC,达到水位后批量读取全部可用样本。 - 按 LIS3DSH ±2 g 灵敏度
0.06 mg/LSB进行定点换算; - 每 64 个有效样本计算三轴 Peak、P2P、RMS 和矢量 RMS。
- 通过 DAPLink 虚拟 UART 以 115200、8-N-1 输出 CSV 表头和 50 Hz 数据行。
- 报警采用连续窗口确认和恢复延迟;正常时绿灯亮,报警时红绿 LED 每 100 ms 交替。
2.2 硬件与工程配置
项目 | 配置 |
|---|---|
开发板 | MAX78000FTHR |
处理器 | MAX78000 Cortex-M4F,100 MHz |
Zephyr target |
|
实测传感器 | ST LIS3DSH: |
传感器地址 | SEL高= |
传感器配置 | ODR/有效采集1600 Hz,Stream FIFO,16点水位,±2 g,16位,带宽400 Hz |
I2C1 | SCL=P0.16,SDA=P0.17,400 kHz,VDDIOH 3.3 V |
虚拟 UART | RX=P0.0,TX=P0.1,115200,8-N-1,无流控 |
电脑接口 | CN1 USB-C,DAPLink 虚拟 COM 口 |
面包板接线示意图:

2.2.1 CodeFusion Studio 创建工程
首先使用 CodeFusion Studio v2.2.1 新建一个 workspace,取名为: Analyzer。本项目主要使用 ST LIS3DSH 传感器,使用 IIC 通信。因此,我基于 Zephyr Single Core I2C Custom Target 工程模板创建。

2.2.2 System Planner 配置外设
由于我创建项目时,使用的是 Zephyr Single Core I2C Custom Target 工程模板创建,已经自动分配好了串口、板载LED和 IIC1 配置。只不过默认配置的 IIC 通信速率为 100KHz。 对于 1000KHz 以上的采样率来有点不太够用,这里需要调整 IIC 的通信速率为 400KHz。

如上图所示,在 System Planner 配置界面,按图上中的顺序添加 I2C1 外设,只需要修改 IIC 通信速率为 400KHz,其它保持默认即可。
2.2.3 System Planner 代码生成
在 System Planner 的 Generate Code 标签页点击 Generate 按钮来生成代码即完成工程和外设的初始化设置。生成完成后,打开生成的 m4/boards/max78000fthr_max78000_m4.overlay 文件,可以看到 IIC 通信速率已经正确设置为了 400KHz。

注:CodeFusion Studio 值得称赞的一点是,如果是 Zephyr 项目的模板,生成的外设都是 Zephyr 设备树直接可用的
.conf和.overlay文件。
2.3 总体设计思路
设计遵循采样优先、FIFO解耦、计算就地、通信解耦和报警去抖原则。传感器以内部时钟均匀产生 1600 Hz 数据,主机批量排空FIFO并将每组数据都送入64点特征窗口,不再跳过中间转换结果。400 Hz抗混叠带宽低于 1600 Hz 采样的 800 Hz Nyquist频率。
三、功能实现
3.1 软件流程图
3.2 工程文件与职责
文件 | 主要职责 |
|---|---|
| Stream FIFO配置、状态读取、最长192字节批量读取和mg换算 |
| 64点整数窗口、Peak、P2P、三轴RMS、矢量RMS、整数平方根 |
| CSV表头、数据行格式化和chosen UART发送 |
| 启动流程、FIFO轮询与625 µs时间戳重建、静态线程、共享快照、报警和LED工作 |
| CFS生成的UART、I2C 速率配置 |
3.3 传感器配置与采样
驱动按 0x1D / 0x1E 执行只读探测。地址本身不作为型号依据,只有不可变身份值匹配才接受器件;身份确认前不写任何寄存器,避免误配置 I2C1 上的其他设备。
当前模块在 0x1D 返回 WHO_AM_I(0x0F)=0x3F 后,固件写入并逐项读回:
寄存器 | 值 | 作用 |
|---|---|---|
|
| 配置前停止转换,保持XYZ使能 |
|
| 400 Hz抗混叠带宽,±2 g,自检关闭 |
|
| Bypass模式并预置16点水位,清除旧FIFO数据 |
|
| FIFO、水位功能和多字节地址递增使能 |
|
| Stream模式,16点水位 |
|
| ODR 1600 Hz,BDU使能,XYZ使能 |
采样线程每5 ms读取FIFO_SRC(0x2F)。WTM=1时,根据FSS[4:0]确定可用点数。随后从OUT_X_L(0x28)开始一次读取点数×6字节,器件按从旧到新的顺序输出FIFO内容。关键换算和时间戳重建均不使用浮点:
/* LIS3DSH在±2 g量程下为0.06 mg/LSB。 */
int16_t counts = (int16_t)sys_get_le16(&raw[axis * 2U]);
sample->raw[axis] = counts;
sample->axis_mg[axis] = rounded_divide((int32_t)counts * 60, 1000);
/* 批次内每个样本保持LIS3DSH的625 us逻辑间隔。 */
sample->timestamp_us = next_sample_timestamp_us;
sample->timestamp_ms = (uint32_t)(next_sample_timestamp_us / 1000U);
next_sample_timestamp_us += 625U;
启动日志和CSV表头在115200串口上可能持续超过FIFO的20 ms容量,因此线程启动前会再次把FIFO_CTRL切换到Bypass再回到Stream。这样可以清除启动期间积累的数据,避免首次运行就产生伪溢出告警。
3.4 实时参数计算
设窗口长度为 N=64,某轴样本为 x[i],单位为 mg:
- 峰值:
Peak = max(abs(x[i])) - 峰峰值:
P2P = max(x[i]) - min(x[i]) - 单轴 RMS:
RMSx = sqrt(sum(x[i]^2) / N) - 矢量 RMS:
RMSv = sqrt(sum(x[i]^2+y[i]^2+z[i]^2) / N)
程序在线维护最小值、最大值、绝对峰值和64位平方和,不保存完整窗口。窗口结束时进行整数除法和整数平方根,避免实时路径中的浮点除法。当前 RMS 包含重力直流分量,静止时矢量 RMS 通常接近1000 mg;正式报警阈值应按安装方向和设备基线标定。
3.5 多线程与数据保护
执行单元 | 周期/触发 | 优先级 | 关键操作 |
|---|---|---|---|
采样线程 | 每5 ms查询;16点水位批量读取 | 1 | FIFO状态、批量I2C、时间戳、定点计算、发布快照 |
报警线程 | 10 ms | 3 | 处理新窗口并执行确认/恢复状态机 |
CSV遥测线程 | 20 ms | 4 | 复制快照并发送一行CSV |
系统工作队列 | 报警时每100 ms | 系统配置 | 红绿LED交替控制 |
共享快照由 k_mutex 保护,锁内只复制结构体。报警状态和诊断计数使用原子变量。采样线程优先级最高,可抢占UART遥测线程。
3.6 DAPLink 虚拟 UART 与 CSV
启动诊断以 # 开头,识别成功后预期出现:

CSV包含时间戳、三轴原始计数、三轴mg、Peak、P2P、RMS、矢量RMS、报警。50 Hz遥测发送的是1600 Hz采集流中的最新点,适合演示低频运动趋势和参数变化,但该50 Hz点序列不能重建0~400 Hz的完整振动波形。115200 baud下完整1600 Hz文本CSV会远超带宽;如需频率保真的全带宽波形,应使用更高速UART、USB、SD卡或紧凑二进制批量格式,上位机界面仍可保持50 Hz刷新率。
四、功能展示
4.1 构建、烧录和最终配置检查
在 CodeFusion Studio 的 Actions 视图中,选择 Build 下的 Build(m4) 执行编译操作。
CodeFusion Studio 重新生成可能覆盖板级 overlay 和 conf ,每次生成后应检查差异,避免覆盖板级 IIC1 下的
vibration_accel配置。
4.2 烧录
CodeFusion Studio 的 Actions 视图中,选择 Flash 下的 CFS: flash & run (OpenOCD) 完成烧录并启动。
4.3 演示步骤与预期现象
- 确认3.3 V、共地、SCL=P0.16、SDA=P0.17、CS=P1.6,烧录后正常复位。
- 启动
Vofa+,并连接开发板串口。 - 启动日志应识别
0x1D + identity=0x3F,并完成0x20/0x24/0x25/0x2E配置读回。 - 静止时一轴通常接近±1000 mg。
- 轻敲时 Peak、P2P迅速上升;持续晃动时RMS上升。
- 连续三个窗口超限后
alarm=1,红绿LED交替;连续八个正常窗口后恢复。
五、总结
已实现1600 Hz ODR和全量FIFO采集、16点水位批量读取、±2 g 16位换算、64点定点特征、50 Hz CSV遥测及带去抖报警。FIFO把传感器采样时钟与Zephyr调度解耦,并通过溢出计数暴露数据完整性,设计上满足“1 kHz以上采样、100 ms内计算”的目标。
后续可把 LIS3DSH INT1接入空闲GPIO,以水位中断替代5 ms状态查询;还可增加去直流/高通滤波、FFT、频带能量和趋势分析。不过 LIS3DSH 已被 ST 标为停产器件,新硬件设计宜选择仍在供货、带宽和ODR余量更充足的传感器。

