32 bity jak najprościej - STM32F0 (2). Pomiar napięcia i temperatury z uwzględnieniem danych kalibracyjnych

32 bity jak najprościej - STM32F0 (2). Pomiar napięcia i temperatury z uwzględnieniem danych kalibracyjnych
Pobierz PDF Download icon
Latem ubiegłego roku przedstawiliśmy serię artykułów poświęconych początkom tworzenia oprogramowania dla mikrokontrolerów 32-bitowych z rdzeniami Cortex na przykładzie prostych projektów działających na płytce STM32F0 Discovery. Pozytywny odzew Czytelników spowodował powstanie drugiej serii artykułów.

Przykłady prezentowane w tej serii mogą być uruchamiane na mikrokontrolerach z rodziny STM32F05x oraz "ekonomicznej" - STM32F030. Strukturę kodu źródłowego nowych przekładów tak zmodyfikowano, aby definicje używane we wszystkich przykładach były zgrupowane w plikach niezależnych od konkretnego projektu. Do kompilowania programów użyto nowej wersji środowiska Keil MDK-ARM - 5.00. Nowe projekty oraz przystosowane do nowej wersji MDK-ARM projekty z poprzedniej serii artykułów są zawarte w materiałach dodatkowych, w pliku F0tutorial2.zip.

Przygotowanie środowiska Keil MDK-ARM 5.x

W poprzedniej serii artykułów wprowadzających do programowania mikrokontrolerów STM32F0 korzystaliśmy ze środowiska Keil MDK-ARM w wersji 4.x. Obecnie jest dostępna wersja 5, dlatego kolejne przykłady zostały przygotowane przy jej użyciu.

Rysunek 1. Okno główne instalatora pakietów

Instalowanie środowiska Keil w wersji 5.0 jest podobne do znanego z wersji 4.x, jednak została wprowadzona jedna istotna zmiana - pakiet instalacyjny nie zawiera plików związanych z konkretnymi mikrokontrolerami, więc przed rozpoczęciem pracy należy je doinstalować korzystając z przycisku Pack Installer (rysunek 1) umieszczonego na końcu paska narzędzi. Jego naciśnięcie powoduje otwarcie połączenia z serwerem Keil i wyświetlenie listy dostępnych pakietów. Do podstawowej pracy z STM32F0 należy zainstalować pakiet ARM::CMSIS oraz Keil::STM32F0_DFP.

Pliki wspólne dla wszystkich projektów

W celu podniesienia czytelności programów i ułatwienia tworzenia kolejnych projektów definicje używane we wszystkich nowych projektach zgrupowano w nowych plikach nagłówkowych. W głównym folderze roboczym utworzono folder Common, zawierający wszystkie pliki nagłówkowe.

Rysunek 2. Okno opcji kompilatora

Jedynym plikiem włączanym do wszystkich programów jest plik stm32f0discovery.h. Zawiera on definicje portów dla płytek STM32F0DISCOVERY i STM32F0308DISCO. Włącza on również dwa kolejne pliki:

  • stm32f0yy.h, włączający plik stm32f0xx.h i zawierający definicje lokacji w przestrzeni adresowej oraz wartości pól rejestrów mikrokontrolera, które nie zostały zdefiniowane w dostarczonym przez producenta pliku stm32f0xx.h;
  • stm32futil.h, zawierający użyteczne definicje do tworzenia pól bitowych oraz deklaracje struktury i procedury inline używanej do inicjowania peryferiali. Zawartość plików pokazano na listingach 1...3. Korzystanie z wymienionych plików nagłówkowych w projektach wymaga dodania w opcjach projektu do ścieżki poszukiwania plików nagłówkowych foldera Common (rysunek 2).

Przykłady

1. Pomiar napięcia i temperatury z uwzględnieniem danych kalibracyjnych

Listing 1. Plik stm32f0discovery.h

Mikrokontrolery z serii STM32F0 są wyposażone w wewnętrzne źródło napięcia wzorcowego oraz czujnik temperatury. Oba te moduły charakteryzują się znacznym rozrzutem parametrów, dlatego producent podczas testów fabrycznych zapisuje w pamięci stałej mikrokontrolera ich dane kalibracyjne. Na podstawie danych kalibracyjnych można przeliczyć odczyty przetwornika analogowo - cyfrowego na wartość napięcia i temperatury. Źródło napięcia wzorcowego jest dołączone do wejścia przetwornika o numerze 17, a czujnik temperatury do wejścia o numerze 16.

Kalibrowanie pomiaru napięcia

Pod adresem 0x1FFF F7BA jest zapisana 16-bitowa stała VREFINT_CAL, która odpowiada wartości odczytu A/C przy pomiarze napięcia wzorcowego, dla napięcia zasilania 3,3 V i temperatury 30ºC. Należy zauważyć, że napięciem odniesienia dla przetwornika A/C jest zawsze napięcie zasilania. Wartość VREFINT_CAL może posłużyć do obliczenia wartości napięcia zasilania, która może być następnie użyta do obliczenia wartości zewnętrznych napięć mierzonych przez przetwornik A/C. Zależność pomiędzy wartością stałej VREFINT_CAL i wartością napięcia wzorcowego VREF wyraża się wzorem:

Wartość napięcia wzorcowego naszego egzemplarza mikrokontrolera wynosi:

Jeżeli wartość odczytaną z ADC podczas pomiaru napięcia wzorcowego oznaczymy jako VREFINT_ADC, to bieżącą wartość napięcia zasilania wyznaczamy z wzoru:

Stąd:

W celu uniknięcia zbędnych operacji zmiennopozycyjnych, będziemy prowadzili obliczenia napięć w miliwoltach:

Taka postać wzoru na napięcie zasilania została użyta w programie przykładowym.

Kalibrowanie pomiaru temperatury

Według dokumentacji producenta, czujnik temperatury zawarty w układzie mikrokontrolera wytwarza napięcie, którego zależność od temperatury jest niemal liniowa. Do kalibrowania czujnika służą dwie 16-bitowe stałe TS_CAL1 i TS_CAL2, zapisane w pamięci stałej, odpowiednio pod adresami 0x1FFF F7B8 i 0x1FFF F7C2. Ich wartości odpowiadają odczytom A/C z pomiaru napięcia wytwarzanego przez czujnik temperatury przy napięciu zasilania 3,3 V i temperaturach 30ºC i 110ºC.

Przyjmując, że zależność temperatury od wartości odczytanej z przetwornika analogowo-cyfrowego wyraża się wzorem:

Do obliczenia temperatury są potrzebne wartości współczynników a i b, które można wyznaczyć z wartości kalibracyjnych poprzez rozwiązanie układu równań wiążących dwie wzorcowe temperatury z odpowiadającymi im odczytami ADC.

Stąd:

Ponieważ wartości odczytów A/C czujnika temperatury zależą od napięcia zasilania, zależność ta musi być odpowiednio uwzględniona podczas obliczeń. Można to uzyskać np. normalizując wartość odczytaną z ADC tak, aby przekształcić ją na wartość odpowiadającą odczytowi przy napięciu zasilania 3,3 V.

Finalna wartość mierzonej temperatury będzie obliczana z wzoru:

Po podstawieniu wartości współczynników a i b otrzymujemy postać:

a po wstawieniu wzoru na znormalizowaną wartość odczytu ADC i po redukcji dzieleń:

Program przykładowy

Listing 2. Plik stm32f0yy.h

Program demonstracyjny pokazany na listingu 4 mierzy napięcie zasilania i temperaturę procesora i wysyła je na terminal przez port szeregowy. W celu wyświetlenia wysyłanych danych na komputerze PC należy połączyć pojedynczym przewodem linię PA9 (TXD) mikrokontrolera ze stykiem 2 złącza DB9 interfejsu RS232C. Połączenie masy jest zapewnione przez kabel USB łączący płytkę DISCOVERY z PC, a programowe odwrócenie polaryzacji linii TXD skutecznie zastępuje nadajnik RS232C przy transmisji na małe odległości. Dane są transmitowane z szybkością 57600 b/s. Do komunikacji z płytką można użyć dowolnego programu terminala skonfigurowanego na transmisję danych 8-bitowych bez kontroli parzystości z szybkością 57600 b/s, bez synchronizacji.

Program powstał przez modyfikację wcześniejszego przykładu ilustrującego nadawanie danych przez UART z użyciem DMA.

Zaprogramowanie przetwornika A/C

Listing 3. Plik stm32futil.h

Przetwornik jest skonfigurowany tak, by mierzył on wartości z kanałów 16 i 17. Kolejny pomiar jest wyzwalany przez odczyt wyników poprzedniego - osiąga się to przez ustawienie bitów CONT i WAIT w rejestrze CFGR1. Dzięki temu nie ma potrzeby jawnego wyzwalania pomiarów poprzez zapisy do rejestrów sterujących przetwornika.

Oprogramowanie przetwornika analogowo-cyfrowego stanowi również modyfikację przedstawionego wcześniej przykładu - zostało ono zrealizowane w konwencji automatu zapewniającego zainicjowanie przetwornika i prowadzenie pomiarów bez konieczności oczekiwania programowego. Wszystkie akcje wykonywane są w obsłudze przerwania timera, zgłaszanego z częstotliwością 400 Hz, przy co czwartym wejściu w obsługę przerwania, a więc z częstotliwością 100 Hz. Po zainicjowaniu i początkowej kalibracji przetwornika następuje naprzemienne odczytywanie wyników z A/C i inicjowanie kolejnego pomiaru dla dwóch kanałów, odpowiadających czujnikowi temperatury i źródłu napięcia wzorcowego.

Listing 4. Pomiar temperatury i przesłanie wyniku za pomocą UART

Wyniki pomiarów są filtrowane zrealizowanym programowo filtrem dolnoprzepustowym, podobnie jak we wcześniejszym przykładzie dotyczącym przetwornika.

Obliczenia w programie

Zastosowany sposób realizacji obliczeń umożliwia wyeliminowanie operacji zmiennopozycyjnych oraz zmniejszenie liczby operacji dzielenia, które są najwolniejszymi operacjami arytmetycznymi - w przypadku rdzenia Cortex-M0 są one wykonywane przez procedury programowe.

Napięcie zasilania jest obliczane w miliwoltach, a temperatura - w dziesiątych częściach stopnia. Przy zastosowanej w oprogramowaniu postaci wzorów, zarówno do obliczenia wartości napięcia zasilania, jak i temperatury niezbędne jest wykonanie tylko po jednym dzieleniu. Potrzebne do obliczeń napięcia wzorcowego i temperatury stałe i parametry z pamięci ROM mikrokontrolera zostały zdefiniowane jako symbole preprocesora w pliku stm32f0yy.h. Wartości napięcia zasilania i temperatury są obliczane i wysyłane do terminala co jedną sekundę. Moment transmisji wyników jest sygnalizowany zmianą stanu diod LED umieszczonych na płytce.

Przygotowanie wyników

Obliczone wartości napięcia i temperatury są zamieniane na postać znakową przy użyciu prostych fragmentów kodu cyfry są wstawiane na odpowiednie pozycje bufora przechowującego cały łańcuch znaków reprezentujący wyniki pomiarów. Następnie jest inicjowana transmisja DMA całego bufora do modułu UART.

Grzegorz Mazur

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

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik wrzesień 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio wrzesień 2020

Świat Radio

Magazyn użytkowników eteru

Automatyka Podzespoły Aplikacje wrzesień 2020

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna wrzesień 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 sierpień 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów