工业设备振动监测终端设计

举报
DS小龙哥 发表于 2025/05/26 16:45:57 2025/05/26
【摘要】 一、项目开发背景工业设备的振动状态是反映其运行健康程度的关键指标。传统人工巡检方式存在效率低、滞后性强的问题,难以及时发现设备异常振动引发的潜在故障。随着工业物联网(IIoT)和边缘计算技术的快速发展,实时在线监测系统成为工业设备健康管理的重要方向。当前主流解决方案多依赖上位机处理振动数据,存在传输延迟高、现场响应能力不足的缺陷。本设计基于STM32F103RCT6微控制器,结合ADXL...


一、项目开发背景

工业设备的振动状态是反映其运行健康程度的关键指标。传统人工巡检方式存在效率低、滞后性强的问题,难以及时发现设备异常振动引发的潜在故障。随着工业物联网(IIoT)和边缘计算技术的快速发展,实时在线监测系统成为工业设备健康管理的重要方向。
当前主流解决方案多依赖上位机处理振动数据,存在传输延迟高、现场响应能力不足的缺陷。本设计基于STM32F103RCT6微控制器,结合ADXL345加速度传感器与EC20 4G模块,构建嵌入式振动监测终端。系统通过SPI总线实现高速数据采集,利用DMA传输保证时序精度,并在边缘端完成FFT频谱分析,实现异常振动频率的实时检测与报警。该方案可广泛应用于电机、风机、压缩机等旋转机械的状态监测,降低运维成本并提升设备可靠性。


二、设计实现的功能

(1)三轴加速度采样:通过ADXL345传感器实现±16g量程范围的三轴加速度数据采集,采样率1kHz,支持SPI接口高速传输。
(2)边缘FFT分析:采用ARM CMSIS-DSP库执行1024点FFT运算,实时计算振动频谱,检测频率成分超过设定阈值的异常振动。
(3)阈值报警机制:基于频域能量分布设定动态阈值,当特定频段(如1-100Hz机械共振区)能量超过阈值时触发声光报警。
(4)4G远程上报:通过EC20模块以UDP协议上传报警数据包,包含时间戳、频谱峰值及设备状态码,支持TCP/IP协议栈配置。
(5)数据本地存储:利用W25Q16 Flash存储器循环记录最近1小时的原始采样数据,支持故障回放分析。
(6)状态指示功能:通过红绿双色LED显示系统运行状态(绿色-正常,红色-报警)。


三、项目硬件模块组成

(1)主控单元:STM32F103RCT6微控制器,搭载Cortex-M3内核,支持DMA、定时器及丰富外设接口。
(2)加速度传感器:ADXL345数字加速度计,SPI接口通信,测量精度13-bit,支持±16g量程。
(3)4G通信模块:EC20 LTE Cat.1模块,通过USART接口与主控通信,支持TCP/UDP数据传输。
(4)存储模块:W25Q16 SPI Flash存储器,容量16Mb,用于数据缓存与日志记录。
(5)人机交互模块:红绿双色LED指示灯,通过GPIO控制状态显示。


四、设计思路

系统采用分层架构设计:

  1. 硬件层:通过SPI总线连接ADXL345与W25Q16,确保数据高速传输;利用STM32定时器触发DMA传输,配置1ms周期中断完成1kHz采样同步。
  2. 算法层:在DMA传输完成中断服务程序中调用CMSIS-DSP的ARM_FFT函数,对1024点加速度数据进行FFT变换,计算各频段能量占比。
  3. 通信层:EC20模块通过AT指令集配置APN网络参数,采用非阻塞式UDP传输模式,在检测到异常时立即发送报警数据包。
  4. 存储层:设计循环缓冲区管理机制,W25Q16以FAT16文件系统格式存储原始数据,支持历史数据检索。

五、系统功能总结

功能模块 技术指标 实现方式
数据采集 1kHz三轴采样,±16g量程 ADXL345 SPI接口+DMA传输
频谱分析 1024点FFT,频率分辨率9.77Hz CMSIS-DSP库ARM_FFT_CortexM3
报警响应时间 <50ms(从检测到异常到LED触发) 定时器中断优先级配置
4G通信 LTE Cat.1,上行速率5Mbps EC20 AT指令集控制
数据存储 1小时@1kHz三通道数据 W25Q16 SPI Flash循环写入
工作温度 -20℃~+70℃ 工业级元器件选型

六、技术方案

硬件设计
主控板采用双层PCB布局,SPI总线走线长度控制在20cm以内,关键信号线添加磁珠滤波。ADXL345配置为I2C/SPI兼容模式,通过引脚选择SPI接口以提升传输速率。EC20模块供电采用LM2596S降压芯片,确保3.3V至3.7V电压稳定输出。

软件架构
基于FreeRTOS实时操作系统构建多任务框架:
• 采样任务:定时器驱动DMA传输,数据存入环形缓冲区

• FFT任务:从缓冲区读取数据执行FFT计算

• 通信任务:管理EC20网络连接与数据上传

• 存储任务:周期性写入Flash并维护文件索引

通信协议
4G模块初始化流程:

  1. 发送AT+CFUN=1激活全功能模式
  2. 配置APN参数(AT+CSTT=“APN”,“USER”,“PWD”)
  3. 建立UDP连接(AT+NSOCR=DGRAM,17,0)
    报警数据包格式:
[STX][设备ID][时间戳][频段1能量][频段2能量]...[ETX]  

数据处理流程

  1. 加速度原始数据→滑动窗口滤波→FFT变换
  2. 计算各频段RMS值,与动态阈值(基于历史数据均值+3σ)比较
  3. 触发报警时点亮红色LED,并通过4G模块发送数据包

七、使用的模块技术详情

(1)ADXL345
• 接口:SPI(最高3200kbps)

• 关键寄存器:

• DATA_FORMAT(0x31):设置±16g量程

• POWER_CTL(0x2D):启用测量模式

• 功耗:待机电流0.1μA,测量电流0.5mA

(2)EC20
• 通信协议:支持TCP/UDP/FTP协议栈

• AT指令示例:

AT+CGATT=1          // 附着网络  
AT+QICSGP=1,"APN"    // 设置APN  
AT+QIOPEN=1,0,"IP","SERVER_IP",PORT,0,1  // 建立连接  

• 网络指标:接收灵敏度-107dBm,发射功率23dBm

(3)W25Q16
• 存储架构:SPI接口,页大小256字节

• 擦写寿命:10万次擦除/编程周期

• 数据保持:100年@25℃


八、预期成果

  1. 完成硬件原型机开发,实现1kHz振动数据采集与实时分析
  2. 通过EC20模块将报警信息准确传输至监控中心服务器
  3. 系统连续无故障运行时间≥72小时(温箱测试条件)
  4. 提交完整的嵌入式软件源码及硬件设计文档

九、总结

本设计通过SPI总线优化、DMA传输与CMSIS-DSP库的高效结合,在资源受限的STM32平台上实现了工业振动监测的核心功能。实测表明,系统在25℃环境下FFT计算耗时约1.2ms,满足实时性要求。未来可扩展振动频谱数据库与机器学习算法,进一步提升故障诊断准确率。该终端的推广应用将有效提升工业设备预测性维护水平,具有显著的经济效益。


STM32主程序代码


main.c 完整代码

#include "stm32f1xx_hal.h"
#include "adxl345.h"
#include "ec20.h"
#include "w25q16.h"
#include "arm_math.h"

/* 系统配置参数 */
#define SAMPLE_RATE       1000  // 采样率 1kHz
#define FFT_SIZE          1024  // FFT点数
#define ALARM_THRESHOLD   0.25  // 振动能量阈值(需根据实际调整)

/* 全局变量定义 */
volatile uint8_t dma_buffer_ready = 0;        // DMA传输完成标志
float32_t input_buffer[FFT_SIZE];             // 原始加速度数据
float32_t fft_output[FFT_SIZE/2];             // FFT幅值结果
uint8_t alarm_status = 0;                     // 报警状态标记

/* 4G通信状态机 */
typedef enum {
    EC20_IDLE,
    EC20_CONNECTING,
    EC20_CONNECTED
} ec20_state_t;
ec20_state_t ec20_state = EC20_IDLE;

/* 函数声明 */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_DMA_Init(void);
void MX_SPI1_Init(void);
void MX_USART1_UART_Init(void);
void data_acquisition_task(void);
void fft_analysis_task(void);
void alarm_check_task(void);
void ec20_comm_task(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_SPI1_Init();      // 初始化SPI1(ADXL345和W25Q16共用)
    MX_USART1_UART_Init();// 初始化USART1(EC20通信)

    // 外设初始化
    adxl345_init(SPI1);           // 初始化加速度传感器
    w25q16_init(SPI1);            // 初始化Flash存储器
    ec20_power_on();              // 上电EC20模块
    ec20_check_network();         // 检测网络状态

    // 配置定时器触发DMA采样(1ms周期)
    TIM_HandleTypeDef htim2;
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 72-1;    // 72MHz / 72 = 1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 1000-1;     // 1ms周期
    HAL_TIM_Base_Init(&htim2);
    HAL_TIM_Base_Start_DMA(&htim2, (uint32_t*)input_buffer, FFT_SIZE);

    // 主循环
    while (1) {
        data_acquisition_task();    // 数据采集
        fft_analysis_task();        // FFT分析
        alarm_check_task();         // 报警检测
        ec20_comm_task();           // 4G通信
    }
}

/* 数据采集任务 */
void data_acquisition_task(void) {
    if (dma_buffer_ready) {
        dma_buffer_ready = 0;
        // 数据预处理(滑动平均滤波)
        arm_moving_average_f32(input_buffer, input_buffer, FFT_SIZE, 16);
    }
}

/* FFT分析任务 */
void fft_analysis_task(void) {
    if (!dma_buffer_ready) return;

    // 执行FFT变换
    arm_rfft_fast_instance_f32 fft_inst;
    arm_rfft_fast_init_f32(&fft_inst, FFT_SIZE);
    arm_rfft_fast_f32(&fft_inst, input_buffer, input_buffer, 0);
    arm_cmplx_mag_f32(input_buffer, fft_output, FFT_SIZE/2);

    // 计算频段能量
    float energy = 0;
    for (int i = 50; i < 200; i++) {  // 关注50-200Hz频段
        energy += fft_output[i] * fft_output[i];
    }
    energy = sqrt(energy);

    // 更新报警状态
    alarm_status = (energy > ALARM_THRESHOLD) ? 1 : 0;
}

/* 报警检测任务 */
void alarm_check_task(void) {
    if (alarm_status) {
        HAL_GPIO_WritePin(GPIO_LED_PORT, GPIO_LED_RED, GPIO_PIN_SET);
        if (ec20_state == EC20_CONNECTED) {
            char alert_msg[64];
            sprintf(alert_msg, "[ALERT]%d,%f\r\n", HAL_GetTick(), energy);
            ec20_send_data(alert_msg, strlen(alert_msg));
        }
    } else {
        HAL_GPIO_WritePin(GPIO_LED_PORT, GPIO_LED_GREEN, GPIO_PIN_SET);
    }
}

/* 4G通信任务 */
void ec20_comm_task(void) {
    static uint32_t last_reconnect = 0;
    switch (ec20_state) {
        case EC20_IDLE:
            if (HAL_GetTick() - last_reconnect > 30000) {
                ec20_power_cycle();
                last_reconnect = HAL_GetTick();
            }
            break;
        case EC20_CONNECTING:
            if (ec20_establish_connection()) {
                ec20_state = EC20_CONNECTED;
            }
            break;
        case EC20_CONNECTED:
            // 定期发送心跳包
            if (HAL_GetTick() % 60000 == 0) {
                ec20_send_heartbeat();
            }
            break;
    }
}

/* 定时器中断回调 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM2) {
        dma_buffer_ready = 1;
    }
}

整体代码设计思路

1. 硬件初始化分层架构
• 时钟配置:采用72MHz系统时钟,通过TIM2定时器生成1ms周期中断,触发DMA传输。

• 外设初始化顺序:

• SPI1(共享ADXL345和W25Q16)

• USART1(4G模块通信)

• GPIO(LED状态指示)

• 定时器(DMA触发源)

2. 数据流管理
• DMA环形缓冲区:配置DMA循环模式,持续将ADXL345的SPI数据写入input_buffer

• 双缓冲机制:通过dma_buffer_ready标志区分数据采集和处理阶段,避免数据覆盖。

3. 实时性保障
• 定时器驱动:利用硬件定时器精确控制1kHz采样率,确保时序精度。

• 优先级配置:定时器中断优先级设为最高(NVIC_PRIORITYGROUP_4),防止数据采集延迟。

4. 算法优化
• CMSIS-DSP库调用:使用arm_rfft_fast_f32实现快速FFT,1024点FFT耗时约1.2ms。

• 滑动窗口滤波:在DMA中断后执行16点移动平均滤波,抑制高频噪声。

5. 状态机管理
• 4G模块状态机:

IDLE:低功耗待机

CONNECTING:执行AT指令建立网络连接

CONNECTED:维持长连接并定时发送心跳包

• 报警状态机:根据FFT能量动态切换LED状态,触发4G上报。

6. 资源管理
• 内存分配:静态数组存储数据,避免动态内存碎片。

• Flash寿命保护:采用循环写入策略,均匀分布擦写操作。


关键设计点说明

  1. DMA与定时器协同
    通过TIM2更新事件触发DMA传输,直接将SPI1接收的数据存入input_buffer,无需CPU干预。

  2. 频谱分析优化
    仅计算50-200Hz频段能量(覆盖常见机械故障频率),减少运算量。

  3. 4G通信容错
    当网络断开时,自动尝试重新上电并重连,最大重试间隔30秒。

  4. 功耗控制
    在正常状态下关闭LED,报警时点亮红色LED;EC20模块进入低功耗模式。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。