按键滤波算法

发布时间 2023-06-07 13:13:14作者: 颖风船

按键信号的采集通常采用GPIO口的输入电平方式,但由于按键电容充放的过程,通常会产生毛刺或抖动。为了去除这些干扰信号,需要对按键信号进行滤波。以下介绍几种常用的按键滤波算法:

1、稳态滤波算法:按键信号采集时,通过实现一个加权器,在采集的多次信号中加权平均每个采集值,一计算出有可靠信息含量的稳态信号。

// 稳态滤波算法
#define N 10 // 采样点数
uint8_t Get_Key_Val(void)
{
    uint8_t i, j, key_val;
    uint16_t adc_sum = 0;
    for (i = 0; i < N; i++)
    {
        adc_sum += ADC_Read();
        for (j = 0; j < 100; j++); // 等待一段时间
    }
    adc_sum /= N;
    if (adc_sum > 1000) key_val = 0; // 判断按键值
    else if (adc_sum < 100) key_val = 1;
    else key_val = 2;
    return key_val;
}

 

 

2、限幅滤波

按键信号采集时,若信号跳动在某一特定范围内,则取最大值或最小值为正确的采集值

// 限幅滤波算法
#define HighThreshold 1100 // 上限阈值
#define LowThreshold 100 // 下限阈值
uint8_t Get_Key_Val(void)
{
    uint16_t adc_val = ADC_Read();
    if (adc_val > HighThreshold) return 0; // 判断按键值
    else if (adc_val < LowThreshold) return 1;
    else return 2;
}

  

3、差分滤波:按键信号采集时,通过比较当前采集值和前一次采集值的差别,确定是否为一个有效的信号

// 差分滤波算法
uint16_t pre_val;
uint8_t Get_Key_Val(void)
{
    uint16_t adc_val = ADC_Read();
    uint8_t key_val;
    if (adc_val != pre_val) key_val = 2; // 发生变化
    else if (adc_val > 1000) key_val = 0; // 判断按键值
    else if (adc_val < 100) key_val = 1;
    else key_val = 2;
    pre_val = adc_val;
    return key_val;
}