- Wymagane składniki
- Opis pinów serwomotoru
- Schemat obwodu
- Sterowanie serwomotorem za pomocą AVR ATmega16
- Programowanie Atmega16 za pomocą USBasp
Silniki serwo są szeroko stosowane tam, gdzie wymagane jest precyzyjne sterowanie, takie jak roboty, maszyny automatyczne, ramię robota itp. Jednak zakres serwomotoru nie ogranicza się do tego i może być używany w wielu zastosowaniach. Aby dowiedzieć się więcej o podstawach, teorii i zasadzie działania serwomotoru, kliknij link.
Wcześniej połączyliśmy serwomotor z wieloma mikrokontrolerami:
- Łączenie serwomotoru z ARM7-LPC2148
- Połączenie silnika serwo z MSP430G2
- Łączenie silnika serwo z STM32F103C8
- Łączenie serwomotoru z mikrokontrolerem PIC za pomocą MPLAB i XC8
- Połączenie serwomotoru z Arduino Uno
- Połączenie serwomotoru z mikrokontrolerem 8051
W tym samouczku połączymy Micro Servo Motor z mikrokontrolerem Atmega16 AVR przy użyciu Atmel Studio 7.0. Silnik serwo jest przystosowany do pracy przy 4,8-6 V. Możemy kontrolować jego kąt obrotu i kierunek, stosując ciąg impulsów lub sygnały PWM. Należy pamiętać, że serwomotory nie mogą poruszać się w pełnym zakresie 360 stopni, dlatego są używane tam, gdzie nie jest wymagany ciągły obrót. Kąt obrotu wynosi 0-180 stopni lub (-90) - (+90) stopni.
Wymagane składniki
- Silnik serwo SG90 Tower Pro Micro
- Układ scalony mikrokontrolera Atmega16
- Oscylator kwarcowy 16 MHz
- Dwa kondensatory 100nF
- Dwa kondensatory 22pF
- Naciśnij przycisk
- Przewody połączeniowe
- Płytka prototypowa
- USBASP v2.0
- Led (dowolny kolor)
Opis pinów serwomotoru
- Czerwony = dodatni zasilacz (4,8 V do 6 V)
- Brązowy = mielony
- Pomarańczowy = sygnał sterujący (pin PWM)
Schemat obwodu
Podłącz wszystkie komponenty, jak pokazano na poniższym schemacie, aby obrócić serwomotor za pomocą mikrokontrolera AVR. Istnieją cztery piny PWM, możemy użyć dowolnego pinu PWM Atmega16. W tym samouczku używamy Pin PD5 (OC1A) do generowania PWM. PD5 jest bezpośrednio podłączony do pomarańczowego przewodu serwomotoru, który jest pinem sygnału wejściowego. Podłącz dowolną kolorową diodę LED do wskaźnika zasilania. Ponadto podłącz jeden przycisk do styku resetowania, aby zresetować Atmega16 w razie potrzeby. Podłącz Atmega16 do odpowiedniego obwodu oscylatora kwarcowego. Cały system będzie zasilany napięciem 5V.
Kompletna konfiguracja będzie wyglądać jak poniżej:
Sterowanie serwomotorem za pomocą AVR ATmega16
Podobnie jak silnik krokowy, silnik serwo nie potrzebuje żadnego zewnętrznego sterownika, np. Sterownika silnika ULN2003 lub L293D. Tylko PWM wystarczy do napędzenia serwomotoru i bardzo łatwo jest wygenerować PWM z mikrokontrolera. Moment obrotowy tego silnika serwo wynosi 2,5 kg / cm, więc jeśli potrzebujesz większego momentu obrotowego, to serwo nie jest odpowiednie.
Jak wiemy, serwomotor poszukuje impulsu co 20 ms, a długość dodatniego impulsu określi kąt obrotu serwomotoru.
Częstotliwość wymagana do uzyskania impulsu 20 ms to 50 Hz (f = 1 / T). Więc dla tego serwomotoru specyfikacja mówi, że dla 0 stopni potrzebujemy 0,388 ms, dla 90 stopni potrzebujemy 1,264 ms, a dla 180 stopni potrzebujemy impulsu 2,14 ms.
Do wygenerowania określonych impulsów użyjemy Timera1 z Atmega16. Częstotliwość procesora wynosi 16 Mz, ale będziemy wykorzystywać tylko 1 Mhz, ponieważ nie mamy wielu urządzeń peryferyjnych podłączonych do mikrokontrolera i nie ma dużego obciążenia mikrokontrolera, więc 1 Mhz wykona zadanie. Prescaler jest ustawiony na 1. Tak więc zegar jest podzielony na 1Mhz / 1 = 1Mhz (1uS), co jest świetne. Timer1 będzie używany jako tryb Fast PWM, tj. Tryb 14. Możesz użyć różnych trybów timerów do wygenerowania żądanego ciągu impulsów. Numer referencyjny znajduje się poniżej, a więcej informacji można znaleźć w oficjalnym arkuszu danych Atmega16.
Aby użyć Timer1 jako szybkiego trybu PWM, potrzebujemy wartości TOP ICR1 (Input Capture Register1). Aby znaleźć TOP wartość, użyj wzoru podanego poniżej:
f pwm = f cpu / nx (1 + TOP)
Można to uprościć, TOP = ( f cpu / ( f pwm xn)) - 1
Gdzie, N = Wartość zestawu preskalera
f cpu = częstotliwość procesora
f pwm = Szerokość impulsu silnika serwomotoru, która wynosi 50 Hz
Teraz oblicz wartość ICR1, ponieważ mamy wszystkie wymagane wartości, N = 1, f cpu = 1MHz, f pwm = 50Hz
Wystarczy wpisać wartości w powyższym wzorze i otrzymamy
ICR1 = 1999
Oznacza to, że aby osiągnąć maksymalny stopień, tj. 180 0, ICR1 powinien wynosić 1999.
Dla kryształu 16 MHz i preskalera ustawionego na 16 będziemy mieć
ICR1 = 4999
Przejdźmy teraz do omówienia szkicu.
Programowanie Atmega16 za pomocą USBasp
Pełny kod AVR do sterowania serwomotorem jest podany poniżej. Kod jest prosty i łatwy do zrozumienia.
Tutaj zakodowaliśmy Atmega16, aby obracał serwomotor od 0 0 do 180 0 i wracał z 180 0 do 0 0. To przejście zakończy się w 9 krokach, tj. 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. W przypadku opóźnienia będziemy używać wewnętrznej biblioteki Atmel Studio tj.
Podłącz USBASP v2.0 i postępuj zgodnie z instrukcjami w tym linku, aby zaprogramować mikrokontroler Atmega16 AVR za pomocą USBASP i Atmel Studio 7.0. Po prostu zbuduj szkic i prześlij za pomocą zewnętrznego łańcucha narzędzi.
Pełny kod z filmem demonstracyjnym jest podany poniżej. Dowiedz się również więcej o silnikach serwo, znając ich znaczenie w robotyce.