32 bity jak najprościej - STM32F0. Obsługa pól dotykowych. cz. 6

32 bity jak najprościej - STM32F0. Obsługa pól dotykowych. cz. 6
Pobierz PDF Download icon
Wybrane modele mikrokontrolerów serii STM32F0 są wyposażone w moduł sprzętowy umożliwiający współpracę z polami dotykowymi. We współczesnych systemach mikrokomputerowych taki interfejs użytkownika jest atrakcyjną alternatywą dla tradycyjnych przycisków, oferując w porównaniu z nimi większą niezawodność, odporność mechaniczną i niższy koszt realizacji. W kolejnym odcinku serii przedstawiony zostanie przykład nieblokującej obsługi pól dotykowych zrealizowany na płytce z serii Discovery z mikrokontrolerem STM32F072.

Realizowane w mikrokontrolerach sterowniki obsługujące pola dotykowe działają na zasadzie pomiaru pojemności pomiędzy elektrodą i masą układu. Rozwiązania poszczególnych producentów różnią się metodą pomiaru pojemności i stopniem jej automatyzacji.

W mikrokontrolerach serii STM32F0 zastosowano metodę transferu ładunku - pomiar pojemności elektrody dotykowej jest realizowany poprzez wielokrotne ładowanie pojemności tworzonej przez elektrodę dotykową i zliczanie cykli transferu ładunku z elektrody dotykowej do kondensatora gromadzącego ładunek potrzebnych do naładowania kondensatora do określonego napięcia.

Elektryczne aspekty projektowania pól dotykowych zostały szczegółowo omówione w notach aplikacyjnych AN2869 i AN4312, dostępnych w serwisie internetowym firmy ST Microelectronics. Projektując urządzenie z interfejsem dotykowym należy zapoznać się szczegółowo z zasadami projektowania pól dotykowych i prowadzenia połączeń na płytce drukowanej, gdyż mają one decydujące znaczenie dla czułości i poprawności działania pól.

Interfejs dotykowy w STM32F0

Listing 1 - plik stm32f0discovery.h

Sterownik interfejsu dotykowego TSC zaimplementowany w mikrokontrolerach STM32F0 może obsłużyć do 24 pól w 8 grupach. Każda grupa ma do czterech wyprowadzeń zewnętrznych, z których jedno (dowolnie wybrane przez projektanta sprzętu) służy do podłączenia kondensatora gromadzącego ładunek, a pozostałe - do podłączenia elektrod dotykowych.

Całkowita liczba pól obsługiwanych przez poszczególne modele mikrokontrolerów zależy od dostępności linii portów w obudowie mikrokontrolera. W jednym cyklu pomiarowym sterownik może zmierzyć pojemność jednego pola w każdej grupie. Liczba używanych grup zależy od decyzji projektanta na przykład, jeśli w urządzeniu są trzy pola, to można użyć jednej grupy (co skutkuje koniecznością sekwencyjnego testowania stanu poszczególnych pól, ale za to wymaga użycia tylko jednego kondensatora) lub trzech grup (dzięki czemu będzie możliwe testowanie stanu pól w jednym cyklu pomiarowym, ale niezbędne będą trzy kondensatory do gromadzenia ładunku).

Kondensator gromadzący ładunek ma typowo wartość 47 nF. Każda elektroda jest dołączona do mikrokontrolera przez rezystor zabezpieczający o typowej wartości 10 kV.

Do obsługi pól dotykowych służy blok TSC (Touch Sense Controller). Po skonfigurowaniu parametrów pracy i wybraniu jednego wejścia z każdej grupy pól oprogramowanie inicjuje pomiar pojemności. Dalsze czynności są wykonywane przez sprzęt - następuje seria cykli ładowania elektrod dotykowych i przelewania ładunku do kondensatorów.

W każdym cyklu są inkrementowane liczniki cykli aktywnych grup. Proces ten jest powtarzany do osiągnięcia określonego napięcia na kondensatorze; licznik cykli grupy jest w tym momencie zatrzymywany. Proces pomiaru kończy się z chwilą osiągnięcia napięcia progowego na kondensatorach wszystkich aktywnych grup lub po osiągnięciu maksymalnej wartości liczników określonej przez oprogramowanie.

Zakończenie pomiaru może powodować zgłoszenie przerwania. Moduł TSC rozróżnia dwie przyczyny przerwań - pomyślne zakończenie pomiaru i przekroczenie maksymalnej liczby cykli, którym odpowiadają dwa bity znaczników w rejestrze TSC->ISR: EOA (End Of Acquisition) i MCE (Maximum Count Error).

Po zakończeniu akwizycji oprogramowanie może odczytać wartości liczników cykli, dostępnych w postaci wektora TSC->IOGXCR[].

Określanie stanu pola dotykowego

Listing 2. Program demonstracyjny

Sama wartość odczytana z rejestru IOGXCR nie niesie bezpośredniej informacji o tym, czy pole zostało dotknięte. Istnieje wiele możliwości konstruowania pól dotykowych i ich zespołów - mogą one zastępować niezależne przyciski albo suwaki lub pokrętła.

W tym drugim, bardziej złożonym przypadku oprogramowanie musi określić, o ile bieżąca pojemność poszczególnych pól różni się od ich pojemności w stanie nieaktywnym i na tej podstawie wyliczyć pozycję palca. Firma ST Microelectronics oferuje gotową, rozbudowaną bibliotekę programową do obsługi różnego rodzaju interfejsów dotykowych.

W naszym przykładzie zajmiemy się pierwszym, prostszym przypadkiem - niezależnymi przyciskami. Wykrycie dotknięcia polega w tym przypadku na rozpoznaniu skoku pojemności pola dotykowego. Wartość pojemności elektrycznej pola reprezentowana przez licznik cykli transferu ładunku zależy od wielu czynników, w tym wykonania egzemplarza urządzenia i wilgotności otoczenia.

Pojemności pól mogą zmieniać się podczas pracy urządzenia. Wiarygodne wykrycie dotknięcia nie może więc opierać się na prostym porównaniu wartości licznika cykli ze znaną z góry wartością. Podczas pracy urządzenie musi ciągle kalibrować odczyty. Można zrobić to na wiele sposobów. Technika zastosowana w bibliotece ST jest złożona i kosztowna obliczeniowo. Celem prezentowanego projektu było przedstawienie prostej obsługi interfejsu dotykowego, nieangażującej znacząco czasu procesora i możliwej do realizacji w przerwaniu.

W oprogramowaniu zastosowano prostą technikę filtra dolnoprzepustowego. Uśredniona wartość wyniku pomiaru jest aktualizowana w każdym cyklu akwizycji. Naciśnięcie pola jest wykrywane, gdy wynik pomiaru odbiega znacząco od wartości uśrednionej.

Przykład dla płytki STM32F072BDISCOVERY

Listing 2. c.d.

Przykładowy projekt oprogramowania został zrealizowany na płytce 32F072BDISCOVERY. Dostępne na płytce pola dotykowe są obsługiwane w programie jako trzy niezależne przyciski. Ponieważ pola na płytce zostały zaprojektowane do symulacji suwaka, zachodzą on na siebie, co niekiedy skutkuje równoczesnym wykryciem naciśnięcia dwóch sąsiednich pól. Dwie skrajne strefy suwaka stanowią jedną, wspólną elektrodę dotykową. Na płytce Discovery każde pole należy do innej grupy, więc jest możliwy równoczesny pomiar ich pojemności.

Projekt oprogramowania, przygotowany w środowisku Keil MDK-ARM, nosi nazwę Touch i jest dostępny w aktualnej wersji zestawu programów przykładowych, dostępnych na serwerze EP w postaci pliku archiwum F0tutorial-xxx.zip.

Program realizuje funkcję trzech wyłączników bistabilnych, sterujących świeceniem trzech spośród czterech diod LED dostępnych na płytce. Kolejne naciśnięcia poszczególnych pól powodują naprzemienne włączanie i wyłączanie odpowiadających im diod. Czwarta, czerwona dioda służy do sygnalizacji wykrycia naciśnięcia któregokolwiek z pól. Wszystkie diody są sterowane przebiegami PWM generowanymi przez timer TIM3. Przerwanie timera służy do płynnego rozjaśniania i ściemniania diod. Mikrokontroler pracuje z zegarem wewnętrznym o częstotliwości 8 MHz. Obsługa pól dotykowych jest realizowana całkowicie w przerwaniu TSC. Program nie zawiera pętli zdarzeń.

Plik stm32F0discovery.h został rozszerzony o definicje potrzebne dla płytki STM32F072BDISCO, w tym o przypisania diod LED do kanałów timera TIM3 oraz o wartości rejestrów TSC służące do konfiguracji linii interfejsu dotykowego.

Inicjowanie mikrokontrolera

Pierwszą czynnością w ramach sekwencji inicjującej jest włączenie używanych peryferiali - portów GPIO i modułu TSC oraz timera TIM3. Następnie następuje przyporządkowanie linii portów do peryferiali - linie sterujące diodami LED zostają skojarzone z wyjściami PWM timera, a linie pól dotykowych i kondensatorów gromadzących ładunek - z wyprowadzeniami TSC. Kolejnym etapem jest zainicjowanie sterownika TSC. Przy programowaniu rejestrów konfiguracyjnych TSC posługujemy się oznaczeniami linii TSC, mającymi postać Gx_IOy, gdzie x jest numerem grupy (1..8), a y - numerem linii w grupie (1..4). W celu uruchomienia modułu TSC należy kolejno:

  • Włączyć moduł interfejsu dotykowego ustawiając bit TSCEN w rejestrze AHBENR.
  • Ustawić w rejestrach AFR portów GPIOA i GPIOB funkcję interfejsu dotykowego (AF3) dla linii PA2, PA3, PA6, PA7, PB0 i PB1.
  • Ustawić w rejestrach MODER funkcję AF dla wymienionych linii.
  • W rejestrze TSC->IOSCR wybrać linie, do których są podłączone kondensatory gromadzące ładunek - G3_IO3, G2_IO4, G1_IO4.
  • W rejestrze TSC->IOCCR wybrać linie odpowiadające polom dotykowym - G3_IO2, G2_IO3, G1_IO3.
  • W rejestrze TSC->IOGCSR wybrać aktywne grupy - G3, G2, G1.
  • Wyłączyć histerezę wejść odpowiadających liniom używanym przez TSC - rejestr TSC->IOHCR.
  • Włączyć możliwość zgłaszania przerwań od zakończenia zliczania i przekroczenia zakresu - rejestr TSC->IER.
  • Ustawić parametry akwizycji i uaktywnić moduł TSC poprzez zapis do rejestru TSC->CR. Parametry akwizycji zostały dobrane następująco:
  • podział częstotliwości zegara - 8 (okres zegara TSC równy 1 µs),
  • czasy ładowania i transferu ładunku - po 2 µs,
  • maksymalna wartość licznika cykli: 16383.

Przerwania z TSC będą zgłaszane po zakończeniu każdej sekwencji akwizycji, nie rzadziej niż co 64 ms (w praktyce - kilkukrotnie częściej).

Po zaprogramowaniu TSC następuje zaprogramowanie timera TIM4, który będzie zgłaszał przerwania z częstotliwością odpowiadającą częstotliwości PWM - 400 Hz.

Na końcu sekwencji inicjującej następuje włączenie przerwań w module NVIC oraz włączenie usypiania procesora po wyjściu z obsługi przerwania. Po zainicjowaniu urządzenia wykonywane będą tylko dwie procedury obsługi przerwań.

Detekcja stanu pola

Do analizy stanu pola dotykowego i detekcji jego naciśnięcia służy procedura process_touch() wywoływana z procedury obsługi przerwania TSC. Procedurę napisano w sposób umożliwiający wielofazową akwizycję stanu dowolnej liczby pól w każdej grupie. W naszym przykładzie mamy do czynienia z akwizycją jednofazową - po jednym polu z każdej grupy.

Z każdym polem dotykowym jest związana struktura danych zawierająca:

  • przefiltrowaną sumę pomiarów avg, z której przez przesunięcie bitowe można uzyskać uśrednioną wartość pomiaru.
  • rejestr ostatnich ośmiu stanów pola dotykowego state,
  • Znacznik wykrycia naciśnięcia pola det.

Procedura pobiera wartość licznika cykli transferu, porównuje ją z wartością uśrednioną i aktualizuje wartość uśrednioną. Ponieważ wykrycie naciśnięcia pola wymaga widocznego skoku wartości, w celu zmniejszenia liczby wykonywanych operacji zmieniono ich kolejność, eliminując potrzebę obliczania progu wykrycia naciśnięcia - najpierw wartość uśredniona jest pomniejszana o stały jej ułamek (co jest częścią obliczeń potrzebnych przy filtrowaniu), następnie jest wykonywane porównanie nowego odczytu z tak zmniejszoną wartością średniej, po czym średnia jest aktualizowana przez dodanie nowego odczytu. Wynik porównania w postaci jednego bitu jest wsuwany do rejestru state. Wykrycie na podstawie zawartości tego rejestru zmiany stanu pola powoduje ustawienie znacznika det i zaświecenie czerwonej diody LED, która zostanie wyłączona po upływie określonego czasu.

Obsługa przerwania TSC

Obsługa przerwania TSC rozpoczyna się od wyzerowania znaczników przerwań. Następnie dla każdego z obsługiwanych pól dotykowych jest wywoływana procedura analizy stanu pola process_touch(). Sekwencja instrukcji if() bada wartości znaczników naciśnięcia poszczególnych pól, a w przypadku wykrycia naciśnięcia zmienia stany odpowiadających im diod i zeruje znaczniki. Na końcu obsługi przerwania następuje zainicjowanie kolejnego cyklu akwizycji stanu pól.

Obsługa przerwania timera TIM3

Procedura obsługi przerwania timera służy do gaszenia diody sygnalizującej moment naciśnięcia przycisku oraz do sterowania płynną zmianą jasności wszystkich diod. Sterowanie jasnością następuje na podstawie porównania wartości pól struktury target, zawierającej zadane wartości jasności, z bieżącymi wartościami jasności przechowywanymi w rejestrach CCRx timera.

Podsumowanie

Przedstawiony przykład ilustruje prostą i niewymagającą czasochłonnych obliczeń metodę obsługi przycisków dotykowych, możliwą do realizacji w postaci nieblokującej -wyłączenie przy użyciu przerwań. Biorąc pod uwagę prostotę oprogramowania, pola dotykowe mogą stanowić nie tylko atrakcyjną metodę interakcji z użytkownikiem, lecz także zastępować przyciski służące do włączania funkcji diagnostycznych urządzenia, umożliwiając dzięki rezygnacji z elementów mechanicznych (przycisków, zwor) obniżenie kosztów i wymiarów urządzenia.

Grzegorz Mazur

Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2014
DO POBRANIA
Pobierz PDF Download icon
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik czerwiec 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio lipiec 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje czerwiec 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna czerwiec 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich czerwiec 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów