1. 项目概述:ADC滤波在STM32F103中的关键作用
在嵌入式系统开发中,ADC(模数转换器)采集的稳定性直接影响整个系统的可靠性。STM32F103作为经典的Cortex-M3内核微控制器,其内置的12位ADC模块被广泛应用于各种工业控制、环境监测和消费电子领域。但实际工程中我们会发现,原始ADC采样值往往存在各种干扰:
- 电源纹波导致的周期性波动(50/100Hz工频干扰)
- 传感器本身的噪声(如热噪声、接触噪声)
- 电磁兼容问题引入的突发性尖峰
- 量化误差带来的最小±1LSB跳动
上周我在开发一款智能农业温湿度控制器时,就遇到了ADC采样值跳变导致继电器误动作的问题。当时采集的土壤湿度数据在真实值附近±5%范围内随机波动,直接使用原始数据会导致灌溉系统频繁启停。这就是我们需要深入探讨滤波算法的现实背景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 滤波算法选型:卡尔曼VS中位值
2.1 卡尔曼滤波的工程实现要点
卡尔曼滤波本质上是一种最优估计算法,它通过"预测-测量-修正"的递推过程,将系统动力学模型与噪声统计特性结合起来。在STM32上实现时需要注意:
c复制// 简化版卡尔曼滤波器结构体
typedef struct {
float Q; // 过程噪声协方差
float R; // 测量噪声协方差
float P; // 估计误差协方差
float K; // 卡尔曼增益
float X; // 系统状态(即滤波结果)
} KalmanFilter;
void Kalman_Init(KalmanFilter* kf, float Q, float R) {
kf->Q = Q;
kf->R = R;
kf->P = 1.0f;
kf->X = 0.0f;
}
float Kalman_Update(KalmanFilter* kf, float measurement) {
// 预测阶段
kf->P = kf->P + kf->Q;
// 更新阶段
kf->K = kf->P / (kf->P + kf->R);
kf->X = kf->X + kf->K * (measuremen
