- Wymagane materiały
- ADC na STM8S103F3P6
- Schemat obwodu do odczytu wartości ADC na STM8S i wyświetlania na LCD
- Biblioteka ADC dla STM8S103F3P6
- Program STM8S do odczytu napięcia analogowego i wyświetlania na wyświetlaczu LCD
- Odczyt napięcia analogowego z dwóch potencjometrów za pomocą STM8S
Jeśli jesteś stałym czytelnikiem, który śledzi nasze samouczki dotyczące mikrokontrolera STM8S, wiesz, że w naszym ostatnim samouczku nauczyliśmy się, jak połączyć wyświetlacz LCD 16x2 z STM8. Teraz, kontynuując w tym samouczku, nauczymy się, jak korzystać z funkcji ADC w naszym mikrokontrolerze STM8S103F3P6. ADC to bardzo przydatne urządzenie peryferyjne mikrokontrolera, które jest często używane przez wbudowanych programistów do pomiaru jednostek, które podlegają ciągłym zmianom, takim jak zmienne napięcie, prąd, temperatura, wilgotność itp.
Jak wiemy, „Żyjemy w świecie analogowym z urządzeniami cyfrowymi”, co oznacza, że wszystko wokół nas, jak prędkość wiatru, natężenie światła, temperatura i wszystko, z czym mamy do czynienia, jak prędkość, prędkość, ciśnienie itp., Ma charakter analogowy. Ale nasze mikrokontrolery i mikroprocesory są urządzeniami cyfrowymi i nie będą w stanie zmierzyć tych parametrów bez ważnego urządzenia peryferyjnego zwanego przetwornikiem analogowo-cyfrowym (ADC). W tym artykule nauczmy się, jak używać ADC na mikrokontrolerze STM8S z kompilatorem COMIC C.
Wymagane materiały
W tym artykule będziemy odczytywać dwie analogowe wartości napięcia z dwóch potencjometrów i wyświetlać jego wartość ADC na wyświetlaczu LCD 16x2. Aby to zrobić, będziemy potrzebować następujących komponentów.
- Płytka rozwojowa STM8S103F3P6
- Programator ST-Link V2
- Wyświetlacz LCD 16x2
- Potencjometry
- Przewody łączące
- Rezystor 1k
ADC na STM8S103F3P6
Istnieje wiele typów przetworników ADC, a każdy mikrokontroler ma swoje własne specyfikacje. W STM8S103F3P6 mamy ADC z 5 kanałami i 10-bitową rozdzielczością; przy rozdzielczości 10-bitowej będziemy mogli zmierzyć wartość cyfrową od 0 do 1024, a 5-kanałowy przetwornik ADC wskazuje, że mamy 5 pinów na mikrokontrolerze, które mogą obsługiwać ADC, te 5 pinów jest zaznaczonych na poniższym obrazku.
Jak widać, wszystkie te pięć pinów (AIN2, AIN3, AIN4, AIN5 i AIN6) jest multipleksowanych z innymi urządzeniami peryferyjnymi, co oznacza, że oprócz działania jako pin ADC, te piny mogą być również używane do wykonywania innych połączeń, na przykład, styki 2 i 3 (AIN5 i AIN 6) mogą być używane nie tylko do ADC, ale mogą być również używane do komunikacji szeregowej i funkcji GPIO. Zwróć uwagę, że nie będzie możliwe użycie tego samego pinu do wszystkich trzech celów, więc jeśli użyjemy tych dwóch pinów do ADC, nie będziemy w stanie wykonać komunikacji szeregowej. Inne ważne cechy ADC dla STM8S103P36 można znaleźć w poniższej tabeli zaczerpniętej z arkusza danych.
W powyższej tabeli Vdd oznacza napięcie robocze, a Vss oznacza masę. Tak więc w naszym przypadku na naszej płytce rozwojowej mamy mikrokontroler pracujący na 3,3 V, możesz sprawdzić schemat obwodu płytki rozwojowej z samouczka STM8S. Przy napięciu roboczym 3,3 V, częstotliwość zegara ADC można ustawić w zakresie od 1 do 4 MHz, a zakres napięcia konwersji wynosi od 0 V do 3,3 V. Oznacza to, że nasz 10-bitowy przetwornik ADC odczyta 0, gdy dostarczane jest 0 V (Vss) i odczyta maksymalnie 1024, gdy zapewni się napięcie 3,3 V (Vdd). W razie potrzeby możemy łatwo zmienić to 0-5 V, zmieniając napięcie robocze MCU.
Schemat obwodu do odczytu wartości ADC na STM8S i wyświetlania na LCD
Pełny schemat obwodu użyty w tym projekcie jest podany poniżej, jest bardzo podobny do samouczka LCD STM8S, który omówiliśmy wcześniej.
Jak widać, jedynymi dodatkowymi komponentami oprócz LCD są dwa potencjometry POT_1 i POT_2 . Te potencjometry są podłączone do portów PC4 i PD6, które są pinami ANI2 i ANI6, jak omówiono na obrazie pinoutów wcześniej.
Potencjometry są połączone w taki sposób, że zmieniając to, na naszych pinach analogowych dostaniemy 0-5 V. Będziemy programować nasz sterownik tak, aby odczytywał to napięcie analogowe w postaci cyfrowej (od 0 do 1024) i wyświetlał je na ekranie LCD. Wtedy też obliczymy równoważną wartość napięcia i wyświetlimy ją na LCD, pamiętajmy, że nasz kontroler jest zasilany 3,3V, więc nawet jeśli podamy 5V na pin ADC, będzie on mógł odczytać tylko od 0V do 3,3V.
Po wykonaniu połączeń mój sprzęt wygląda tak, jak pokazano poniżej. Po prawej stronie widać dwa potencjometry, a po lewej programator ST-link.
Biblioteka ADC dla STM8S103F3P6
Aby zaprogramować funkcje ADC na STM8S, będziemy używać kompilatora Cosmic C wraz z bibliotekami SPL. Ale aby ułatwić procesy, stworzyłem inny plik nagłówkowy, który można znaleźć na GitHub z linkiem poniżej.
Biblioteka ADC dla STM8S103F3P6
Jeśli wiesz, co robisz, możesz utworzyć plik nagłówkowy za pomocą powyższego kodu i dodać go do katalogu „include files” na stronie projektu. W przeciwnym razie postępuj zgodnie ze wskazówkami wprowadzającymi do samouczka STM8S, aby dowiedzieć się, jak skonfigurować środowisko programistyczne i kompilator. Gdy konfiguracja jest gotowa, IDE powinno mieć następujące pliki nagłówkowe, przynajmniej te otoczone kolorem czerwonym.
Powyższy plik nagłówkowy składa się z funkcji o nazwie ADC_Read () . Tę funkcję można wywołać w programie głównym, aby uzyskać wartość ADC na dowolnym pinie. Na przykład ADC_Read (AN2) zwróci jako wynik wartość ADC na pinie AN2. Funkcja jest pokazana poniżej.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int wynik = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (WŁĄCZ); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); wynik = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Jak widać, możemy przekazać do tej funkcji osiem parametrów, które definiują sposób konfiguracji ADC. W powyższym kodzie biblioteki ustawiliśmy tryb konwersji na ciągły, a następnie otrzymaliśmy numer kanału przekazany jako parametr. A potem musimy ustawić częstotliwość procesora naszego kontrolera, domyślnie (jeśli nie podłączyłeś zewnętrznego kryształu), twój STM8S będzie działał z wewnętrznym oscylatorem 16Mhz. Dlatego wspomnieliśmy „ ADC1_PRESSEL_FCPU_D18 ” jako wartość wstępnego skalowania. Wewnątrz tej funkcji używamy innych metod zdefiniowanych w pliku nagłówkowym SPL stm8s_adc1.h . Zaczynamy od deinicjalizacji pinów ADC, a następnie ADC1_Init () w celu zainicjowania urządzenia peryferyjnego ADC. Definicję tej funkcji z podręcznika użytkownika SPL przedstawiono poniżej.
Następnie ustawiamy zewnętrzny wyzwalacz za pomocą timera i wyłączamy zewnętrzny wyzwalacz, ponieważ nie będziemy go tutaj używać. Następnie mamy wyrównanie ustawione po prawej stronie, a ostatnie dwa parametry są używane do ustawienia wyzwalacza Schmitta, ale wyłączymy go w tym samouczku. Krótko mówiąc, nasz ADC będzie pracował w trybie ciągłej konwersji na wymaganym pinie ADC z zewnętrznym wyzwalaczem i wyłączonym wyzwalaczem Schmitta. Możesz sprawdzić arkusz danych, jeśli potrzebujesz więcej informacji na temat korzystania z zewnętrznego wyzwalacza lub opcji wyzwalacza Schmitta, nie będziemy tego omawiać w tym samouczku.
Program STM8S do odczytu napięcia analogowego i wyświetlania na wyświetlaczu LCD
Pełny kod użyty w pliku main.c można znaleźć na dole tej strony. Po dodaniu wymaganych plików nagłówkowych i plików źródłowych powinieneś być w stanie bezpośrednio skompilować plik główny. Wyjaśnienie kodu w głównym pliku jest następujące. Nie będę wyjaśniał programu LCD STM8S, ponieważ omówiliśmy to już w poprzednim samouczku.
Celem kodu będzie odczytanie wartości ADC z dwóch pinów i przekonwertowanie ich na wartość napięcia. Będziemy również wyświetlać zarówno wartość ADC, jak i wartość napięcia na wyświetlaczu LCD. Więc użyłem funkcji o nazwie LCD_Print Var, która pobiera zmienną w formacie liczby całkowitej i konwertuje ją na znak, aby wyświetlić ją na wyświetlaczu LCD. Użyliśmy prostych operatorów modułu (%) i dzielenia (/), aby pobrać każdą cyfrę ze zmiennej i wstawić zmienne, takie jak d1, d2, d3 i d4, jak pokazano poniżej. Następnie możemy użyć funkcji LCD_Print_Char do wyświetlenia tych znaków na wyświetlaczu LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Następnie pod funkcją główną mamy zadeklarowane cztery zmienne. Dwa z nich służą do zapisywania wartości ADC (od 0 do 1024), a pozostałe dwa do uzyskania aktualnej wartości napięcia.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Następnie musimy przygotować piny GPIO i konfigurację zegara do odczytu napięcia analogowego. Tutaj będziemy odczytywać napięcie analogowe z pinów AIN2 i AIN6, które są odpowiednio pinami PC4 i PD6. Musimy zdefiniować te pinezki w stanie pływającym, jak pokazano poniżej. Będziemy również włączać zegar peryferyjny dla ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Włącz zegar peryferyjny dla ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Teraz, gdy piny są gotowe, musimy dostać się do nieskończonej pętli while, aby odczytać napięcie analogowe. Ponieważ mamy nasz plik nagłówkowy, możemy łatwo odczytać napięcie analogowe z pinów AIN2 i AIN 6 za pomocą poniższych linii.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Następnym krokiem jest konwersja tego odczytu ADC (0 do 1023) na napięcie analogowe. W ten sposób możemy wyświetlić dokładną wartość napięcia podaną na piny AIN2 i AIN6. Wzory do obliczenia napięcia analogowego można podać przez:
Napięcie analogowe = odczyt ADC * (3300/1023)
W naszym przypadku na kontrolerach STM8S103F3 mamy ADC o rozdzielczości 10-bitowej, więc użyliśmy 1023 (2 ^ 10) . Również na naszym rozwoju zasilamy kontroler napięciem 3,3 V, czyli 3300, więc w powyższych wzorach podzieliliśmy 3300 przez 1023. Około 3300/1023 da nam 3,226, więc w naszym programie mamy następujące wiersze do pomiaru rzeczywistego napięcia ADC za pomocą napięcia ADC.
ADC_voltage_1 = ADC_value_1 * (3,226); // (3300/1023 = ~ 3.226) przekonwertuj wartość ADC 1 na 0 do 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // przekonwertuj wartość ADC 1 na 0 na 3300mV
Pozostała część kodu służy tylko do wyświetlania tych czterech wartości na ekranie LCD. Mamy również opóźnienie 500 ms, więc wyświetlacz LCD jest aktualizowany co 500 ms. Możesz to jeszcze bardziej ograniczyć, jeśli potrzebujesz szybszych aktualizacji.
Odczyt napięcia analogowego z dwóch potencjometrów za pomocą STM8S
Skompiluj kod i prześlij go na swoją płytkę programistyczną. Jeśli pojawi się jakikolwiek błąd kompilacji, upewnij się, że dodałeś wszystkie pliki nagłówkowe i pliki źródłowe, jak omówiono wcześniej. Po załadowaniu kodu powinieneś zobaczyć małą wiadomość powitalną mówiącą „ADC on STM8S”, a następnie powinieneś zobaczyć poniższy ekran.
Wartości D1 i D2 wskazują wartość ADC odpowiednio z pinu Ain2 i AIN6. Po prawej stronie wyświetlane są również równoważne wartości napięcia. Wartość ta powinna być równa napięciu pojawiającemu się odpowiednio na pinie AIN2 i AIN6. Możemy sprawdzić to samo za pomocą multimetru, możemy też zmieniać potencjometry, aby sprawdzić, czy wartość napięcia również odpowiednio się zmienia.
Kompletną pracę można również znaleźć na poniższym filmie. Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się czegoś przydatnego. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej. Możesz również skorzystać z naszych forów, aby rozpocząć dyskusję lub zadać inne pytania techniczne.