Kurs STM32 LL cz. 13. Wstęp do konwertera ADC

Przetwornik ADC (Analog-to-Digial Converter) to układ elektroniczny, który służy do zamiany sygnału analogowego na cyfrowy. Stosowany jest szeroko w aplikacjach i pozwala m.in. na odczyt napięcia generowanego przez czujniki analogowe czy pomiar napięcia na akumulatorze.

Konwersja sygnału analogowego na cyfrowy

W mikrokontrolerach STM32 wbudowany został przetwornik SAR (z sukcesywną aproksymacją), który działa na zasadzie porównywania wartości napięcia wejściowego z napięciem odniesienia. Odbywa się to w iteracyjnym procesie, gdzie ustawiane są kolejne bity, a otrzymana wartość jest porównywana do zmierzonego napięcia. Układ z pomocą komparatora dąży do uzyskania wartości najbardziej zbliżonej do tej zmierzonej.

Proces konwersji składa się z trzech etapów: próbkowania, kwantyzacji oraz kodowania.

Próbkowanie polega na pobraniu i zapamiętaniu wartości napięcia w celu dalszego przetwarzania. Zbudowany jest z przełącznika, który przekazuje napięcie wejściowe na układ rezystor-kondensator. Czas zamknięcia przełącznika jest określany jako czas próbkowania, który konfigurujemy w przetworniku. Nie może być zbyt krótki, ponieważ kondensator potrzebuje odpowiedniego czasu, aby się naładować.

Następnie sygnał jest poddawany kwantyzacji. Zadaniem jest otrzymanie na podstawie zmierzonego sygnału wartości cyfrowej najbardziej zbliżonej do tego, co jest na wejściu. Nigdy nie otrzymamy wartości cyfrowej napięcia idealnie równej zmierzonemu. Im większa rozdzielczość, tym większa będzie dokładność pomiaru.

Proces kwantyzacji składa się z cyklicznego algorytmu:

  1. Ustawiany jest najstarszy bit.
  2. Wartość cyfrowa przetwarzana jest przez konwerter cyfrowo-analogowy.
  3. Napięcie uzyskane w ten sposób porównywane jest przez komparator z napięciem pobranym w procesie próbkowania.
  4. Jeżeli uzyskane napięcie jest wyższe niż zmierzone, bit pozostaje ustawiony. Jeżeli jest mniejsze, bit jest zerowany.
  5. Ustawiany jest kolejny bit i cała procedura się powtarza.

Cykl wykonywany jest tyle razy, ile bitów rozdzielczości skonfigurowaliśmy – dla 12-bitowego przetwarzania proces będzie miał 12 takich cykli.

Fragment procesu próbkowania i kwantowania przedstawiony został na grafice poniżej.

Kodowanie polega na ustawieniu uzyskanej wartości cyfrowej w odpowiedni sposób w rejestrze. W STM32 mamy możliwość wyboru 6, 8, 10 lub 12 bitów rozdzielczości, a rejestr danych jest 16-bitowy. Dane możemy w procesie kodowania wyrównać do lewej lub do prawej.

Czas konwersji ADC

Z procesem próbkowania i kwantyzacji ściśle związany jest czas konwersji ADC. W STM32 określa się go w cyklach zegara jako:

tCONV = Sampling_time + 12,5 ADC_clock_cycle

Sampling time to czas próbkowania i jest konfigurowany poprzez odpowiednie rejestry. Wartość 12,5 cykli to czas kwantyzacji przy rozdzielczości 12-bitowej. Zmniejszając rozdzielczość możemy uzyskać jeszcze krótszy czas konwersji.

Należy pamiętać, że im krótszy czas próbkowania, tym mniejsza dokładność pomiaru. Zbyt mały czas może powodować nie tylko problemy z uzyskaniem precyzyjnego pomiaru, ale także z obsługą np. przerwań, które będą bardzo często generowane.

Ze względu na ograniczenia sprzętowe, konwerter ADC może być taktowany maksymalnie z częstotliwością 35 MHz, co daje minimalny czas konwersji przy 12-bitach rozdzielczości na poziomie 400 ns. Czas ten można skrócić przy 6 bitach rozdzielczości do 229 ns. Rzadko będziemy jednak korzystali z krytycznych czasów konwersji. Wymagają one stabilnego obwodu analogowego na PCB, a zazwyczaj czas konwersji w standardowych aplikacjach może być znacznie dłuższy.

Budowa konwertera ADC

Teraz przejdź do budowy i elementów przetwornika ADC w STM32. Schemat blokowy przedstawia poniższa grafika.

Przetwornik ADC w STM32G071RB pozwala na konwersję 16 kanałów zewnętrznych wejść analogowych oraz 3 kanałów wewnętrznych, w tym z czujnika temperatury, napięcia odniesienia i napięcia na pinie zasilania bateryjnego. Konwersja wywoływana jest programowo lub za pomocą zewnętrznego wyzwalacza. Może nim być sygnał z timera.

Blok SAR ADC to moduł właściwego przetwornika ADC (z sukcesywną aproksymacją), który odpowiada za konwersję sygnału analogowego na cyfrową wartość. Dane z bloku SAR przekazywane są na szynę APB, która komunikując się przez AHB z jednostką centralną lub blokiem DMA przekazuje dane do pamięci i pozwala na odczyt ich przez aplikację.

Konwerter ADC ma również funkcjonalność Watchdoga, który może monitorować stan napięcia i w momencie przekroczenia ustawionych progów generować sygnał przerwania.

Tryby pracy konwertera ADC

Konwerter ADC może pracować w różny sposób w zależności od wymagań aplikacji i użytkownika. Wśród trybów pracy ADC wyróżniamy:

  • Single conversion mode – tryb pojedynczej konwersji
  • Continuous conversion mode – tryb ciągłej konwersji
  • Discontinuous conversion mode – tryb nieciągłej konwersji

Na początku wyjaśnimy sobie, w jaki sposób ustawiane są w konwerterze ADC sekwencje konwersji. Ze względu na to, że przetwornik ADC jest dość drogim elementem, w mikrokontrolerze mamy do dyspozycji zazwyczaj jeden lub dwa konwertery ADC. Aby umożliwić odczyt sygnałów analogowych z większej ilości wejść (jak już wspominałem, w STM32G071RB jest 16 kanałów zewnętrznych), dodany jest do konwertera multiplekser, który przełącza kolejne kanały i podaje je na wejście przetwornika SAR

Użytkownik może wybrać jeden lub kilka kanałów do tzw. sekwencji, w której wykonywana jest jedna konwersja na każdym z aktywowanych kanałów. W trybie Single blok ADC po otrzymaniu startu konwersji (programowego lub z zewnętrznego wyzwalacza) wykonuje jedną sekwencję

W przypadku trybu Continuous konwersja jest wykonywana cyklicznie – po zakończeniu pomiarów w jednej sekwencji od razu następuje uruchomienie kolejnej

Tryb Discontinuous jest dostępny w przypadku, gdy sekwencja zawiera więcej niż jeden kanał. Wówczas pomiar na każdym kanale w sekwencji będzie wymagał oddzielnego sygnału startu (np. jeżeli sekwencja składa się z 4 kanałów, do wykonania jednej sekwencji będą potrzebne 4 sygnały startu).

W przypadku zakończenia konwersji, użytkownik może otrzymać informację w postaci flagi lub przerwania po wykonaniu konwersji pojedynczego kanału (EOC, End of conversion) lub po zakończeniu konwersji całej sekwencji (EOS, End of conversion sequence).

Wyrównanie danych w ADC

Dane otrzymane z konwersji ADC będą zależały od rozdzielczości. W STM32 mamy do dyspozycji 6, 8, 10 lub 12-bitową rozdzielczość. Rejestr danych przechowujący wartość otrzymaną z pomiaru jest 16-bitowy, dlatego możemy zdecydować, czy dane będą wyrównane do prawej, czy do lewej strony. W zależności od ustawienia bitu ALIGN i konfiguracji rozdzielczości (RES), możemy otrzymać wyrównanie w sposób przedstawiony na poniższej grafice.

Konfiguracja kanałów ADC

Konwerter ADC w STM32G071RB ma możliwość konfiguracji konwertowanych kanałów na dwa sposoby. Określane są jako konfiguracja stała (fixed) lub w pełni konfigurowalna (fully configurable). Za konfigurację używanych kanałów odpowiada tzw. sekwencer

W trybie stałej konfiguracji mamy możliwość włączenia każdego z 19 kanałów dostępnych w konwerterze ADC. Nie mamy możliwości wyboru kolejności ich konwersji – pomiar odbywa się na włączonych kanałach w kolejności, jaką ustalają numery kanałów.

W trybie pełnej konfiguracji możemy wybrać, w jakiej kolejności odbywa się konwersja włączonych kanałów. Jest jednak spore ograniczenie – możemy umieścić na liście maksymalnie 8 kanałów.

Podstawowe rejestry ADC

Rejestr ADC_ISR – flagi ADC

Bit CCRDY – flaga konfiguracji kanałów ADC

Bit EOC i EOS – flagi zakończenia konwersji i sekwencji

Bit ADRDY – flaga uruchomienia ADC i gotowości do pracy

Rejestr ADC_CR – rejestr kontrolny ADC

Bit ADVREGEN – uruchomienie wewnętrznego stabilizatora ADC

Bit ADSTART – uruchomienie konwersji ADC

Bit ADEN – włączenie konwertera ADC

Rejestr ADC_CFGR1 – rejestr konfiguracyjny ADC

Bit CHSELRMOD – wybór sposobu konfiguracji kanałów

Bit CONT – wybór trybu pomiarów

Bit ALIGN – sposób wyrównania danych

Bit RES – rozdzielczość konwersji

Rejestr ADC_CFGR2 – rejestr konfiguracyjny ADC

Bity CKMODE[1:0] – wybór zegara ADC

Rejestr ADC_SMPR – rejestr konfiguracji czasu próbkowania

Bity SMP1 i SMP2 – wybór czasu próbkowania (pierwszy i drugi)

Bity SMPSEL – wybór jednego z dwóch czasów dla każdego z kanałów

Rejestr ADC_CHSELR – rejestr wyboru kanałów

Rejestr ADC_DR – rejestr danych ADC

Chciałbyś otrzymywać na bieżąco informacje o nowych artykułach z kursu? Zapisz się do newslettera!

TO NIE TYLKO MAIL Z INFORMACJĄ O NOWEJ LEKCJI, ALE TAKŻE DODATKOWE MATERIAŁY. NIE PRZEGAP NOWEJ TREŚCI I DODATKOWYCH BONUSÓW. PRZEJDŹ DO STRONY KURSU I PODAJ SWÓJ ADRES E-MAIL. NIE ZAPOMNIJ POTWIERDZIĆ CHĘCI DOŁĄCZENIA W PIERWSZEJ WIADOMOŚCI!
Repozytorium GitHub

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *