2026 ADI CodeFusion 竞赛 - 小型旋转机械的边缘振动监测与状态识别系统
该项目使用了MAX32650FTHR、BMI160,实现了识别旋转机械状态和环境监测的设计,它的主要功能为:加速度计检测电风扇的关闭、开启、异常状态,并通过ESP-12F上报到上位机。
标签
嵌入式系统
FFT
加速度计
scgummy
更新2026-09-29
57
KiCad文件
全屏

1. 项目介绍

本项目使用 MAX32650FTHR 作为主控平台,结合 BMI160 三轴加速度计与 BME280 环境温湿度传感器,构建一个面向小型旋转机械的振动与环境数据采集系统,项目构思来源自『数据采集』赛道的『机械振动频谱分析仪』.



系统使用 BMI160 采集设备运行过程中产生的三轴机械振动信号,并在主控端对采集到的数据进行时域统计分析与频域分析. 通过观察振动幅值、周期性以及频谱分布等特征,分析设备在不同运行状态和工作条件下的振动变化. 同时采集环境温度与相对湿度,为振动数据提供基本的环境信息.

本项目以小型手持风扇作为实验对象,通过改变设备的运行状态及其工作条件,采集对应的振动数据,并尝试利用振动信号中的时域和频域特征实现对旋转机械运行状态的自动识别.


系统主要由以下部分组成:
MAX32650FTHR 主控平台.
BMI160 三轴加速度传感器.
BME280 温度、相对湿度与气压传感器.
ESP-12F 无线通信模块.


系统的软件部分运行于 CodeFusion Studio 所提供的 MSDK 开发环境,并使用 VS Code 及 CodeFusion Studio Extension 完成开发、编译、烧录与调试.

2. 系统总体设计

系统的数据处理流程可以概括为:



系统以固定长度的采样窗口作为基本分析单位. BMI160 按照设定的采样率持续输出加速度数据,当一个窗口的数据采集完成后,对该窗口进行时域统计和频域分析,并根据得到的特征进行后续状态判断.



这种处理方式使时域特征与频域特征对应于同一段实际振动信号,便于对不同工况进行比较.


3. 硬件设计

3.1 MAX32650FTHR


MAX32650FTHR 作为系统主控平台,负责传感器数据采集、数据处理以及与外部设备之间的通信.

在本项目中,主控需要持续接收 BMI160 的高频加速度数据,并在较短时间内完成窗口数据处理和 FFT 计算. 因此,主控平台不仅承担普通的传感器接口功能,同时也是整个边缘信号处理流程的计算平台.

系统的主要信号处理过程均在主控端完成,不需要将原始振动数据持续发送到上位机后再进行计算.

3.2 BMI160



BMI160 用于采集旋转机械运行过程中产生的三轴加速度信号. 机械设备在旋转过程中会产生周期性的振动,其幅值和频率分布会随着设备运行状态及外部条件发生变化.

本项目使用 BMI160 的加速度数据作为主要振动信号来源. 当前采集参数设置为:

参数

设置

加速度 ODR

1600 Hz

加速度量程

分析窗口

512

单窗口时间

0.32 s

1600 Hz 的采样率对应的 Nyquist 频率为 Hz, 因此理论上可以分析 0 至 800 Hz 范围内的振动频率成分.

3.3 BME280

BME280 用于采集环境温度与相对湿度数据. 环境参数本身不是本项目主要的振动识别依据,但可以作为振动数据的辅助信息.

在实际实验中,环境温度和湿度可能随实验时间发生变化. 保存这些数据可以为后续分析提供实验环境记录,并为判断环境变化是否对测量结果产生影响提供依据.

3.4 ESP-12F


ESP-12F 用于系统的数据通信. 主控完成振动数据的采集和分析后,可以通过无线通信模块向外部设备发送处理结果或实验数据.

ESP-12F 使用 AT 固件,项目提前通过 UART 配置好了自动连接,这样模块上电后只需要 MAX32650 主控发送透传启动的命令,之后所有串口数据都将以 TCP 流的形式送给上位机用于展示频谱、分类状态、告警、温湿度等信息.

AT
OK
AT+CWMODE?
+CWMODE:2
OK
AT+CWMODE=1
OK
AT+CWJAP="SSID","mypassword"
WIFI CONNECTED
WIFI GOT IP
OK
AT+CWAUTOCONN=1
OK

3.5 硬件连接

项目将计划使用 PCB 将各个组件进行互联,各个组件的逻辑连接方式可参考此图,I2C 总线将运行于 400 kHz,以最大程度提升加速度计数据读取的吞吐量和响应速度.


4. 开发环境

本项目使用 VS Code 作为主要开发环境,并通过 CodeFusion Studio Extension 完成项目的配置、编译、烧录和调试. 底层软件基于 CodeFusion MSDK 提供的开发环境和 Zephyr 软件框架.


开发过程中使用调试器连接 MAX32650FTHR,通过串口输出运行状态和调试信息. 由于振动数据采集和 FFT 调试过程中需要频繁观察传感器配置、FIFO 数据以及分析结果,因此串口日志也是系统开发和验证过程中的重要调试手段. MAX32650FTHR 随盒附赠了一款 MAX32625 主控的小调试器,可使用软排线和板上的 SWD 接口相连,然后使用 OpenOCD / JLink 等调试.

CodeFusion Studio 扩展内提供一键构建、下载、调试的菜单项,可直接进行操作,非常方便.

5. 振动信号分析

5.1 旋转机械振动

旋转机械运行时,其内部旋转部件会产生周期性的机械运动. 当旋转部件存在不平衡、结构扰动或工作条件变化时,这些周期性运动会反映到设备外壳的加速度信号中.

对于转速为 rpm 的旋转部件,其基本旋转频率为

如果旋转部件包含 个周期性重复结构,例如风扇叶片,则与叶片通过相关的特征频率可以表示为:

因此,振动信号的频谱中可能出现与旋转频率及其谐波相关的明显频率成分. 通过比较不同工况下这些频率成分的幅值和分布,可以观察机械状态变化在振动信号中的表现.

5.2 时域分析

时域分析直接对采样窗口中的加速度数据进行统计. 本项目当前使用峰值、峰峰值和 RMS 作为基本时域特征.

峰值定义为:

峰峰值定义为:

RMS 定义为:

其中 为一个分析窗口中的采样点数量.

这些统计量分别从不同角度描述振动信号. 峰值可以反映窗口内出现的最大瞬时振动幅值,峰峰值描述信号整体的幅度范围,RMS 则描述一段时间内振动信号的整体有效幅值.


5.3 频域分析

仅观察时域波形通常难以直接确定机械振动中包含哪些周期性成分. 对采样窗口进行 Fourier 变换后,可以将时域信号表示为不同频率成分的组合,从而观察振动能量在频率轴上的分布.

离散 Fourier 变换定义为:

直接计算 DFT 的计算量为 . FFT 通过利用离散 Fourier 变换中的结构,将计算复杂度降低到 .

本项目使用 512 点 FFT. 对于 1600 Hz 的采样率,其频率分辨率为:


由于 BMI160 输出的是实数加速度信号,其 Fourier 变换具有共轭对称性. 因此实际分析时主要关注 至 Hz 的正频率部分.

6. 特征提取与状态识别

在完成时域和频域分析后,可以将多个统计量组合成一个特征向量. 例如:

其中 可以表示频谱中的主要频率成分, 可以表示指定频段内的频谱能量.

7. 实验设计与结果

7.1 实验对象

实验使用小型手持风扇作为旋转机械对象. 加速度传感器固定于风扇结构上,通过采集设备运行时的振动信号观察不同工作条件下的信号变化.

传感器安装方式会直接影响机械振动向传感器的传递. 因此实验中应尽可能保持传感器安装位置和固定方式一致,以减少实验条件本身带来的变化.


7.2 实验工况

本项目通过改变风扇的运行状态和工作条件进行实验.

目前考虑的实验条件包括:

风扇停止运行.

风扇正常运行.

对旋转叶片施加外部扰动.

改变进风或出风条件.

这些条件用于观察机械运行状态变化是否能够在加速度信号中产生可测量的差异.

7.3 风扇关闭

image.png

风扇关闭时,加速度计采集的值理论上比较稳定,不过实际中存在一定噪声.

采集并分析的数据显示,时域统计下的峰峰值明显小,频域 FFT 后的频谱无明显主导峰值.

7.4 风扇打开

image.png

风扇打开后,峰峰值显著增大并且在项目实验环境下接近 1,同时 FFT 频谱出现显著且能量占据主导的频谱峰,频谱峰长期稳定.

7.5 风扇异常:进出风口遮挡或扇叶剐蹭

image.png

当用一张纸遮挡进出风口时,时域下的峰峰值略微上升,标准差也略微上升,频域下原本的主导频率明显左移.

8. 软件实现

8.1 设备树修改

为了实现 MAX32650 和 ESP-12F 互联,将一个 GPIO 连接到了 ESP-12F 的 `RST` 引脚上,但 MAX32650 的引脚默认采用 1.8V 的 VDDIO 电压源,这会导致一些不必要的问题. 使用 `MAX32_GPIO_VSEL_VDDIOH` 可将 GPIO 的电源域分配到 3.3V 上.

与 ESP-12F 模块通信的 UART 也要声明,并单独为绑定的 GPIO 声明上拉和电压源.

&uart1_tx_p2_16 {
power-source = <MAX32_VSEL_VDDIOH>;
};


&uart1_rx_p2_14 {
power-source = <MAX32_VSEL_VDDIOH>;
bias-pull-up;
};



&uart1 {
pinctrl-0 = <&uart1_tx_p2_16 &uart1_rx_p2_14>;
pinctrl-names = "default";
clock-source = <ADI_MAX32_PRPH_CLK_SRC_PCLK>;
current-speed = <115200>;
parity = "none";
stop-bits = "1";
data-bits = <8>;
status = "okay";
};

I2C 总线上挂载了 BMI160 和 BME280,参照了 Zephyr 官方同主控的 MAX32650EVKIT 的写法启用了 DMA,并额外设置了 400kHz 的总线速度,声明了 BMI160 和 BME280 这两个从设备.

&i2c1 {
status = "okay";
clock-frequency = <400000>;
pinctrl-0 = <&i2c1_scl_p2_18 &i2c1_sda_p2_17>;
pinctrl-names = "default";

dmas = <&dma0 2 MAX32_DMA_SLOT_I2C1_TX>, <&dma0 3 MAX32_DMA_SLOT_I2C1_RX>;
dma-names = "tx", "rx";

bmi160: bmi160@69 {
compatible = "bosch,bmi160";
reg = <0x69>;
status = "okay";
};

bme280: bme280@76 {
compatible = "bosch,bme280";
reg = <0x76>;
status = "okay";
};
};

8.2 BMI160 FIFO 高速读取

Zephyr 自带的 BMI160 驱动通过 sensor 传感器子系统暴露 API,但没有利用 BMI160 的 FIFO 批量读取,导致每次读取时是重新通过数据寄存器读取最新值,这会造成吞吐量瓶颈. 对于高频率分析系统,应该充分利用 BMI160 的 FIFO 进行批量读取.

#define BMI160_REG_FIFO_DATA      0x24
i2c_burst_read_dt(spec, BMI160_REG_FIFO_DATA, raw, bytes);

不过在读取 FIFO 数据的寄存器之前,需要先对 FIFO 进行配置,设置了 FIFO 开启加速度数据和关闭头部信息,这样读取到的数据就是连续的 6-byte 样本.

#define BMI160_REG_FIFO_CONFIG0   0x46
#define BMI160_REG_FIFO_CONFIG1 0x47
#define BMI160_REG_CMD 0x7E
uint8_t config;
i2c_reg_read_byte_dt(spec, BMI160_REG_FIFO_CONFIG1, &config);
config |= BMI160_FIFO_ACCEL_EN;
config &= ~BMI160_FIFO_HEADER_EN;
i2c_reg_write_byte_dt(spec, BMI160_REG_FIFO_CONFIG1, config);
i2c_reg_write_byte_dt(spec, BMI160_REG_CMD, 0xB0);

为了防止先前 FIFO 数据残留,使用 0xB0 这个命令,强行重置 FIFO 读写头清空可能存在的残留数据.

8.3 数据分析模块

项目中将采样窗口和基础统计分析封装为 analyzer 分析器模块.


分析器在接收采样数据时,同时更新当前窗口的最大值、最小值和平方和. 因此峰值、峰峰值和 RMS 等统计量不需要在窗口结束后重新遍历全部采样数据.


对于单个采样点,统计状态的更新只需要常数次运算,因此更新过程的时间复杂度为 .


与此同时,分析器保存完整的采样窗口,以供后续 FFT 使用. 因此分析器的存储空间主要由窗口数据决定,空间复杂度为 ,其中 为窗口长度.

当前实现采用固定长度窗口. 当窗口填满后,对当前窗口进行分析并清空分析器, 然后开始采集下一窗口.

static void stat_state_update(struct stat_state *state, struct sample sample)
{
if (sample.x > state->max.x) {
state->max.x = sample.x;
}

if (sample.y > state->max.y) {
state->max.y = sample.y;
}

if (sample.z > state->max.z) {
state->max.z = sample.z;
}

if (sample.x < state->min.x) {
state->min.x = sample.x;
}

if (sample.y < state->min.y) {
state->min.y = sample.y;
}

if (sample.z < state->min.z) {
state->min.z = sample.z;
}

state->sum.x += sample.x;
state->sum.y += sample.y;
state->sum.z += sample.z;

state->sq.x += sample.x * sample.x;
state->sq.y += sample.y * sample.y;
state->sq.z += sample.z * sample.z;
}

8.4 FFT 数据处理

窗口采集完成后,将保存的加速度采样数据作为 FFT 输入. FFT 输出为复数频域数据, 对于实数输入信号,其频谱具有共轭对称性.

MAX32650 是 ARM Cortex-M4 的主控,FFT 部分直接采用来自 CMSIS 的 DSP 库的高效 FFT 运算函数.

因为加速度计的数据存在三个方向,这里充分考虑到维度选择的自由,并增加一个第 4 维度用于对历史加速度的模长的平方进行 FFT.

#ifdef CONFIG_CMSIS_DSP
void analyzer_fft(struct analyzer *anal, int dim, float *output)
{
// ensure window is power of 2
assert(anal->size > 0 && (anal->size & (anal->size - 1)) == 0);

int i;
switch (dim) {
case 0:
for (i = 0; i < anal->size; i++) {
anal->fft_input[i] = anal->samples[i].x;
}
break;
case 1:
for (i = 0; i < anal->size; i++) {
anal->fft_input[i] = anal->samples[i].y;
}
break;
case 2:
for (i = 0; i < anal->size; i++) {
anal->fft_input[i] = anal->samples[i].z;
}
break;
case 3:
for (i = 0; i < anal->size; i++) {
anal->fft_input[i] = anal->samples[i].x * anal->samples[i].x;
anal->fft_input[i] += anal->samples[i].y * anal->samples[i].y;
anal->fft_input[i] += anal->samples[i].z * anal->samples[i].z;
}
break;
default:
return;
}
arm_rfft_fast_f32(
&anal->fft,
anal->fft_input,
output,
0
);
}
#endif

实际特征提取时主要使用频谱幅值或频谱能量,而不直接使用 FFT 输出的复数相位信息.

8.5 无线通信和上位机

主控通过 UART 将数据序列化写入 ESP,如下所示.

uint32_t len = (uint32_t)result->len;
uint32_t state = (uint32_t)result->state;
float t, h;
esp_write(app->esp_uart, &len, sizeof(len));
esp_write(app->esp_uart, &state, sizeof(state));
esp_write(app->esp_uart, &result->stats->peak.x, sizeof(float));
esp_write(app->esp_uart, &result->stats->peak.y, sizeof(float));
esp_write(app->esp_uart, &result->stats->peak.z, sizeof(float));
esp_write(app->esp_uart, &result->stats->p2p.x, sizeof(float));
// ...esp_write(app->esp_uart, &result->stats->p2p.y, sizeof(float));
esp_write(app->esp_uart, result->fft_z, result->len * sizeof(float));
sensor_env_to_float(env, &t, NULL, &h);
esp_write(app->esp_uart, &t, sizeof(float));
esp_write(app->esp_uart, &h, sizeof(float));

上位机使用 Python 监听 TCP 端口,利用 struct unpack 占位符,可以安全地从字节数据中反序列化为各个不同类型的数值,然后使用前端展示即可.

SCHEMA = [
("len", "<I"),
("state", "<I"),
("stats", "<12f"),
("fft", "<{len}f"),
("env", "<2f"),
]

8.6 分类

将频谱峰(平方)的最大值以及频谱峰(平方)在所有频段的占比作为基础特征,中段频谱作为正常运行的频谱峰范围,当频谱峰值不足时,则判定为没有运行.

static enum derive_state fft_classify(const float *fft, size_t len)
{
int i = 0;
int groups = len / 2;
size_t max_group = 0;
float max_power = 0.0f;
float total_power = 0.0f;
float ratio;

for (i = 1; i < groups; i++) {
float power = fft[2 * i + 0] * fft[2 * i + 0];
power += fft[2 * i + 1] * fft[2 * i + 1];
total_power += power;
if (power > max_power) {
max_power = power;
max_group = i;
}
}

ratio = max_power / total_power;

if (max_power <= 300) {
return DERIVE_OFF;
}

if (max_group <= 132 || max_group >= 200) {
return DERIVE_BLOCKED;
}

return DERIVE_ON;
}

9. PCB 设计与系统实现

为了将主控平台、传感器和无线通信模块组合成完整系统,本项目自行设计并制作了两层 PCB.

PCB 将 MAX32650FTHR、ESP-12F、BMI160 和 BME280 等模块连接起来,并提供传感器所需的电源、I2C 通信以及调试接口.

PCB 设计过程中重点考虑了 3.3 V 电源分配、去耦电容、I2C 信号连接以及 ESP-12F 天线区域的布局要求. 对于无线模块,其天线区域需要避免被 PCB 铜箔和其他金属结构遮挡,以减少对无线通信的影响.

两层板一般流程顺利的话 24 小时内就可以完工,算上物流的话最快 2 天就可以到手.

10. 总结

本项目完成了一个面向小型旋转机械的边缘振动监测系统. 系统以 MAX32650FTHR 为主控平台,通过 BMI160 采集 1600 Hz 三轴加速度数据,并以 512 点窗口进行时域和频域分析.

系统同时集成 BME280 环境传感器和 ESP-12F 无线通信模块,并通过自行设计的 PCB 将各模块组合为完整硬件系统.

通过手持风扇实验,分析不同运行状态和工作条件下振动信号的变化,并根据实际实验结果评估时域统计量、频谱特征以及状态识别方法的有效性.

后续工作可以进一步从传感器安装方式、采样参数、频域特征以及状态识别算法等方面改进系统,并扩大实验对象和实验条件,以验证方法在不同小型旋转机械上的适用性.

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