- Необходими компоненти
- Pin описание на серво мотора
- Електрическа схема
- Управление на серво мотор с AVR ATmega16
- Програмиране на Atmega16 с помощта на USBasp
Сервомоторите са широко използвани там, където се изисква прецизно управление като роботи, автоматизирани машини, роботизирана ръка и др. Въпреки това обхватът на серво мотора не е ограничен до толкова и може да се използва в много приложения. За да научите повече за основите, теорията и принципа на работа на серво мотора, следвайте връзката.
Преди това сме свързали сервомотора с много микроконтролери:
- Свързващ серво мотор с ARM7-LPC2148
- Взаимодействие на серво мотор с MSP430G2
- Свързващ серво мотор със STM32F103C8
- Взаимодействие на серво мотор с PIC микроконтролер с помощта на MPLAB и XC8
- Взаимодействие на серво мотор с Arduino Uno
- Интерфейс на серво мотора с микроконтролер 8051
В този урок ще свържем Micro Servo Motor с Atmega16 AVR Microcontroller, използвайки Atmel Studio 7.0. Серво моторът е класиран да работи в 4.8-6V. Можем да контролираме ъгъла на въртене и посоката му, като прилагаме импулсни сигнали или ШИМ сигнали. Обърнете внимание, че сервомоторите не могат да се движат при пълно завъртане на 360 градуса, така че те се използват там, където не се изисква непрекъснато въртене. Ъгълът на въртене е 0 -180 градуса или (-90) - (+90) градуса.
Необходими компоненти
- Микро серво мотор SG90 Tower Pro
- IC микроконтролер Atmega16
- 16Mhz кристален осцилатор
- Два кондензатора 100nF
- Два кондензатора 22pF
- Натисни бутона
- Джъмперни проводници
- Макет
- USBASP v2.0
- LED (всеки цвят)
Pin описание на серво мотора
- Червено = положително захранване (4.8V до 6V)
- Кафяво = Земя
- Оранжево = контролен сигнал (ШИМ щифт)
Електрическа схема
Свържете всички компоненти, както е показано на диаграмата по-долу, за да завъртите сервомотора с помощта на AVR микроконтролер. Има четири PWM щифта, можем да използваме всеки PWM щифт на Atmega16. В този урок използваме Pin PD5 (OC1A) за генериране на ШИМ. PD5 е директно свързан към оранжев проводник на серво мотора, който е щифт на входния сигнал. Свържете всеки цветен светодиод за индикатор на захранването. Също така свържете един бутон в Reset pin за нулиране на Atmega16, когато е необходимо. Свържете Atmega16 с подходяща верига на кристален осцилатор. Цялата система ще се захранва от 5V захранване.
Пълната настройка ще изглежда по-долу:
Управление на серво мотор с AVR ATmega16
Подобно на стъпковия двигател, сервомоторът не се нуждае от външен драйвер, например ULN2003 или L293D двигател. Само ШИМ е достатъчен за задвижване на серво мотора и е много лесно да се генерира ШИМ от микроконтролер. Въртящият момент на този серво мотор е 2,5 кг / см, така че ако се нуждаете от по-голям въртящ момент, този серво не е подходящ.
Както знаем, че серво моторът търси импулс на всеки 20ms и дължината на положителния импулс ще определи ъгъла на въртене на серво мотора.
Честотата, необходима за получаване на 20ms импулс, е 50Hz (f = 1 / T). Така че за този серво мотор, спецификацията казва, че за 0 градуса се нуждаем от 0,388ms, за 90 градуса се нуждаем от 1,264 ms и за 180 градуса се нуждаем от 2,14ms импулс.
За генериране на определени импулси ще използваме Timer1 на Atmega16. Честотата на процесора е 16Mz, но ние ще използваме само 1Mhz, тъй като нямаме много периферни устройства, свързани към микроконтролера и няма много натоварване на микроконтролера, така че 1Mhz ще свърши работа. Предскалерът е настроен на 1. Така часовникът е разделен на 1Mhz / 1 = 1Mhz (1uS), което е страхотно. Таймерът1 ще се използва като бърз ШИМ режим, т.е. режим 14. Можете да използвате различни режими на таймери, за да генерирате желания импулсен механизъм. Препратката е дадена по-долу и можете да намерите повече описание в официалния лист с данни на Atmega16.
За да използваме Timer1 като бърз PWM режим, ще ни трябва ТОП стойността на ICR1 (Input Capture Register1). За да намерите ТОП стойността използвайте формулата, дадена по-долу:
f pwm = f cpu / nx (1 + ТОП)
Това може да бъде опростено, НАГОРЕ = ( f cpu / ( f pwm xn)) - 1
Къде, N = Стойността на зададения предскалер
f CPU = Честота на процесора
f pwm = ширина на импулса на серво мотора, която е 50Hz
Сега изчислете стойността на ICR1, тъй като имаме цялата необходима стойност, N = 1, f cpu = 1MHz, f pwm = 50Hz
Просто поставете стойностите в горната формула и ще получим
ICR1 = 1999
Това означава да се постигне максимална степен, т.е. 180 0 ICR1 трябва да бъде 1999.
За 16MHz кристал и Prescaler, зададени на 16, ще имаме
ICR1 = 4999
Сега да продължим да обсъждаме скицата.
Програмиране на Atmega16 с помощта на USBasp
Пълният AVR код за управление на сервомотора е даден по-долу. Кодът е прост и може да се разбере лесно.
Тук сме кодирали Atmega16 за завъртане на сервомотора от 0 0 до 180 0 и връщане отново от 180 0 до 0 0. Този преход ще завърши в 9 стъпки, т.е. 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. За забавяне ще използваме вътрешната библиотека на Atmel Studio, т.е.
Свържете вашия USBASP v2.0 и следвайте инструкциите в тази връзка, за да програмирате Atmega16 AVR Microcontroller с помощта на USBASP и Atmel Studio 7.0. Просто изградете скицата и качете с помощта на външна верига от инструменти.
Пълният код с демонстрационно видео е даден по-долу. Също така научете повече за сервомоторите, като знаете тяхното значение в роботиката.