2026 ADI CodeFusion 竞赛 - 基于MAX78000FTHR实现振动信号采集与分析仪
该项目使用了MAX78000FTHR,实现了振动信号采集与分析仪的设计,它的主要功能为:实现三轴振动采集、实时参数计算、CSV 遥测和状态报警。。
标签
ADI
信号采集
ST
MAX78000
Zephyr
分析仪
CodeFusion
振动
三轴加速度
FIFO
招财猫
更新2026-09-29
34

一、项目简介

本项目以 MAX78000FTHR 为核心,在 Zephyr RTOS 4.3.0 上实现三轴振动采集、实时参数计算、CSV 遥测和状态报警。【入门级题目2:振动信号采集与分析仪】


二、项目介绍

2.1 功能概览

  1. 首次写寄存器前执行只读身份探测:LIS3DSH 必须满足 0x1D/0x1E + 0x0F=0x3F。
  2. 将当前LIS3DSH配置为1600 Hz ODR、±2 g、16位、BDU、400 Hz抗混叠带宽和Stream FIFO。
  3. 设置16点FIFO水位,每5 ms查询FIFO_SRC,达到水位后批量读取全部可用样本。
  4. 按 LIS3DSH ±2 g 灵敏度 0.06 mg/LSB进行定点换算;
  5. 每 64 个有效样本计算三轴 Peak、P2P、RMS 和矢量 RMS。
  6. 通过 DAPLink 虚拟 UART 以 115200、8-N-1 输出 CSV 表头和 50 Hz 数据行。
  7. 报警采用连续窗口确认和恢复延迟;正常时绿灯亮,报警时红绿 LED 每 100 ms 交替。


2.2 硬件与工程配置

项目

配置

开发板

MAX78000FTHR

处理器

MAX78000 Cortex-M4F,100 MHz

Zephyr target

max78000fthr/max78000/m4

实测传感器

ST LIS3DSH:WHO_AM_I(0x0F)=0x3F

传感器地址

SEL高=0x1D,SEL低=0x1E;当前为0x1D

传感器配置

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 工程文件与职责

文件

主要职责

m4/src/accelerometer.c

Stream FIFO配置、状态读取、最长192字节批量读取和mg换算

m4/src/signal_processing.c

64点整数窗口、Peak、P2P、三轴RMS、矢量RMS、整数平方根

m4/src/csv_telemetry.c

CSV表头、数据行格式化和chosen UART发送

m4/src/main.c

启动流程、FIFO轮询与625 µs时间戳重建、静态线程、共享快照、报警和LED工作

m4/boards/max78000fthr_max78000_m4.overlay

CFS生成的UART、I2C 速率配置

3.3 传感器配置与采样

驱动按 0x1D / 0x1E 执行只读探测。地址本身不作为型号依据,只有不可变身份值匹配才接受器件;身份确认前不写任何寄存器,避免误配置 I2C1 上的其他设备。

当前模块在 0x1D 返回 WHO_AM_I(0x0F)=0x3F 后,固件写入并逐项读回:

寄存器

值

作用

CTRL_REG4(0x20)

0x07

配置前停止转换,保持XYZ使能

CTRL_REG5(0x24)

0x80

400 Hz抗混叠带宽,±2 g,自检关闭

FIFO_CTRL(0x2E)

0x10

Bypass模式并预置16点水位,清除旧FIFO数据

CTRL_REG6(0x25)

0x70

FIFO、水位功能和多字节地址递增使能

FIFO_CTRL(0x2E)

0x50

Stream模式,16点水位

CTRL_REG4(0x20)

0x9F

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 演示步骤与预期现象

  1. 确认3.3 V、共地、SCL=P0.16、SDA=P0.17、CS=P1.6,烧录后正常复位。
  2. 启动 Vofa+,并连接开发板串口。
  3. 启动日志应识别0x1D + identity=0x3F,并完成0x20/0x24/0x25/0x2E配置读回。
  4. 静止时一轴通常接近±1000 mg。
  5. 轻敲时 Peak、P2P迅速上升;持续晃动时RMS上升。
  6. 连续三个窗口超限后 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余量更充足的传感器。


六、参考资料

附件下载
Analyzer.zip
CodeFusion Studio v2.2.1 工程源码
团队介绍
业余电子爱好者
团队成员
招财猫
评论
0 / 100
查看更多
猜你喜欢
制作FPGA电子琴1. 存储一段音乐,并可以进行音乐播放, 2. 可以自己通过板上的按键进行弹奏,支持两个按键同时按下(和弦)并且声音不能失真,板上的按键只有13个,可以通过有上方的“上“、”下”两个按键对音程进行扩展
john
2908
2026 ADI CodeFusion 竞赛 - 小型旋转机械的边缘振动监测与状态识别系统该项目使用了MAX32650FTHR、BMI160,实现了识别旋转机械状态和环境监测的设计,它的主要功能为:加速度计检测电风扇的关闭、开启、异常状态,并通过ESP-12F上报到上位机。
scgummy
55
2026 ADI CodeFusion 竞赛 把机械振动“看见”:一台 MEMS 频谱分析仪的完整设计过程该项目使用了ADXL382,MAX32655,ESP32-C3,实现了3轴同步 16kHz 采样的高动态范围振动采样仪的设计,它的主要功能为:本项目设计并实现了一套基于 ADXL382 的机械振动频谱分析仪,围绕传感器选型、机械结构、数据采集、实时传输和边缘 DSP 分析完成了完整验证。系统采用金属底座提高机械刚度,并通过有限元分析评估固有频率、振动传递和应力分布;ADXL382 负责三轴宽带振动采集,MAX32655 完成高速数据读取、FFT、RMS、峭度、峰值及频带能量等特征计算,再通过 ESP32-C3 完成数据转发、显示和上位机交互。最终系统实现了 16 kSPS 三轴连续采集和 4096 点实时 FFT,在保证原始数据完整传输的同时具备本地振动特征提取能力,可用于机械状态监测、故障分析及结构振动测试。
yunswj
85
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号