按键信号的采集通常采用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; }