Mikrokontrolery STM32 Wykorzystanie ADC i DMA


PODZESPOAY
Mikrokontrolery STM32
Wykorzystanie ADC i DMA
Otaczająca nas rzeczywistość ma postać analogową, zatem symalnie cztery. Zasadnicza różnica pomiędzy
tymi dwiema grupami polega na tym, że kon-
każdy system mikroprocesorowy, który ma pracować w oparciu
wersja kanałów należących do injected group
o informacje pochodzące z tej rzeczywistości, musi być wyposażony
ma wyższy priorytet, niż regular group. Jeżeli
w przetworniki A/C. Większość z obecnie produkowanych
wykonanie przetwarzania A/C jest krytyczne
mikrokontrolerów posiada już wbudowane ADC na tyle dobrej
i nie może być mowy o jakichkolwiek opóz-
jakości, że często są one wystarczające dla poprawnego działania
nieniach, to wówczas należy konwersję wyko-
aplikacji. Odpada zatem konieczność stosowania zewnętrznych
nać przy pomocy kanałów ADC należących do
przetworników, co poprawia niezawodność i upraszcza budowę injected group. Jeżeli konwersja regular group
jest w trakcie wykonywania i MCU otrzyma
urządzenia. W artykule przestawiamy w jaki sposób rozpocząć pracę
żądanie wykonania konwersji grupy  wstrzy-
z ADC i DMA wbudowanymi w mikrokontrolery STM32. Wszystkie
kiwanej , to wtedy następuje zawieszenie
projekty zostały przygotowane i uruchomione na płycie ewaluacyjnej
przetwarzania na jej rzecz. W momencie, gdy
STM3210B-EVAL.
proces jej przetwarzania zostanie zakończony,
to wywłaszczona konwersja zostaje wznowio-
Każdy z mikrokontrolerów, należący do ro- wykonać dwa pomiary prądu dokładnie w tym na od momentu jej przerwania. Zachowanie to
dziny STM32, jest wyposażony w przynajmniej samym czasie. Oczywistym jest, że taka jedno- pokazano na rys. 2. Ponadto injected group
jeden przetwornik analogowo-cyfrowy oraz czesna praca obydwu przetworników może być ma oddzielne rejestry danych dla każdego
sprzętowy kontroler DMA. Aby oswoić się nieco wykorzystywana również wszędzie tam, gdzie z kanałów pomiarowych, czyli w sumie cztery,
z przetwarzaniem A/C, uruchomimy na począ- jest wymagany równoczesny pomiar kilku na- co zaznaczono na rys. 1.
tek prostą aplikację. Jej zadaniem będzie poka- pięć (lub pośrednio  prądów). Każda nieco bardziej zaawansowana aplikacja
zywanie na wyświetlaczu LCD w formie wykre- Wbudowane w mikrokontroler przetworniki wykorzystująca przetworniki A/C, wymaga specy-
su U=f(t), wartości napięcia na doprowadzeniu A/C są wyposażone w układy kalibracji. Dzięki ficznego podejścia. Z tego powodu producenci
PC4, do którego dołączony jest potencjometr nim znacznie zmniejsza się błąd przetwarzania mikrokontrolerów implementują w swoich ADC
RV1. Poznamy sposób, w jaki przetworniki są wynikający z niedokładności pojemności kon- coraz bardziej wymyślne tryby ich działania. Jest
konfigurowane i obsługiwane, co pozwoli na densatorów pamiętających próbkowane na- to najczęściej ściśle związane z możliwymi za-
zbudowanie bardziej skomplikowanych apli- pięcie. Typowo pojemność takich kondensato- stosowaniami, do których przeznaczony jest
kacji. Gdy ADC będzie już pracował zgodnie rów wynosi 12 pF, jednak wykonywane są one mikrokontroler. Również i w STM32 mamy do
z założeniami, to wykorzystamy możliwości ja- z pewną tolerancją, zatem wartość pojemności dyspozycji kilka trybów działania ADC:
kie drzemią w kontrolerze DMA w połączeniu może odbiegać od deklarowanej. Wpływ różnic " ciągła lub jednorazowa konwersja pojedyn-
z ADC. Materiały do projektów są dostępne pojemności na wynik pomiaru niwelowany jest czego kanału, lub wielu kanałów,
na stronie paprocki.wemif.net oraz na płycie w czasie kalibracji. " tryb nieciągły (discontinuous),
CD-EP1/2009B dołączonej do numeru. W pierw- Z rys. 1 wynika, że ADC może przetwarzać " jednoczesna praca dwóch przetworników,
szej kolejności jednak zapoznamy się nieco bliżej sygnały w dwóch grupach: regular group (re- " wyzwalanie przetwornika za pomocą timera
z budową przetworników A/C, w które wypo- gularna) oraz injected group ( wstrzykiwana ). lub zewnętrznego przerwania.
sażone są mikrokontrolery STM32. Wyjaśnimy pokrótce, na czym polegają różnice Przetwornik jest również wyposażony
w obsłudze tych dwóch grup. w sprzętowy, analogowy Watchdog, który ma
Budowa przetwornika analogowo Regular group  jest to grupa podstawowa, ustawiane progi (niski i wysoki), po przekrocze-
cyfrowego do której możemy przypisać do szesnastu kana- niu których może być generowane przerwanie.
Zamontowany na płytce ewaluacyjnej układ łów pomiarowych, w odróżnieniu od injected Do tego wszystkiego możemy również ustawić
STM32F103VB ma wbudowane dwa 12-bito- group, do której mogą być przypisane mak- czas próbkowania sygnału. Dla potrzeb projek-
we 16-kanałowe ADC, które mogą pracować
w wielu różnych trybach. Na rys. 1 przed-
stawiono uproszczonÄ… budowÄ™ przetwornika
analogowo cyfrowego zaimplementowanego
w wykorzystywanym przez nas mikrokontro-
lerze. Nasz bohater ma wbudowane dwa takie
przetworniki oznaczone jako ADC1 i ADC2.
Firma ST umieszczajÄ…c w swoich produktach
wielokrotne, autonomiczne przetworniki ana-
logowo-cyfrowe, zrobiła ukłon w kierunku
konstruktorów wykorzystujących w swoich
aplikacjach bezszczotkowe silniki trójfazowe
prądu stałego. W tego typu rozwiązaniach,
aby kontrolować parametry pracy silnika, należy Rys. 1. Uproszczony schemat blokowy przetwornika A/D
116 ELEKTRONIKA PRAKTYCZNA 1/2009
Wykorzystanie ADC i DMA
tów przykładowych przedstawionych w artykule
zostanie użyty tryb ciągły, z pomiarem jednego
lub dwóch kanałów.
Pomiar w trybie ciągłym
Na list. 1 przedstawiono program, który rea-
lizuje odczyt napięcia na nóżce PC4 mikrokontro-
lera (wyprowadzenie 33 dla obudowy LQFP100).
Na płytce STM3210B-EVAL wyprowadzenie to jest
podłączone do potencjometru RV1. Wartość napię-
cia zasilajÄ…cego PC4 wskazywana jest na graficznym
wyświetlaczu LCD w formie wykresu U=f(t).
Rys. 2. Ilustracja przerwy w konwersji grupy sygnałów regular na rzecz injected Z noty katalogowej mikrokontrolera
STM32F103VB można odczytać, że domyślną
funkcjÄ… alternatywnÄ… tego wyprowadzenia jest
List. 1. Program odczytujący napięcie przyłożone do PC4
void RCC_Conf(void); ADC12_IN14, zatem będziemy korzystać z 14
void NVIC_Conf(void);
kanału przetwornika. W tym przykładzie (jak
void GPIO_Conf(void);
void SysTick_Conf(void);
również w pozostałych) są wykorzystywane
standardowe funkcje obsługi LCD dostarczane
int index = 0;
int wyniki[320] = {0};
przez firmÄ™ ST. SÄ… dobrze opisane w dokumen-
int main(void)
tacji, toteż nie będziemy się nimi szczegółowo
{
zajmować.
ADC_InitTypeDef ADC_InitStruct;
Aby przetwornik analogowo cyfrowy działał
RCC_Conf(); NVIC_Conf(); GPIO_Conf();
SysTick_Conf(); // SysTick wykorzystywany przez funkcje Delay() poprawnie, należy go w pierwszej kolejności
skonfigurować odpowiednio do potrzeb apli-
// Jeden przetwornik, pracujacy niezaleznie
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
kacji. Będziemy korzystać z pierwszego prze-
twornika ADC1, o czym poinformujemy MCU
// Pomiar jednego kanalu, wylacz opcje skanowania
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
w odpowiednim miejscu. Tak, jak miało to miej-
// Wlacz pomiar w trybie ciaglym sce w przypadku innych układów peryferyjnych
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
(artykuły w EP11/08 i EP12/08), konfigurowa-
// Nie bedzie wyzwalania zewnetrznego
nie ADC odbywa się poprzez wypełnianie pól
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
struktury inicjującej i pózniejsze jej przekazanie
// Dane wyrownane do prawej - znaczacych bedzie 12 mlodszych bitow
do odpowiedniej funkcji.
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
Po utworzeniu zmiennej ADC_InitStruct roz-
// Jeden kanal
poczynamy wypełnianie jej pól. Pierwszy pa-
ADC_InitStruct.ADC_NbrOfChannel = 1;
rametr określa, czy przetwornik ma pracować
// Inicjuj przetwornik
ADC_Init(ADC1, &ADC_InitStruct); samodzielnie, czy też wraz z drugim ADC. Dla
nas interesujący jest tryb pracy niezależnej (inde-
// Grupa regularna, czas probkowania 71,5 cykla czyli 5,1us
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_71Cycles5);
pendent). Ponieważ przetwarzamy tylko jeden
kanał, to wyłączamy opcję skanowania wielu ka-
// Wlacz ADC1
ADC_Cmd(ADC1, ENABLE);
nałów oraz włączamy pracę ciągłą (continuous).
// Resetuj rejestry kalibracyjne
Taki sposób pracy jest symbolicznie przedstawio-
ADC_ResetCalibration(ADC1);
ny na rys. 3.
// Czekaj, az skonczy resetowac
while(ADC_GetResetCalibrationStatus(ADC1));
W naszym przykładzie nie będziemy korzy-
// Start kalibracji ADC1 stać z wyzwalania ADC za pomocą np. któregoś
ADC_StartCalibration(ADC1);
z timerów, czy też przerwania zewnętrznego,
// Czekaj na zakonczenie kalibracji ADC1
while(ADC_GetCalibrationStatus(ADC1));
zatem informujemy o tym MCU.
Wbudowany w mikrokontrolery STM32
// Start przetwarzania
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
przetwornik daje możliwość programowego
// Inicjalizuj LCD
ustalenia, czy dane zapisywane do rejestru DR
STM3210B_LCD_Init();
(Data Register) przetwornika mają być wyrów-
// Wyczysc LCD, tlo niebieskie
LCD_Clear(Blue);
while(1)
{
Delay(1); // Odswierzanie co 10ms
if(index==320) index=0; // wyswietlacz posiada 320 kolumn
// Czyszczenie LCD ze starych danych
LCD_SetCursor(wyniki[index], 320 - index);
LCD_WriteRAMWord(Blue);
// Odczytanie wartosci a ADC i obliczenia:
// 12 bitow = 4096 poziomow
// 240 wierszy LCD, zatem 4096/240 = 17
wyniki[index] = ADC_GetConversionValue(ADC1) / 17;
LCD_SetCursor(wyniki[index], 320 - index); // rysowanie punktow
LCD_WriteRAMWord(Red);
index++;
}
Rys. 3. Uproszczony schemat pracy A/D
}
w trybie pomiaru pojedynczego kanału
ELEKTRONIKA PRAKTYCZNA 1/2009 117
PODZESPOAY
nywane do lewej, czy do prawej strony. Tutaj ADC_Cmd(). Aby uzyskać możliwie dokładny mowanie czasu, który będzie przeznaczony na
używamy standardowego wyrównywania do wynik przetwarzania, musimy jeszcze dokonać próbkowanie sygnału. Ma to szczególne znacze-
prawej, zatem znaczących jest 12 młodszych kalibracji ADC. W związku z tym, najpierw nie przy dopasowywaniu pracy ADC do środo-
bitów rejestru DR. Ostatnią informacją konfi- zerujemy ustawienia kalibracyjne, czekamy na wiska, w którym wykonywane są pomiary. Ste-
guracyjną jest deklaracja liczby wykorzystywa- wykonanie tego polecenia, a następnie każemy rując czasem próbkowania można optymalnie
nych kanałów przetwornika. Jako powiedzia- przetwornikowi skalibrować się i również cze- dobierać nastawy w zależności od impedancji,
no wcześniej, w naszym przypadku pomiar kamy na zakończenie operacji. Teraz można już jaka jest podłączona do wejścia pomiarowego
będzie wykonywany z użyciem pojedynczego rozpocząć (programowo) właściwe przetwa- przetwornika. Pozwala to na zminimalizowanie
kanału. rzanie, za co odpowiada funkcja ADC_Softwa- błędów wynikających z niedopasowania ADC.
Analogicznie jak dla innych układów pery- reStartConvCmd(). Od tego momentu rejestr Maksymalna częstotliwość, z jaką może pra-
feryjnych, nazwa funkcji inicjujące jest zbieżna danych DR jest aktualizowany cyklicznie, po cować wbudowany w mikrokontrolery prze-
z nazwą układu peryferyjnego i nastawy prze- zakończeniu każdej konwersji. Po odczytaniu twornik analogowo-cyfrowy, wynosi 1 MHz
twornika analogowo-cyfrowego wprowadzane jego wartości możemy już ją według potrzeb (czas konwersji 1 ms). Aby osiągnąć taki wynik,
są pomocą funkcji ADC_Init(). dalej przetwarzać. W tym przykładzie, po prze- należy ustawić częstotliwość taktowania szyny,
Po konfiguracji przetwornika, należy doko- liczeniach jest ona wyświetlana na LCD w po- do której jest podłączony ADC, na 14, 28 lub
nać wyboru, czy ADC ma pracować w grupie staci wykresu. W efekcie otrzymujemy bardzo 56 MHz. Sam przetwornik może być taktowany
injected, czy regular. Służy do tego funkcja prosty rejestrator przebiegów analogowych, z maksymalną częstotliwością równą 14 MHz.
ADC_RegularChannelConfig(). W naszym przy- w którym długość rekordu wynosi 320 próbek, W związku z tym, że sygnały zegarowe moż-
kładzie przetwarzany jest jeden kanał w grupie a napięcie jest próbkowane co 10 ms. na dzielić tylko przez wartości będące potęgą
regularnej. Ponadto poprzez tę samą funkcję liczby dwa, maksymalna częstotliwość sygnału
jest ustalany czas, jaki będzie przeznaczony na Programowany czas próbkowania zegarowego rdzenia, dla którego jest możliwe
próbkowanie sygnału. Wróćmy jeszcze raz do zagadnienia czasu osiągnięcie czasu konwersji równego 1 ms, to
Po wykonaniu wszystkich niezbędnych próbkowania. Przetwornik A/C, w jaki wyposa- 56 MHz. W takim przypadku dzielnik częstotli-
wstępnych czynności konfiguracyjnych, włą- żony jest nasz mikrokontroler umożliwia (nieza- wości ADC będzie wynosił cztery, co da w efek-
czamy przetwornik ADC1 wywołując funkcję leżnie dla każdego kanału, patrz rys. 2) progra- cie 14 MHz.
Generalnie czas konwersji jest wyznaczany
List. 2. Program demonstrujący wyniki pomiaru napięcia na PC4 i pomiaru temperatury
z zależności:
#define ADC1_DR_Address ((u32)0x4001244C)
T = programowany czas próbkowania
int index = 0;
+12,5 cyklu zegarowego
int wyniki_RV1[320] = {0};
u16 temperatura; Minimalny programowany czas próbkowa-
char wynik_temperatura[8] = {0};
nia jest równy 1,5 cyklu zegarowego. Podsu-
u16 ADCVal[2];
mowujÄ…c, minimalny czas konwersji wynosi
int main(void)
1,5+12,5=14 cykli, a skoro częstotliwość
{
ADC_InitTypeDef ADC_InitStruct;
taktowania wynosi 14 MHz, to całkowity czas
RCC_Conf(); NVIC_Conf(); GPIO_Conf(); SysTick_Conf(); DMA_Conf();
przetwarzania A/C wynosi 1 ms.
Żeby przetwornik pracował z takim czasem
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
// Pomiar wielu kanalow, wlacz opcje skanowania
konwersji, należy w funkcji konfiguracji sygna-
ADC_InitStruct.ADC_ScanConvMode = ENABLE;
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; łów zegarowych i resetu RCC_Conf(), zmodyfi-
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
kować linijkę odpowiadającą za mnożnik sygna-
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
// Dwa kanaly
łu PLL. Musi to być wykonane w taki sposób,
ADC_InitStruct.ADC_NbrOfChannel = 2;
aby z podłączonego do mikrokontrolera rezo-
ADC_Init(ADC1, &ADC_InitStruct);
natora 8 MHz uzyskać częstotliwość 56 MHz.
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_
71Cycles5); Mnożnik  razy 7 można ustawić podając go
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_
jako parametr wywołania funkcji:
239Cycles5);
RCC_PLLConfig(RCC_PLLSource_HSE_
// Wlaczenie czujnika temperatury
Div1, RCC_PLLMul_7);
ADC_TempSensorVrefintCmd(ENABLE);
// Wlaczenie DMA
Następnym krokiem prowadzącym do uzy-
ADC_DMACmd(ADC1, ENABLE);
skania wymaganej w naszym przypadku czÄ™-
ADC_Cal(); // Kalibracja ADC1
stotliwości taktowania ADC równej 14 MHz,
// Inicjalizuj LCD
jest podzielenie częstotliwości taktującej we-
STM3210B_LCD_Init();
// Wyczysc LCD, tlo niebieskie wnętrzną szynę danych, do której podłączony
LCD_Clear(Blue);
jest ADC (magistrala APB2), przez 4. Aby tego
while(1)
dokonać, należy w funkcji RCC_Conf() umieścić
{
liniÄ™ kodu:
Delay(1); // Odswierzanie co 10ms
if(index==320) index=0; // wyswietlacz posiada 320 kolumn
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
LCD_SetCursor(wyniki_RV1[index], 320 - index);
Zapewni to częstotliwość taktowania ADC1
LCD_WriteRAMWord(Blue);
równą 14 MHz, a w konsekwencji czas prze-
wyniki_RV1[index] = ADCVal[0] / 17;
twarzania równy 1 ms.
// Pomiar temperatury i obliczenia
temperatura = (1430 - ADCVal[1]*0.805) / 4.3 + 25;
LCD_SetCursor(wyniki_RV1[index], 320 - index);
Wiele kanałów w trybie ciągłym
LCD_WriteRAMWord(Red);
sprintf(wynik_temperatura,  T=%d stC , temperatura);
Często aplikacja wymaga pomiaru kilku
// Odswierzanie temperatury co okolo 320ms
napięć. Wówczas wykorzystuje się kilka wejść
if(!(index % 32))
LCD_DisplayStringLine(1,(u8*)wynik_temperatura);
pomiarowych przetwornika analogowo-cyfro-
index++;
}
wego. W przypadku mikrokontrolerów STM32
}
nie ma potrzeby wykonywania oddzielnych
118 ELEKTRONIKA PRAKTYCZNA 1/2009
V25 żÿVSEżÿSE
o
T( C)= + 25
Avg _ Slope
mV
4,6
o
C
Wykorzystanie ADC i DMA
mV
4,3 .
o
C
przełączając go z trybu czuwania do normal- tach. Jeśli by wszystkie napięcia wyrazić w wol-
nej pracy. Należy to zrobić wywołując funkcję tach, V25 = 1,43 V mnożyć i dzielić przez
to trzeba by było
mV
Avg_Slope = 4,3co
ADC_TempSensorVrefintCmd(). Dalej, po uru- bardzo małe liczby, nie jest ani przejrzyste,
o
C
chomieniu przetwornika i zakończeniu kon- ani efektywne. W tym równaniu można wszyst-
wersji, musimy przeliczyć wartość, która jest kie napięcia ,wyrazić w miliwoltach, ponieważ
3 3V
Ur = żÿ 805µ żÿ 0,805
zawarta w rejestrze danych ADC, na wartość i tak one się skracają. VWróćmy mV meritum.
do
4095
wyrażoną w stopniach Celsjusza. Równanie Podstawiając otrzymane napięcia do równania
UT = 1785 żÿ 0,805mV żÿ 1436mV
pozwalające obliczyć aktualną wartość tempera- otrzymujemy:
tury jest następujące:
1430mV żÿ1436mV
o
T( C)= + 25
mV
V25 żÿVSEżÿSE
o 4,3
o
T( C)= + 25
C
Avg _ Slope
mV
Poszczególne jego składniki to: Ostateczny wynik:
4,6
o
C
V25  napiÄ™cie w temperaturze 25°C, może siÄ™ T=23°C
zawierać w granicach 1,34 do 1,52 V, typowo Taka wartość zostanie wyświetlona na LCD.
mV
4,3 .
wynosi 1,43 V; Należy pamiętać, że pomiary temperatury są
o
C
Rys. 4. Uproszczony schemat pracy A/D VSENSE  zmierzona wartość napiÄ™cia czujnika obarczone bÅ‚Ä™dem Ä…1,5°C.
V25 żÿVSEżÿSE
w trybie skanowania kanałów pomiarowych temperatury; o Wynik ten można osiągnąć po przeprowa-
V25 = 1,43 V
T( C)= + 25
Avg_Slope = 25 żÿV wartość, może Avg _ Slope dzeniu kalibracji. JeÅ›li kalibracja nie zostanie
mV
o  VstaÅ‚a SEżÿSE przyjmować
T( C)
Avg_Slope = 4,3 + 25
mV
o 4,6
Avg _ Slope
pomiarów dla każdego z kanałów. Proces ten wartości z przedziału 4 do 4,6 , typowo wy- wykonana, to błąd pomiaru może być większy.
C o
V25 żÿVSEżÿSE C
4,6
o
jest zautomatyzowany. Do tego celu służy tryb nosi 4,3 mV . Kalibracja polega na odczycie wyniku pomia-
o
T( C)3= + 25
C
4,3 .
,3V
Avg _ Slope0,CmV V25
przemiatania (skanowania) wejść. Wybiera- W przedstawionym o o
zostaÅ‚y ru temperatury przy 25°C. Na jego podstawie
C
UrmV żÿ 805µVprzykÅ‚adzie żÿVSEżÿSE + 25
= żÿ )=
T(
V25 żÿVSEżÿSE 805mV
4,3 Avg _ Slope
o
mV.
jąc ten tryb ustalamy, które kanały mają być przyjęte wartości typowe, czyli odpowiednio można wprowadzić stosowne poprawki do
o
)Avg_Slope=4,3 + 25
T(VC4095
4,6 =
C
V25mV
UT o 0,805mV żÿ
=C _ Slope = 1,43 V mV
przetwarzane, w jakiej kolejnoÅ›ci i jaki ma być V25=1,43 , 1785 żÿAvg 4,61436mVAby lepiej równania podanego przez producenta.
.
o
C
Avg_Slope = 4,3
V25 = 1,43 V
o
C
czas ich próbkowania. zrozumieć, mV jaki sposób jest obliczana tem-
w
mV
4,6
Avg_Slope = 4,3
mV
o
mV o
4,3 .
C
C 1430
4,3
Aby pokazać jak działa ten tryb, uruchomi- peratura o przykład.
o
o
T(przeliczymy mV żÿ14363mV Załóżmy, DMA
CC)=. jeden Ur C3, V 805µV żÿ 0,805mV
+ 25
żÿ
mV= 4095
my program, który będzie pokazywał na wy- że wartość ,3zmiennej ADCVal[1], a tym samym W poprzednim przykładzie został wykorzy-
3 V
4,3 V25 = 1,43 V 0,805mV
Ur = 805µV żÿ 0,805mVUT
mVżÿ
o
4,34095 .
Å›wietlaczu LCD graficzny wynik pomiaru napiÄ™- wynik Vpomiaru, wynosi 1785. = 1785 żÿ żÿ 1436 stany kontroler DMA, zatem warto nieco bliżej
Potrzebujemy tÄ… mV
C mV
= 1,43 V mV
o
25
C0,805 Avg_Slope = 4,3 o
UT 1785 żÿ żÿ
C
cia na potencjometrze RV1 oraz temperaturę wartość =wyrażoną w 1436mV a zatem skoro mV zapoznać się z jego budową i zasadą działa-
woltach,
1430mV żÿ1436
mV o
Avg_Slope = 4,3 T( C)= + 25
mikrokontrolera w formie liczbowej. Dodatko- napięcie 25 = 1,43 V 1436mV 3 V 4,3 mV nia.
odniesienia żÿwynosi 3,3 ,3V, to rozdziel-
o
VC 1430mV oC Ur+=25 żÿ 805µV żÿo0,805mV
T( )=
wo, nieco na wyrost, czasy próbkowania dla czość przetwarzania:mV mV 4095 C Wiele zadań we współczesnych systemach
4,3
Avg_Slope = 4,3
o
UT = 1785 żÿ 0,805mV żÿ 1436mV
C
o
pomiaru napięcia i temperatury będą różne, 3,3V cyfrowych polega na przesyłaniu danych z jed-
Ur = żÿ 805µVCżÿ 0,805mV
a przetwornik będzie pracował w trybie cią- 4095 nego miejsca w pamięci do drugiego. Stąd zro-
1430mV żÿ1436mV
o
T( C)= + 25
mV
3,3V
głym. Na rys. 4 jest pokazano w sposób po- Stąd
Uwartość zżÿ 0,805mV
T
Ur==1785 przetwornika ,wyrażona 3 mV dziło się pytanie: po co angażować do tego celu
żÿ 805µVżÿżÿ1436mV 4,w C
0 805mV
o
4095
glądowy zasada tego pomiaru, natomiast sto- będzie wynosić: CPU? Jeżeli dane są tylko kopiowane lub prze-
sowny program zostaÅ‚ umieszczony na list. 2. Uo = 1430805mV żÿ 1436mV noszone z miejsca na miejsce, to nie ma potrze-
T
T( C)1785 żÿ 0, mV żÿ1436mV + 25
=
Powtarzający się w stosunku do programu Wyjaśnienia może wymagać jeszcze, dlaczego by wykorzystywania mocy obliczeniowej i reje-
mV
4,3
o
1430mV żÿC
1436mV
z list.1 kod zródłowy, został umieszczony napięcia wyrażamy w miliwoltach, a nie wol- strów CPU. Zrodziła się wówczas idea budowy
o
T( C)= + 25
w funkcjach, aby niepotrzebnie nie zaciem- mV
4,3
o
List. 3. Funkcje konfigurujÄ…ce DMA
niać istotnych funkcji. Można zauważyć, że
C
void DMA_Conf(void)
w odróżnieniu od poprzedniego przykładu,
{
// Ustawienia domyslne DMA
tutaj włączamy opcję skanowania (przemiata-
DMA_DeInit(DMA1_Channel1);
nia) kanałów, informujemy, że przetwarzane
// Adres rejestru danych ADC (Data Register)
będą dwa (a nie jak poprzednio jeden) kanały.
DMA_InitStruct.DMA_PeripheralBaseAddr = ADC1_DR_Address;
To są wszystkie zmiany, jakich należy dokonać
// Adres pamieci, pod jaki beda zapisywane dane
podczas wypełniania struktury inicjującej prze- DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADCVal;
twornik. Następnie ustalamy grupy kanałów,
// Kierunek: zrodlem jest ADC
ich kolejność przetwarzania i czasy próbko- DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
wania.
// Rozmiar burora: dwa kanaly = rozmiar bufora 2
DMA_InitStruct.DMA_BufferSize = 2;
Dane z przetwornika są przesyłane za po-
mocą kanału 1 DMA bezpośrednio do pamięci // Wylaczenie licznika inkrementujacego adres dla peryferia
// i wlaczenie go dla pamieci
o rozmiarze dwóch 16 bitowych komórek.
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
Ten fragment pamięci to nic innego jak tablica,
której zadaniem jest przechowywanie wyni-
// Dane 12 - bitowe, zatem wystarczy pol slowa
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_
ków pomiarów. Są one następnie przeliczane
HalfWord;
i wyświetlane na LCD. DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
Dodatkowego komentarza może wymagać
// Dane beda przesylane ciagle
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
odczyt napięcia z czujnika temperatury. Czuj-
nik ten jest widziany z perspektywy mikro- // Priorytet wysoki
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
kontrolera jako kanał 16 (ADC12_IN16), zatem
taki wybieramy do konwersji. Producent zale- // Wylaczenie przesylania z pamieci do pamieci
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
ca, aby czas próbkowania wynosił minimum
DMA_Init(DMA1_Channel1, &DMA_InitStruct);
17 ms, więc ustalamy czas próbkowania na
// Wlacz DMA
239,5 cyklu, co przekłada się na czas 17,1 ms. DMA_Cmd(DMA1_Channel1, ENABLE);
}
Następnie trzeba włączyć czujnik temperatury,
ELEKTRONIKA PRAKTYCZNA 1/2009 119
PODZESPOAY
danych, przy czym maksymalny rozmiar takiego przesyłu danych z przetwornika ADC do pamięci
bloku może wynosić 65535. (czyli w efekcie do zmiennej). Funkcję konfiguru-
jÄ…cÄ… DMA przedstawiono na list. 3. Ponadto, aby
System priorytetów obsługi kontroler DMA pracował poprawnie, w pierwszej
kanałów DMA. kolejności należy włączyć jego sygnał zegarowy,
Kontroler DMA, wbudowany w mikrokontro- umieszczajÄ…c w funkcji RCC_Conf() linijkÄ™:
lery STM32 rozróżnia cztery programowo usta- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_
lane priorytety: DMA1, ENABLE);
" najwyższy (very high priority),
Rys. 5. Priorytety obsługi kanałów DMA " wysoki (high priority), Podsumowanie
" średni (medium priority), Przedstawione w artykule przykłady ukazują
układu służącego do transmisji bloków danych " niski (low priority). tylko niewielką część możliwości, jakie oferują
w pamięci. Układy z tej grupy noszą nazwę Każdemu z dostępnych kanałów można konstruktorom przetworniki A/C wbudowane
kontrolerów DMA (Direct Memory Access). Zaj- przyporządkować któryś z wyżej wymienionych w mikrokontrolery STM32. Ogromna różnorod-
mują się całą pracą związaną z kopiowaniem priorytetów. Powstaje jednak pytanie, co się ność trybów pracy oraz elastyczność konfiguracji
i przenoszeniem dużych bloków danych, zwal- dzieje w chwili, gdy pojawiają się dwa żądania sprawiają, że te peryferia mogą być wykorzysty-
niając tym samym z tego obowiązku CPU. dostępu do kontrolera DMA z dwóch kanałów wane w aplikacjach, w których do niedawna
Mikrokontroler STM32F103VB jest wyposa- o takim samym programowym priorytecie? niezbędne było używanie zewnętrznych prze-
żony w 7-kanałowy kontroler DMA o ustawia- W takim przypadku pierwszeństwo ma kanał tworników. Gdy do współpracy z ADC zostanie
nej na 8, 16 lub 32 bity długości słowa danych. o mniejszym numerze, wyjaśnia to rys. 5. Przy- wykorzystany kontroler DMA, to w konsekwencji
Każdemu z kanałów można przypisać określo- kładowo priorytet wysoki mają kanały 1 i 5, ale programista otrzymuje system zdolny przetwa-
ny priorytet. Możliwa jest transmisja pomiędzy gdy obydwa zażądają dostępu do DMA w tym rzać spore ilości informacji, pozostawiając jeszcze
dwoma układami peryferyjnymi, z układu pe- samym czasie, to w pierwszej kolejności zostanie dużo wolnych zasobów CPU. Wolną moc oblicze-
ryferyjnego do pamięci, z pamięci do układu obsłużony kanał 1. niową mikrokontrolera można w takim przypad-
peryferyjnego oraz z pamięci do pamięci. Dane Wykorzystany w poprzedniej aplikacji (na ku wykorzystać do realizacji innych zadań.
można pojedynczo lub w postaci całych bloków list. 2) kontroler DMA został skonfigurowany do Krzysztof Paprocki
R E K L A M A
120 ELEKTRONIKA PRAKTYCZNA 1/2009


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery STM32 Bezpieczeństwo i stabilność
Mikrokontrolery STM32 Obsługa kart SD i FatFs
Mikrokontrolery STM32 Użycie interfejsu I2C, USART, SPI
Programowanie pamięci Flash mikrokontrolerów STM32 – Flash Loader
Bootloader dla mikrokontrolerów STM32 Aktualizacja oprogramowanie z zastosowaniem karty SD lub prz
STM32 Butterfly RS232
Mikrokontrolery ARM cz1
Mikrokomputer Pecel z procesorem AT90S8535 cz 3
inne Kształtowanie siły z wykorzystaniem piłek lekarskich
Twórcze wykorzystanie balansu bieli, cz I
Wykorzystanie systemu hivamat 200 w leczeniu ran
Mikrokontrolery ARM cz10

więcej podobnych podstron