Implementacja obsługi klawiatur pojemnościowych w LPC17xx firmy NXP
Wartości napięcia przetwarzane są następnie przez funkcję _processAdcReading(). Jeśli odczytany poziom napięcia jest większy niż wartość uzyskana podczas kalibracji powiększona o 6% przyjmuje się, że przycisk został naciśnięty (listing 8).
Listing 8.
/* process of adc reading */ /* readings are ordered per channel */ /* kpresses are ordered per kbd values */ #define UPPER_THR 8 #define LOWER_THR 3 static void _processAdcReading(ChannelIdType chNum) { uint32_t currentAvg = average[chNum]; uint32_t upperThreshold = currentAvg + (currentAvg*UPPER_THR)/100; uint32_t lowerThreshold = currentAvg + (currentAvg*LOWER_THR)/100; if (reading[chNum] > upperThreshold) //above(average+6%)->press condition { if (debounce[chNum] > 8) //debounce, 8 successive triggers for press { kbdPress[Ch2KpadMap[chNum]] = 1; //reached max, indicate pressed kPressCntr++; debounce[chNum] = 0; // now it is pressed } else debounce[chNum] ++; // still going toward max } else if(reading[chNum]not detected condition { debounce[chNum] --; } }
Przedstawiona powyżej idea jest bardzo prostą i wygodną metodą realizacji interfejsów użytkownika z klawiaturami pojemnościowymi. Implementacja sprzętowa wymaga minimalnej ilości elementów zewnętrznych, natomiast implementacja programistyczna wykorzystuje podstawowe peryferia mikrokontrolera oraz nie wymaga skomplikowanych obliczeń i przetwarzania danych w celu uzyskania informacji o stanie przycisków.
Omówiony kod źródłowy przeznaczony jest dla mikrokontrolerów NXP LPC17xx, jednak ze względu na swoją uniwersalność algorytm może zostać łatwo przeniesiony na inne platformy sprzętowe.
Literatura
[1] www.nxp.com AN11023 – Capacitive touch sensing using the LPC11xx, Rev. 1, 3 February 2011