1. 触摸按键的信号特性与滤波需求
在嵌入式系统中,触摸按键的实现通常基于电容感应原理。当手指接近触摸面板时,会改变电极与地之间的寄生电容,这个微小变化通过RC振荡电路转换为频率变化或通过ADC采样获取电压值。以STM32的触摸感应控制器(TSC)为例,其典型信号特征表现为:
- 基础噪声幅度:±5~20 LSB(12位ADC情况下)
- 有效信号幅度:30~100 LSB(取决于触摸面板设计)
- 干扰主要来源:50/60Hz工频干扰、开关电源噪声、环境电磁辐射
我曾在智能家居面板项目中实测发现,未滤波的原始ADC采样数据会出现约15%的误触发率。这种场景下,滑动滤波算法能有效提升信噪比(SNR),其核心价值体现在:
- 抑制突发性干扰:消除静电放电(ESD)等瞬时干扰的影响
- 平滑环境波动:补偿温度、湿度变化导致的基线漂移
- 保持响应速度:相比简单均值滤波,滑动方式具有更低的延迟
2. 滑动平均滤波的算法实现
2.1 基础滑动平均原理
滑动平均滤波(MAF)是最易实现的实时滤波方案,其数学表达为:
code复制y[n] = (x[n] + x[n-1] + ... + x[n-N+1]) / N
其中N为窗口大小。在STM32F103上的典型实现如下:
c复制#define FILTER_WINDOW 8
uint16_t filter_buffer[FILTER_WINDOW];
uint8_t filter_index = 0;
uint16_t sliding_filter(uint16_t raw_adc) {
filter_buffer[filter_index++] = raw_adc;
if(filter_index >= FILTER_WINDOW) filter_index = 0;
uint32_t sum = 0;
for(uint8_t i=0; i<FILTER_WINDOW; i++) {
sum += filter_buffer[i];
}
return (uint16_t)(sum / FILTER_WINDOW);
}
注意:窗口大小N需要根据采样率调整。经验值为信号周期的1.5-2倍,
