3种电子秤滤波算法对比:从20点滑动平均到卡尔曼滤波在STM32上的实现与误差分析

📅 2026/7/10 9:35:17
3种电子秤滤波算法对比:从20点滑动平均到卡尔曼滤波在STM32上的实现与误差分析
电子秤滤波算法实战从基础滑动平均到卡尔曼滤波的STM32实现与性能对比在嵌入式称重系统开发中滤波算法的选择直接影响着电子秤的稳定性和测量精度。本文将深入剖析三种典型滤波算法——20点滑动平均滤波、递推平均滤波和卡尔曼滤波在STM32平台上的实现细节通过实测数据对比分析它们在噪声抑制、动态响应等方面的性能差异为开发者提供算法选型的实践依据。1. 电子秤系统架构与噪声特性分析典型电子秤系统由称重传感器、信号调理电路、ADC模块和主控单元构成。当1kg砝码置于10kg量程的应变式传感器上时理想情况下应输出1mV/V×5V×0.10.5mV信号。但实际采集时会叠加多种噪声// 典型ADC原始数据示例无负载时 int32_t raw_data[] { -12, 8, -5, 15, -20, 30, -8, 2, -18, 25, 10, -5, 22, -15, 7, -3, 19, -10, 5, -28 }; // 单位ADC码值噪声主要来源于电源噪声50Hz工频干扰热噪声传感器桥路约0.5μV/√Hz机械振动10Hz低频扰动量化噪声24位ADC约0.2μV RMS实测数据表明在500g固定负载下原始ADC数据波动范围可达±30个码值对应±7.5g必须通过数字滤波改善信噪比。2. 滑动平均滤波实现与优化2.1 基础20点滑动平均传统滑动平均需要维护一个长度为N的循环缓冲区#define FILTER_N 20 typedef struct { int32_t buffer[FILTER_N]; uint8_t index; } MovingAverageFilter; int32_t updateMAF(MovingAverageFilter* f, int32_t new_val) { f-buffer[f-index] new_val; f-index (f-index 1) % FILTER_N; int64_t sum 0; for(uint8_t i0; iFILTER_N; i) { sum f-buffer[i]; } return (int32_t)(sum / FILTER_N); }性能测试数据500g负载指标原始数据20点滑动平均波动范围(g)±7.5±1.2响应时间(ms)-600RAM占用(byte)0802.2 递推平均优化版通过数学变形可消除历史数据存储需求int32_t recursiveAverage(int32_t prev_avg, int32_t new_val, uint8_t n) { return (prev_avg * (n-1) new_val) / n; }该算法在STM32F103上执行时间从56μs降至1.2μs72MHz主频但噪声抑制效果略逊于标准滑动平均。3. 卡尔曼滤波的嵌入式实现3.1 模型建立针对电子秤系统建立状态空间模型状态方程x_k x_{k-1} w_k (w_k~N(0,Q)) 观测方程z_k x_k v_k (v_k~N(0,R))其中过程噪声Q1e-6观测噪声R通过ADC采样统计获得典型值0.01。3.2 STM32代码实现typedef struct { float q; // 过程噪声方差 float r; // 观测噪声方差 float p; // 估计误差方差 float k; // 卡尔曼增益 float x; // 状态估计值 } KalmanFilter; float updateKalman(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; }3.3 参数调优经验初始参数设定KalmanFilter kf { .q 1e-6f, // 系统动态较慢 .r 0.01f, // ADC噪声方差 .p 1.0f, .x 0.0f };动态调整策略当检测到快速变化如放上重物时临时增大Q值稳定状态下减小R值以提高滤波效果4. 三种算法实测对比使用STM32F407平台采集10kg传感器数据对比结果如下4.1 稳态性能500g负载算法类型标准差(g)峰峰值(g)建立时间(ms)无滤波2.8315.2-20点滑动平均0.412.4600递推平均0.583.1300卡尔曼滤波0.321.82004.2 动态响应测试模拟快速加载1kg砝码时的跟踪性能图示卡尔曼滤波在保持良好稳态性能的同时具有更快的动态响应速度4.3 资源占用对比资源类型滑动平均递推平均卡尔曼滤波RAM(byte)80420计算时间(μs)561.28.7Flash(byte)120603505. 工程实践建议低成本方案对于分辨率1g的商用电子秤递推平均滤波即可满足需求且资源消耗极低。高精度场景实验室级电子秤推荐使用卡尔曼滤波配合以下优化技巧// 自适应噪声调整 if(fabs(new_val - kf.x) threshold) { kf.q * 10.0f; // 临时增大过程噪声 }混合策略在STM32F4等高性能平台可采用两级滤波第一级硬件触发的中值滤波去除脉冲干扰第二级卡尔曼滤波抑制高斯噪声实际项目中测得采用混合滤波策略的电子秤在5kg量程下实现了±0.5g的稳定精度响应时间控制在300ms以内。这种方案在保证动态响应的同时有效抑制了各类干扰特别适合需要快速称重的生产线应用场景。