- Porównanie ADC w Arduino i STM32F103C8
- ADC w STM32
- Jak sygnał analogowy jest konwertowany na format cyfrowy
- Piny ADC w STM32F103C8T6
- Wymagane składniki
- Schemat obwodu i objaśnienia
- Programowanie STM32 do odczytu wartości ADC
Jedną wspólną cechą, która jest używana w prawie każdej aplikacji wbudowanej, jest moduł ADC (przetwornik analogowo-cyfrowy). Te konwertery analogowo-cyfrowe mogą odczytywać napięcie z czujników analogowych, takich jak czujnik temperatury, czujnik pochylenia, czujnik prądu, czujnik Flex i wiele innych. Dlatego w tym samouczku nauczymy się, jak używać ADC w STM32F103C8 do odczytywania napięć analogowych za pomocą Energia IDE. Będziemy współpracować mały potencjometr do STM32 niebieską pigułkę planszy i dostarczyć napięcie na pin różnym Analog, czytać napięcia i wyświetlić go na ekranie LCD 16x2.
Porównanie ADC w Arduino i STM32F103C8
Na płytce Arduino zawiera 6 kanałów (8 kanałów w modelach Mini i Nano, 16 w Mega), 10-bitowy przetwornik ADC o zakresie napięć wejściowych 0V – 5V. Oznacza to, że odwzoruje napięcia wejściowe od 0 do 5 woltów na wartości całkowite od 0 do 1023. Teraz w przypadku STM32F103C8 mamy 10 kanałów, 12-bitowy przetwornik ADC z zakresem wejściowym 0V -3,3V. Zmapuje napięcia wejściowe od 0 do 3,3 wolta na wartości całkowite z przedziału od 0 do 4095.
ADC w STM32
Przetwornik ADC wbudowany w mikrokontrolery STM32 wykorzystuje zasadę SAR (kolejny rejestr aproksymacyjny), zgodnie z którą konwersja odbywa się w kilku krokach. Liczba kroków konwersji jest równa liczbie bitów w konwerterze ADC. Każdy krok jest sterowany zegarem ADC. Każdy zegar ADC wytwarza jeden bit od wyniku do wyjścia. Konstrukcja wewnętrzna przetwornika ADC oparta jest na technice kondensatorów przełączanych. Jeśli jesteś nowy w STM32, zapoznaj się z naszym samouczkiem Pierwsze kroki z STM32.
12-bitowa rozdzielczość
Ten przetwornik ADC to 10-kanałowy 12-bitowy przetwornik ADC. Tutaj termin 10 kanał oznacza, że istnieje 10 pinów ADC, za pomocą których możemy zmierzyć napięcie analogowe. Termin 12-bitowy oznacza rozdzielczość ADC. 12-bit oznacza 2 do potęgi dziesięciu (2 12), czyli 4096. Jest to liczba kroków próbkowania dla naszego ADC, więc zakres naszych wartości ADC będzie wynosił od 0 do 4095. Wartość wzrośnie od 0 do 4095 na podstawie wartości napięcia na krok, którą można obliczyć ze wzoru
NAPIĘCIE / KROK = NAPIĘCIE ODNIESIENIA / 4096 = (3,3 / 4096 = 8,056 mV) na jednostkę.
Jak sygnał analogowy jest konwertowany na format cyfrowy
Ponieważ komputery przechowują i przetwarzają tylko wartości binarne / cyfrowe (1 i 0). Tak więc sygnały analogowe, takie jak sygnał wyjściowy czujnika w woltach, muszą zostać przekonwertowane na wartości cyfrowe w celu przetworzenia, a konwersja musi być dokładna.Gdy analogowe napięcie wejściowe jest podawane do STM32 na jego wejściach analogowych, wartość analogowa jest odczytywana i zapisywana w zmiennej całkowitej. Ta zapisana wartość analogowa (0-3,3 V) jest konwertowana na wartości całkowite (0-4096) przy użyciu poniższego wzoru:
NAPIĘCIE WEJŚCIOWE = (wartość ADC / rozdzielczość ADC) * napięcie odniesienia
Rozdzielczość = 4096
Odniesienie = 3,3 V.
Piny ADC w STM32F103C8T6
W STM32 jest 10 pinów analogowych od PA0 do PB1.
Sprawdź również, jak używać ADC w innych mikrokontrolerach:
- Jak korzystać z ADC w Arduino Uno?
- Połączenie ADC0808 z mikrokontrolerem 8051
- Korzystanie z modułu ADC mikrokontrolera PIC
- Samouczek Raspberry Pi ADC
- Jak korzystać z ADC w MSP430G2 - Pomiar napięcia analogowego
Wymagane składniki
- STM32F103C8
- LCD 16 * 2
- Potencjometr 100k
- Płytka prototypowa
- Przewody łączące
Schemat obwodu i objaśnienia
Schemat obwodu do interfejsu wyświetlacza LCD 16 * 2 i wejścia analogowego do płyty STM32F103C8T6 pokazano poniżej.
Poniżej przedstawiono połączenia wykonane dla LCD:
Nr styku wyświetlacza LCD |
Nazwa styku wyświetlacza LCD |
Nazwa styku STM32 |
1 |
Ziemia (Gnd) |
Mielone (G) |
2 |
VCC |
5V |
3 |
VEE |
Kołek ze środka potencjometru |
4 |
Zarejestruj Wybierz (RS) |
PB11 |
5 |
Odczyt / zapis (RW) |
Mielone (G) |
6 |
Włącz (EN) |
PB10 |
7 |
Bit danych 0 (DB0) |
Brak połączenia (NC) |
8 |
Bit danych 1 (DB1) |
Brak połączenia (NC) |
9 |
Bit danych 2 (DB2) |
Brak połączenia (NC) |
10 |
Bit danych 3 (DB3) |
Brak połączenia (NC) |
11 |
Bit danych 4 (DB4) |
PB0 |
12 |
Bit danych 5 (DB5) |
PB1 |
13 |
Bit danych 6 (DB6) |
PC13 |
14 |
Bit danych 7 (DB7) |
PC14 |
15 |
Dioda LED dodatnia |
5V |
16 |
Negatyw LED |
Mielone (G) |
Połączenia wykonano zgodnie z powyższą tabelą. W obwodzie znajdują się dwa Potencjometry, pierwszy służy do dzielnika napięcia, który może służyć do zmiany napięcia i zapewnienia wejścia analogowego do STM32. Lewy pin tego potencjometru pobiera wejściowe napięcie dodatnie z STM32 (3,3V), a prawy pin jest połączony z masą, środkowy pin potencjometru jest połączony z analogowym pinem wejściowym (PA7) STM32. Drugi potencjometr służy do zmiany kontrastu wyświetlacza LCD. Źródło zasilania STM32 zapewnia zasilanie USB z komputera PC lub laptopa.
Programowanie STM32 do odczytu wartości ADC
W naszym poprzednim samouczku dowiedzieliśmy się o programowaniu płytki STM32F103C8T6 za pomocą portu USB. Więc nie potrzebujemy teraz programatora FTDI. Wystarczy podłączyć go do komputera przez port USB STM32 i rozpocząć programowanie za pomocą ARDUINO IDE. Programowanie STM32 w ARDUINO IDE do odczytu napięcia analogowego jest bardzo proste. To samo, co deska arduino. Nie ma potrzeby zmiany pinów zworek w STM32.
W tym programie odczyta wartość analogową i obliczy napięcie z tą wartością, a następnie wyświetli wartości analogowe i cyfrowe na ekranie LCD.
Najpierw zdefiniuj piny LCD. Określają, do którego pinu STM32 podłączone są piny LCD. Możesz modyfikować zgodnie ze swoimi wymaganiami.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // wymień nazwy pinów, do których podłączony jest LCD
Następnie dołączamy plik nagłówkowy wyświetlacza LCD. To wywołuje bibliotekę, która zawiera kod, w jaki sposób STM32 powinien komunikować się z LCD. Upewnij się również, że wywoływana jest funkcja Liquid Crystal z nazwami pinów, które właśnie zdefiniowaliśmy powyżej.
#zawierać
Wewnątrz funkcji setup () po prostu podawalibyśmy komunikat wprowadzający, który ma być wyświetlany na ekranie LCD. Możesz dowiedzieć się o połączeniu LCD z STM32.
lcd.begin (16, 2); // Używamy lcd 16 * 2 LCD.clear (); // Wyczyść ekran lcd.setCursor (0, 0); // W pierwszym wierszu pierwsza kolumna lcd.prin t ("CIRCUITDIGEST"); // Wydrukuj ten lcd.setCursor (0, 1); // W drugim rzędzie pierwsza kolumna n lcd.print ("STM32F103C8"); // Wydrukuj to opóźnienie (2000); // czekaj dwie sekundy lcd.clear (); // Wyczyść ekran lcd.setCursor (0, 0); // Pierwsza kolumna w pierwszym wierszu lcd.print ("KORZYSTANIE Z ADC IN"); // Wydrukuj ten lcd.setCursor (0,1); // W drugim wierszu w pierwszej kolumnie lcd.print ("STM32F103C8"); // Wydrukuj to opóźnienie (2000); // czekaj dwie sekundy lcd.clear (); // Wyczyść ekran
Wreszcie, w naszej funkcji nieskończonej pętli () , zaczynamy odczytywać napięcie analogowe dostarczane do pinu PA7 z potencjometru. Jak już wspomnieliśmy, mikrokontroler jest urządzeniem cyfrowym i nie może bezpośrednio odczytywać poziomu napięć. Za pomocą techniki SAR poziom napięcia jest mapowany od 0 do 4096. Te wartości nazywane są wartościami ADC, aby uzyskać tę wartość ADC, po prostu użyj następującego wiersza
int val = analogRead (A7); // odczytaj wartość ADC z pinu PA 7
Tutaj funkcja analogRead () służy do odczytu wartości analogowej pinu. Na koniec zapisujemy tę wartość w zmiennej o nazwie „ val ”. Typ tej zmiennej to liczba całkowita, ponieważ otrzymamy tylko wartości z zakresu od 0 do 4096, które będą przechowywane w tej zmiennej.
Następnym krokiem byłoby obliczenie wartości napięcia z wartości ADC. Aby to zrobić, mamy następujące formuły
Napięcie = (wartość ADC / rozdzielczość ADC) * napięcie odniesienia e
W naszym przypadku już wiemy, że rozdzielczość ADC naszego mikrokontrolera wynosi 4096. Wartość ADC znajduje się również w poprzednim wierszu i zapisuje zmienną o nazwie val. Napięcie odniesienia jest równe napięciu na którym mikrokontroler pracuje. Gdy płyta STM32 jest zasilany za pomocą kabla USB, a następnie napięcie robocze wynosi 3.3V. Możesz również zmierzyć napięcie robocze za pomocą multimetru na obwodzie Vcc i bolcu uziemienia na płycie. Zatem powyższy wzór pasuje do naszego przypadku, jak pokazano poniżej
napięcie pływaka = (float (val) / 4096) * 3,3; // formuły do konwersji wartości ADC na napięcie e
Możesz być pomylony z linią float (val). Służy do konwersji zmiennej „val” z typu danych int na typ danych „float”. Ta konwersja jest potrzebna, ponieważ tylko jeśli otrzymamy wynik val / 4096 w float, możemy go pomnożyć 3,3. Jeśli otrzymana wartość jest liczbą całkowitą, zawsze będzie równa 0, a wynik również będzie równy zero. Po obliczeniu wartości ADC i napięcia pozostaje tylko wyświetlenie wyniku na ekranie LCD, co można zrobić za pomocą następujących linii
lcd.setCursor (0, 0); // ustaw kursor na kolumnę 0, wiersz 0 lcd.print ("ADC Val:"); lcd.print (val); // Wyświetl wartość ADC lcd.setCursor (0, 1); // ustaw kursor na kolumnę 0, wiersz 1 lcd.print ("Napięcie:"); lcd.print (napięcie); // Wyświetl napięcie
Pełny kod i film demonstracyjny znajduje się poniżej.