工业设备振动监测终端设计
一、项目开发背景
工业设备的振动状态是反映其运行健康程度的关键指标。传统人工巡检方式存在效率低、滞后性强的问题,难以及时发现设备异常振动引发的潜在故障。随着工业物联网(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控制状态显示。
四、设计思路
系统采用分层架构设计:
- 硬件层:通过SPI总线连接ADXL345与W25Q16,确保数据高速传输;利用STM32定时器触发DMA传输,配置1ms周期中断完成1kHz采样同步。
- 算法层:在DMA传输完成中断服务程序中调用CMSIS-DSP的ARM_FFT函数,对1024点加速度数据进行FFT变换,计算各频段能量占比。
- 通信层:EC20模块通过AT指令集配置APN网络参数,采用非阻塞式UDP传输模式,在检测到异常时立即发送报警数据包。
- 存储层:设计循环缓冲区管理机制,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模块初始化流程:
- 发送AT+CFUN=1激活全功能模式
- 配置APN参数(AT+CSTT=“APN”,“USER”,“PWD”)
- 建立UDP连接(AT+NSOCR=DGRAM,17,0)
报警数据包格式:
[STX][设备ID][时间戳][频段1能量][频段2能量]...[ETX]
数据处理流程
- 加速度原始数据→滑动窗口滤波→FFT变换
- 计算各频段RMS值,与动态阈值(基于历史数据均值+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℃
八、预期成果
- 完成硬件原型机开发,实现1kHz振动数据采集与实时分析
- 通过EC20模块将报警信息准确传输至监控中心服务器
- 系统连续无故障运行时间≥72小时(温箱测试条件)
- 提交完整的嵌入式软件源码及硬件设计文档
九、总结
本设计通过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寿命保护:采用循环写入策略,均匀分布擦写操作。
关键设计点说明
-
DMA与定时器协同
通过TIM2更新事件触发DMA传输,直接将SPI1接收的数据存入input_buffer
,无需CPU干预。 -
频谱分析优化
仅计算50-200Hz频段能量(覆盖常见机械故障频率),减少运算量。 -
4G通信容错
当网络断开时,自动尝试重新上电并重连,最大重试间隔30秒。 -
功耗控制
在正常状态下关闭LED,报警时点亮红色LED;EC20模块进入低功耗模式。
- 点赞
- 收藏
- 关注作者
评论(0)