- Siłownik
- Sterowanie serwomotorem za pomocą LPC2148 PWM i ADC
- Piny PWM i ADC w ARM7-LPC2148
- Wymagane składniki
- Schemat obwodu i połączenia
- Programowanie ARM7-LPC2148 do sterowania serwomotorem
W naszym poprzednim samouczku połączyliśmy silnik krokowy z ARM7-LPC2148. W tym samouczku będziemy sterować serwomotorem za pomocą ARM7-LPC2148. Silnik serwo ma niewielką przewagę zużycia energii w stosunku do silnika krokowego. Silnik serwo zatrzymuje pobór mocy, gdy pożądane położenie zostanie osiągnięte, ale silnik krokowy pobiera energię, aby zablokować wał w żądanym położeniu. Serwosilniki są najczęściej używane w projektach robotyki ze względu na ich dokładność i łatwą obsługę.
W tym samouczku dowiemy się o silniku serwo i jak połączyć serwo z ARM7-LPC2148. Potencjometr jest również połączony, aby zmieniać położenie wału serwomotoru oraz wyświetlacz LCD do wyświetlania wartości kąta.
Siłownik
Silnik serwo to połączenie silnika prądu stałego, systemu kontroli położenia i przekładni. Obroty serwomotoru są kontrolowane poprzez podanie do niego sygnału PWM, szerokość sygnału PWM decyduje o kącie obrotu i kierunku silnika. Tutaj będziemy używać silnika serwo SG90 w tym samouczku, jest to jeden z najpopularniejszych i najtańszych. SG90 to serwomechanizm 180 stopni. Więc za pomocą tego serwa możemy ustawić oś w zakresie 0-180 stopni:
- Napięcie robocze: + 5 V.
- Typ przekładni: tworzywo sztuczne
- Kąt obrotu: od 0 do 180 stopni
- Waga: 9g
- Moment obrotowy: 2,5 kg / cm
Zanim będziemy mogli rozpocząć programowanie dla silnika serwo, powinniśmy wiedzieć, jaki rodzaj sygnału ma być wysłany do sterowania silnikiem serwo. Powinniśmy zaprogramować MCU, aby wysyłał sygnały PWM do przewodu sygnałowego silnika serwo. W serwomotorze znajduje się obwód sterujący, który odczytuje cykl roboczy sygnału PWM i ustawia wał serwomotoru w odpowiednim miejscu, jak pokazano na poniższym rysunku
Co 20 milisekund Silnik serwo sprawdza puls. Zatem dostosuj szerokość impulsu sygnału, aby obrócić wał silnika.
- Szerokość impulsu 1 ms (1 milisekunda) dla obrotu serwomechanizmu do 0 stopni
- Szerokość impulsu 1,5 ms dla obrotu do 90 stopni (pozycja neutralna)
- Szerokość impulsu 2 ms dla obrotu serwomechanizmu do 180 stopni.
Przed podłączeniem serwa do ARM7-LPC2148, możesz przetestować swoje serwo za pomocą tego obwodu testera serwomotoru. Sprawdź także, w jaki sposób można połączyć serwomotor z innymi mikrokontrolerami:
- Sterowanie serwomotorem za pomocą Arduino
- Połączenie serwomotoru z mikrokontrolerem 8051
- Sterowanie serwomotorem za pomocą MATLAB
- Sterowanie serwomotorem z Raspberry Pi
- Połączenie silnika serwo z MSP430G2
- Łączenie silnika serwo z STM32F103C8
Sterowanie serwomotorem za pomocą LPC2148 PWM i ADC
Silnik serwo może być sterowany przez LPC2148 za pomocą PWM. Podając sygnał PWM do pinu PWM SERVO z okresem 20ms i częstotliwością 50Hz możemy ustawić wał serwomotoru pod kątem 180 stopni (-90 do +90).
Potencjometr służy do zmiany cyklu pracy sygnału PWM i obracania wału serwomotoru, metoda ta jest realizowana za pomocą modułu ADC w LPC2148. Dlatego potrzebujemy obu koncepcji PWM i ADC do zaimplementowania w tym samouczku. Więc uprzejmie zapoznaj się z naszymi poprzednimi samouczkami, aby nauczyć się PWM i ADC w ARM7-LPC2148.
- Jak korzystać z PWM w ARM7-LPC2148
- Jak korzystać z ADC w ARM-LPLC2148
Piny PWM i ADC w ARM7-LPC2148
Poniższy obraz przedstawia piny PWM i ADC w LPC2148. Żółte pola wskazują (6) piny PWM, a czarne pole wskazuje (14) piny ADC.
Wymagane składniki
Sprzęt komputerowy
- ARM7-LPC2148
- Moduł wyświetlacza LCD (16x2)
- Silnik serwo (SG-90)
- Regulator napięcia 3,3 V.
- Potencjometr 10k (2 numery)
- Płytka prototypowa
- Podłączanie przewodów
Oprogramowanie
- Keil uVision5
- Flash Magic Tool
Schemat obwodu i połączenia
Poniższa tabela przedstawia połączenie między serwomotorem i ARM7-LPC2148:
SERWO PINY |
ARM7-LPC2148 |
CZERWONY (+ 5 V) |
+ 5V |
BRĄZOWY (GND) |
GND |
POMARAŃCZOWY (PWM) |
P0.1 |
Pin P0.1 jest wyjściem PWM LPC2148.
Poniższa tabela przedstawia połączenia obwodów między wyświetlaczem LCD a ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (wybór rejestru) |
P0.6 |
E (Włącz) |
P0.12 |
D4 (styk danych 4) |
P0.13 |
D5 (styk danych 5) |
P0.14 |
D6 (styk danych 6) |
P0.15 |
D7 (styk danych 7) |
GND |
VSS, R / W, K. |
+ 5V |
VDD, A |
Poniższa tabela przedstawia połączenia pomiędzy ARM7 LPC2148 a potencjometrem z regulatorem napięcia 3,3V.
3.3 V Regulator napięcia IC |
Funkcja pinów |
ARM-7 LPC2148 Pin |
1. lewy kołek |
- Ve z GND |
Pin GND |
2. kołek środkowy |
Regulowane wyjście + 3,3 V. |
Do wejścia potencjometru i wyjścia potencjometru do P0.28 w LPC2148 |
3. prawy pin |
+ Ve od 5 V. WEJŚCIE |
+ 5V |
Punkty, na które należy zwrócić uwagę
1. Regulator napięcia 3,3 V jest tu używany do dostarczania analogowej wartości wejściowej do styku ADC (P0.28) LPC2148. Ponieważ używamy zasilania 5 V, musimy regulować napięcie regulatorem napięcia 3,3 V.
2. Potencjometr służy do zmiany napięcia w zakresie od (0 V do 3,3 V), aby zapewnić wejście analogowe (ADC) do styku P0.28 złącza LPC2148.
3. Styk P0.1 LPC2148 zapewnia wyjście PWM do serwomotoru w celu sterowania położeniem silnika.
4. Zgodnie z wartością wejścia analogowego (ADC) pozycja serwomotoru zmienia się od (0 do 180 stopni) poprzez pin wyjściowy PWM w P0.1 LPC2148.
Programowanie ARM7-LPC2148 do sterowania serwomotorem
Aby zaprogramować ARM7-LPC2148 potrzebujemy narzędzia keil uVision & Flash Magic. Używamy kabla USB do programowania ARM7 Stick przez port micro USB. Piszemy kod za pomocą Keila i tworzymy plik hex, a następnie plik HEX jest sflashowany do pendrive'a ARM7 przy użyciu Flash Magic. Aby dowiedzieć się więcej o instalacji keil uVision i Flash Magic oraz o tym, jak z nich korzystać, kliknij łącze Pierwsze kroki z mikrokontrolerem ARM7 LPC2148 i zaprogramuj go za pomocą Keil uVision.
Kroki związane z konfiguracją LPC2148 dla PWM i ADC do sterowania serwomotorem
Krok 1: - Dołącz niezbędne pliki nagłówkowe do kodowania LPC2148
#zawierać
Krok 2: - Następną rzeczą jest skonfigurowanie PLL do generowania zegara, ponieważ ustawia zegar systemowy i zegar peryferyjny LPC2148 zgodnie z potrzebami programistów. Maksymalna częstotliwość zegara dla LPC2148 to 60 MHz. Poniższe linie służą do konfiguracji generowania zegara PLL.
void initilizePLL (void) // Funkcja wykorzystująca PLL do generowania zegara { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; podczas gdy (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 3: - Następną rzeczą do zrobienia jest wybranie pinów PWM i funkcji PWM LPC2148 za pomocą rejestru PINSEL. Używamy PINSEL0, ponieważ używamy P0.1 do wyjścia PWM LPC2148.
PINSEL0 - = 0x00000008; // Ustawiam pin P0.1 LPC2148 jako PWM3
Krok 4: - Następnie musimy ZRESETOWAĆ timery za pomocą PWMTCR (Rejestr Kontroli Czasu).
PWMTCR = 0x02; // Zresetuj i wyłącz licznik dla PWM
Następnie ustaw wartość przeskalowania, która decyduje o ustawieniu rozdzielczości PWM.
PWMPR = 0x1D; // Wartość rejestru prescale
Krok 5: - Następnie ustaw PWMMCR (rejestr kontrolny dopasowania PWM), ponieważ ustawia działanie, takie jak reset, przerwania dla PWMMR0 i PWMMR3.
PWMMCR = 0x00000203; // Resetuj i przerywaj przy dopasowaniu MR0, przerywaj przy dopasowaniu MR3
Krok 6: - Maksymalny okres kanału PWM jest ustawiany za pomocą PWMMR0, a Ton cyklu pracy PWM jest początkowo ustawiany na 0,65 ms
PWMMR0 = 20000; // Okres czasu fali PWM, 20 ms PWMMR3 = 650; // Ton fali PWM 0,65 ms
Krok 7: - Następnie musimy ustawić Latch Enable na odpowiednie rejestry dopasowania za pomocą PWMLER
PWMLER = 0x09; // Włącz zatrzask dla PWM3 i PWM0
(Używamy PWMMR0 i PWMMR3) Więc włącz odpowiedni bit, ustawiając 1 w PWMLER
Krok 8: - Aby włączyć wyjście PWM do pinu, musimy użyć PWMTCR do włączenia liczników PWM Timer i trybów PWM.
PWMPCR = 0x0800; // Włącz PWM3 i PWM 0, sterowane pojedynczym zboczem PWM PWMTCR = 0x09; // Włącz PWM i licznik
Krok 9: - Teraz musimy uzyskać wartości potencjometrów do ustawienia cyklu pracy PWM z pinu P0.28 ADC. Tak więc używamy modułu ADC w LPC2148 do konwersji potencjometrów wejścia analogowego (0 do 3,3 V) na wartości ADC (0 do 1023).
Krok 10: - Do wyboru pinu ADC P0.28 w LPC2148 używamy
PINSEL1 = 0x01000000; // Ustawienie P0.28 jako ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Ustawianie zegara i PDN do konwersji A / D
Kolejne wiersze przechwytują wejście analogowe (od 0 do 3,3 V) i przekształcają je na wartość cyfrową (od 0 do 1023). A następnie te wartości cyfrowe są dzielone przez 4, aby zamienić je na (od 0 do 255) i ostatecznie podawane jako wyjście PWM w pinie P0.1 LPC2148. Tutaj konwertujemy wartości z 0-1023 na 0-255, dzieląc je przez 4, ponieważ PWM z LPC2148 ma rozdzielczość 8-bitową (28).
AD0CR - = (1 << 1); // Wybierz kanał AD0.1 w czasie opóźnienia rejestru ADC (10); AD0CR - = (1 << 24); // Rozpocznij konwersję A / D while ((AD0DR1 & (1 << 31)) == 0); // Sprawdź bit DONE w rejestrze danych ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Pobierz WYNIK z rejestru danych ADC dutycycle = adcvalue / 4; // formuła obliczająca wartości cyklu roboczego od (0 do 255) PWMMR1 = cykl pracy; // ustaw wartość cyklu roboczego na PWM rejestr dopasowania PWMLER - = (1 << 1); // Włącz wyjście PWM z wartością cyklu roboczego
Krok 11: - Następnie wyświetlamy te wartości w module wyświetlacza LCD (16X2). Więc dodajemy następujące wiersze, aby zainicjować moduł wyświetlacza LCD
Void LCD_INITILIZE (void) // Funkcja do przygotowania wyświetlacza LCD { IO0DIR = 0x0000FFF0; // Ustawia pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 jako opóźnienie wyjścia OUTPUT (20); LCD_SEND (0x02); // Inicjalizacja lcd w 4-bitowym trybie pracy LCD_SEND (0x28); // 2 linie ( 16X2 ) LCD_SEND (0x0C); // Wyświetl kursor wyłączony LCD_SEND (0x06); // Kursor automatycznego inkrementacji LCD_SEND (0x01); // Wyświetl wyczyść LCD_SEND (0x80); // Pierwsza pozycja w pierwszej linii }
Ponieważ połączyliśmy wyświetlacz LCD w trybie 4-bitowym z LPC2148, musimy wysłać wartości, które mają być wyświetlane jako półbajt przez półbajt (górny półbajt i dolny półbajt). Więc używane są następujące wiersze.
void LCD_DISPLAY (char * msg) // Funkcja do drukowania znaków wysyłanych jeden po drugim { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Wysyła górny półbajt IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH, aby wydrukować dane IO0CLR = 0x00000020; // RW LOW Czas opóźnienia trybu zapisu (2); IO0CLR = 0x00000040; // EN = 0, RS i RW niezmienione (tj. RS = 1, RW = 0) czas opóźnienia (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Wysyła niższy półbajt IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; czas opóźnienia (2); IO0CLR = 0x00000040; czas opóźnienia (5); i ++; } }
Aby wyświetlić te wartości ADC i PWM, używamy następujących wierszy w funkcji int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Wyświetl wartość ADC (od 0 do 1023) angle = (adcvalue / 5.7); // Formuła do konwersji wartości ADC na kąt (od o do 180 stopni) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", kąt); LCD_DISPLAY (anglevalue);
Pełny kod i opis wideo samouczka podano poniżej