Start z STM32 VL Discovery – 11 — ADC part 2

Start z STM32 VL Discovery – 11 — ADC part 2
Razem głosów: 5 co stanowi: 92% całości.

Mikrokontrolery STM32 z grupy Value Line, której przedstawicielem jest nasz STM32F100

zamontowany na STM32VL Discovery mają tylko jeden przetwornik ADC. Ale pozwala on

też podobnie jak AVR na pomiar z wielu kanałów wejściowych. Jest to realizowane sekwencyjnie.

Mamy tu do dyspozycji 3 opcje , rozwiązanie 1 nie jest złe, ale nieco głupie ,

niemniej umożliwia pomiar docelowo z jednego kanału w danym czasie. Działa to tak, że

najpierw musimy ustalić kanał na którym będziemy realizować pomiar, a następnie ładujemy wartość

o następującej strukturze:

Ale jak napisałem wcześniej, jest to głupie rozwiązanie. Lepszym rozwiązaniem jest użycie przerwania lub DMA. Pierwszy wymieniony sposób działa tak, że po ustawieniu wielokanałowego pomiaru po jego zakończeniu występuje przerwanie po którym możemy zająć się obsługą otrzymanego wyniku, lub możemy zasygnalizować ustawiając Trigger kontrolera DMA, który może przesłać nam gotowy wynik pomiaru. Ponieważ DMA możemy sobie dowolnie dopasować do naszych potrzeb uważam to rozwiązanie za lepsze i szczerze polecam korzystanie z DMA.

Oczywiście opiszę DMA dokładniej w osobnym temacie niemniej już tutaj zasygnalizować chcę jego istnienie i pokazać jeden z przykładów wykorzystania tego dobrodziejstwa jakie niewątpliwie kontroler DMA stanowi. 

No więc niby jak mamy wykonać taki odczyt ??

To proste, musimy mieć bufor na wynik konwersji. DMA pozwala nam utworzyć stosunkowo duży

bufor i używać go stopniowo. Dzięki czemu będziemy mieć więcej wartości i pozwoli nam to łatwo

wyliczyć średnią pomiaru uzyskaną podczas zmiany napięcia na wejściu. Bufor możemy sobie zdefiniować

np. tak:

Następnie musimy wprowadzić adres rejestru ADC, z którego dokonujemy odczytu:

dlatego że niestanowi to części biblioteki, Definicję taką tworzymy w obszarze PRIVATE DEFINITION.

Ciekawostką jest odczytywanie wejścia gdzie , ustawienie pinu dla wejścia w trybie ADC

= GPIO_InitStructure gdzie znajdziemy funkcje :

   GPIO_Mode oraz  GPIO_Mode_AIN

nie będę teraz tego omawiał bo już chyba o tym mówiliśmy, więc w tym miejscu chcę tylko przypomnieć.

No tak skoro to tylko tyle to w czym jest haczyk ??

Otóż cała sztuczka jest ukryta w …….. ustawieniach.

Zarówno DMA jak i ADC i nasz przykładowy program z części poprzedniej wystarczy

zmodyfikować tak:

No ba sprytne prawda :)  Chciałbym jednak zaznaczyć że w sumie to zdefiniowałem 8 pomiarów na 

wejściach (każde czyta 2 razy) jak widzicie sprytnie no nie :?  Oczywiście można to też zrealizować

prościej na 4 pierwszych z pojedynczym odczytem co też pozwoli nam uzyskać 8 wartości

przekazywanych do DMA . Niemniej jak zaznaczam jest to zrobione celowo co widać z ustawionych

opcji dla 8 pomiarów:

Jak widzicie każdy następny pomiar ma stopniowo zwiększony czas próbkowania , co pozwala na uzyskanie dużej dokładności wyników pomiaru, a jest o co walczyć ….

Jeśli nie wierzycie  zobaczcie sobie sami jak to wygląda w praktyce ze stałym czasem próbkowania:

 

W naszym przykładzie jak widzicie użyliśmy kanału ADC_Chanel_0 do wykonania pomiarów , a to dlatego

że ten kanał ma lepszą dokładność niż pozostałe :) Ciekawostką jest fakt iż umożliwia on rejestrowanie

szybkich zmian podczas częstych pomiarów, jak też ma dużą dokładność przy pomiarach stałych wartości.

Zatem  powyżej widać, że możemy ustawić różne kanały i mamy to czego potrzebujemy.

Jeśli zdecydujecie się na ostatni przykład, w którym 5 x czytamy kanał 0, a także ustawimy

DMA_InitStructure.DMA_BufferSize = 16, wtedy w buforze konwersji uzyskamy 10 wartości z kanału 0

i dwie wartości z innych kanałów.  Korzystanie z uśrednienia może znacząco poprawić dokładność

wyników pomiarów na ADC.

Polecam dla was początkujących do używania 2,4,8 i 16-wartości, aby obliczyć średnią, zamiast

potrzebnych 10-wartości, ponieważ obliczenie wartości referencyjnej jest znacznie szybsze.

Wartości są przechowywane w 16-bitowych zmiennych i 12-bitowej konwersji , więc nie musicie się martwić o przepełnienie.

 

Opisana przypadłość i metoda dotyczy tylko  Value Line, które mają  tylko jeden przetwornik ADC.

Inne modele mają ich więcej dzieki czemu możemy dokonywać wielu pomiarów jednocześnie i znacznie przyspieszyć wyliczenie wyników.

Chciałem wam pokazać że na procesorach VL też można zbudować wielokanałowy voltomierz charakteryzujący się bardzo dużą dokładnością pomiarów.

 

Pełny kod do tego artykułu będzie do pobrania z nowego repozytorium :)

Miłej zabawy.

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay