当前位置: 首页 > news >正文

告别数据抖动!用STM32F103RCT6和ADS1115实现高稳定电压采集的滤波实战

STM32F103RCT6与ADS1115高精度电压采集的噪声抑制实战

在工业传感器监测、电池管理系统等场景中,ADC采集的电压信号常因环境干扰出现微小波动。这种看似不起眼的"数据抖动",轻则导致显示数值闪烁,重则引发系统误判。本文将基于STM32F103RCT6与16位ADC芯片ADS1115的组合,深入解析五种实用滤波算法的实现与选型策略。

1. 硬件架构与噪声源分析

1.1 系统组成框架

典型的电压采集系统包含三个关键部分:

  • 传感器前端:温度、压力等传感器输出的模拟信号
  • 信号调理电路:通常包含分压、跟随、滤波等基础电路
  • ADC转换模块:ADS1115的差分输入范围可达±6.144V

注意:当ADDR引脚接地时,ADS1115的I2C地址固定为0x90,需在代码中明确定义

1.2 常见噪声类型对照表

噪声类型特征描述典型来源
热噪声宽带白噪声电阻元件发热
电源纹波周期性波动(50/100Hz)开关电源、电机干扰
量化噪声阶梯状误差ADC分辨率限制
交叉干扰突发性尖峰邻近信号线串扰

2. 基础滤波算法实现

2.1 滑动平均滤波

最易实现的滤波方法,适合处理高斯白噪声:

#define SAMPLE_SIZE 8 float movingAverage(float newSample) { static float buffer[SAMPLE_SIZE]; static uint8_t index = 0; static float sum = 0; sum -= buffer[index]; buffer[index] = newSample; sum += buffer[index]; index = (index + 1) % SAMPLE_SIZE; return sum / SAMPLE_SIZE; }

窗口大小选择经验

  • 快速变化信号:4-8点
  • 缓慢变化信号:16-32点
  • 功耗敏感场景:避免过大窗口

2.2 中位值平均滤波

结合中值滤波和平均滤波的优势,对脉冲噪声有较好抑制:

float medianAverageFilter(float samples[], uint8_t size) { float temp; // 冒泡排序 for(int i=0; i<size-1; i++) { for(int j=0; j<size-i-1; j++) { if(samples[j] > samples[j+1]) { temp = samples[j]; samples[j] = samples[j+1]; samples[j+1] = temp; } } } // 去除两端极值后求平均 float sum = 0; for(int k=1; k<size-1; k++) { sum += samples[k]; } return sum/(size-2); }

3. 进阶滤波技术

3.1 一阶滞后滤波

适合资源有限的实时系统,计算量极小:

#define ALPHA 0.2f // 滤波系数(0~1) float firstOrderFilter(float newSample) { static float lastValue = 0; lastValue = ALPHA * newSample + (1-ALPHA) * lastValue; return lastValue; }

系数调整技巧

  • α接近1:快速响应但滤波效果弱
  • α接近0:平滑性好但响应延迟明显
  • 电池电压监测推荐α=0.1~0.3

3.2 卡尔曼滤波简化实现

针对线性系统的高效估计算法:

typedef struct { float q; // 过程噪声协方差 float r; // 观测噪声协方差 float p; // 估计误差协方差 float k; // 卡尔曼增益 float x; // 系统状态 } KalmanFilter; float kalmanUpdate(KalmanFilter* kf, float measurement) { // 预测阶段 kf->p = kf->p + kf->q; // 更新阶段 kf->k = kf->p / (kf->p + kf->r); kf->x = kf->x + kf->k * (measurement - kf->x); kf->p = (1 - kf->k) * kf->p; return kf->x; }

提示:初次使用时建议q=0.001, r=0.1,再根据实际效果微调

4. 多算法性能对比测试

4.1 测试环境配置

使用信号发生器注入1Vpp正弦波叠加10mV噪声,通过STM32的USART输出原始数据与滤波结果:

# 最小化测试代码框架 while(1) { raw = ADS1115_Read(ADC_CH0); filtered = kalmanUpdate(&kf, raw); printf("%.3f,%.3f\n", raw*0.1875/1000, filtered*0.1875/1000); HAL_Delay(10); }

4.2 性能指标对比表

算法类型响应时间(ms)RAM占用(Byte)噪声抑制比代码复杂度
滑动平均<13260%★☆☆☆☆
中位值平均54075%★★☆☆☆
一阶滞后<1450%★☆☆☆☆
卡尔曼滤波22085%★★★☆☆
窗口加权平均36470%★★☆☆☆

5. 工程实践优化建议

5.1 采样率与滤波协同设计

ADS1115支持8SPS到860SPS的可编程数据速率,不同场景下的推荐配置:

  • 高速动态测量(如电机电流):

    • DR=860SPS
    • 配合滑动平均(窗口4-8点)
  • 精密静态测量(如温度监测):

    • DR=8SPS
    • 使用中位值平均+滞后滤波组合

5.2 异常值处理机制

在滤波前增加数据有效性检查:

#define VALID_RANGE 0.5f // 允许波动范围(V) float lastValidValue = 0; float safeFilter(float newSample) { if(fabs(newSample - lastValidValue) > VALID_RANGE) { return lastValidValue; // 保持上次有效值 } lastValidValue = movingAverage(newSample); return lastValidValue; }

实际项目中,将ADS1115的ALERT引脚连接到STM32的外部中断引脚,可以立即感知超限信号。这种硬件级的异常检测机制比软件轮询更加及时可靠。

http://www.cnnetsun.cn/news/2569089.html

相关文章:

  • SymPy符号计算入门:保真推导与工程化实践
  • 猫抓浏览器扩展:5分钟学会如何轻松捕获网页视频和音频资源
  • OpenStack对接Ceph后,镜像、云硬盘、虚拟机磁盘到底存哪儿了?一次讲清数据流向与排查技巧
  • 肿瘤样本SV检测翻车实录:我是如何用Delly搞定体细胞结构变异的(附正常-肿瘤配对分析全流程)
  • UE5数字孪生动态场景切换:状态同步与天气约束引擎实现
  • 55项实用功能:全面解锁炉石传说自定义体验
  • 别再死磕硬件了!用NI-MAX虚拟板卡5分钟搞定LabVIEW数字IO调试(附PCI6224配置)
  • 保姆级教程:在正点原子阿波罗H743上,为MicroPython扩展32M QSPI Flash和SDRAM(附完整源码)
  • AI代理零信任安全实践:基于动态证书的细粒度工具调用门控
  • Git reflog:本地操作录像机与数据恢复核心机制
  • AI智能体安全部署实践:基于Docker沙箱的隔离架构与配置详解
  • 深入Linux USB驱动框架:从虚拟主机控制器(vhci-hcd)看HCD与Platform驱动的交互设计
  • 湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?
  • Godot导向行为框架:用Steering Behaviors实现自然AI移动
  • Scala Traits 工程实践:组合性、线性化与可复用架构设计
  • 突破JS精度墙:曼德博集渲染器的平滑缩放与浮点数优化
  • ABAP老鸟复盘:一次由FUNCTION LVC_FILL_DATA_TABLE引发的ALV DUMP排查全记录
  • LLM API安全攻防实战:从提示词注入到自动化测试方案
  • 知识图谱重构AI Agent上下文管理:从线性序列到结构化语义网络
  • 告别手动启动!用ROS robot_upstart在Ubuntu 20.04上实现节点开机自启(保姆级教程)
  • AI邮件理解能力实测:163封真实邮件测试揭示当前技术边界与优化策略
  • Python基础语法:迭代器
  • ComfyUI-Manager终极指南:3个核心功能彻底解决AI工作流管理难题
  • Stable-Diffusion-NCNN img2img功能实战:如何使用图片引导AI创作艺术
  • 3分钟快速上手:跨平台资源下载神器res-downloader完整教程
  • 泛型应用举例:泛型嵌套
  • VSCode Markdown Mermaid 插件:在Markdown中轻松绘制专业图表
  • 魔兽地图开发终极指南:使用w3x2lni告别版本兼容性问题
  • 如何5分钟上手PyTorch-NPU/deberta_v3_large_zeroshot_v2.0:快速开始教程
  • 2026最新!5款免费实用b站视频解析神器,亲测真香,无套路不花一分钱!