按鍵濾波算法
按鍵信號的采集通常采用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;
}

浙公網安備 33010602011771號