- Componente necesare
- Pin Descriere servomotor
- Diagrama circuitului
- Controlul servomotorului cu AVR ATmega16
- Programarea Atmega16 folosind USBasp
Servomotorele sunt utilizate pe scară largă acolo unde este necesar un control precis, cum ar fi roboți, mașini automate, brațe robotizate etc. Cu toate acestea, domeniul de aplicare al servomotorului nu este limitat la atât de mult și poate fi utilizat în multe aplicații. Pentru a afla mai multe despre elementele de bază, teoria și principiul de funcționare al servomotorului, urmați linkul.
Am interfațat anterior Servo Motor cu multe microcontrolere:
- Interfațarea servomotorului cu ARM7-LPC2148
- Interfațarea servomotorului cu MSP430G2
- Interfațarea servomotorului cu STM32F103C8
- Interfațarea servomotorului cu microcontrolerul PIC utilizând MPLAB și XC8
- Interfațarea servomotorului cu Arduino Uno
- Interfață servomotor cu microcontroler 8051
În acest tutorial, vom interfața Micro Servo Motor cu Atmega16 AVR Microcontroller folosind Atmel Studio 7.0. Servomotorul este funcționat în 4,8-6V. Putem controla unghiul său de rotație și direcție prin aplicarea semnalelor de impulsuri sau a semnalelor PWM. Rețineți că servomotorele nu se pot deplasa pentru o rotație completă de 360 de grade, deci sunt utilizate acolo unde nu este necesară rotația continuă. Unghiul de rotație este 0 -180 grade sau (-90) - (+90) grade.
Componente necesare
- SG90 Tower Pro Micro Servo Motor
- IC microcontroler Atmega16
- Oscilator de cristal de 16 MHz
- Două condensatoare 100nF
- Două condensatoare de 22pF
- Apasa butonul
- Sârme jumper
- Breadboard
- USBASP v2.0
- Led (orice culoare)
Pin Descriere servomotor
- Roșu = sursă de alimentare pozitivă (4,8V până la 6V)
- Brown = Ground
- Portocaliu = Semnal de control (pin PWM)
Diagrama circuitului
Conectați toate componentele așa cum se arată în diagrama de mai jos pentru a roti servomotorul utilizând microcontrolerul AVR. Există patru pini PWM, putem folosi orice pini PWM de la Atmega16. În acest tutorial folosim Pin PD5 (OC1A) pentru generarea PWM. PD5 este conectat direct la firul portocaliu al servomotorului, care este pinul de semnal de intrare. Conectați orice led color pentru indicatorul de alimentare. De asemenea, conectați un singur buton în pinul Reset pentru a reseta Atmega16 ori de câte ori este necesar. Conectați Atmega16 cu circuitul oscilator de cristal adecvat. Tot sistemul va fi alimentat cu alimentare de 5V.
Configurarea completă va arăta ca mai jos:
Controlul servomotorului cu AVR ATmega16
La fel ca motorul pas cu pas, motorul servo nu are nevoie de niciun driver extern, de exemplu driverul de motor ULN2003 sau L293D. Doar PWM este suficient pentru a acționa servomotorul și este foarte ușor să generați PWM de la un microcontroler. Cuplul acestui servomotor este de 2,5 kg / cm, deci dacă aveți nevoie de un cuplu mai mare, atunci acest servo nu este potrivit.
După cum știm, servomotorul caută un impuls la fiecare 20 ms, iar lungimea impulsului pozitiv va determina unghiul de rotație al servomotorului.
Frecvența necesară pentru a obține impulsul de 20 ms este de 50Hz (f = 1 / T). Deci, pentru acest servomotor, specificația spune că pentru 0 grade avem nevoie de 0,388 ms, pentru 90 de grade avem nevoie de 1,264 ms și pentru 180 de grade avem nevoie de impuls de 2,14 ms.
Pentru a genera impulsuri specificate vom folosi Timer1 al Atmega16. Frecvența procesorului este de 16Mz, dar vom folosi doar 1Mhz, deoarece nu avem prea multe periferice conectate la microcontroler și nu există prea multă încărcare pe microcontroler, deci 1Mhz va face treaba. Prescalerul este setat la 1. Deci ceasul este împărțit ca 1Mhz / 1 = 1Mhz (1uS) ceea ce este grozav. Timer1 va fi utilizat ca mod rapid PWM, adică modul 14. Puteți utiliza diferite moduri de temporizatoare pentru a genera trenul de impulsuri dorit. Referința este dată mai jos și puteți găsi mai multe descrieri în foaia de date oficială Atmega16.
Pentru a utiliza Timer1 ca mod PWM rapid, vom avea nevoie de valoarea TOP a ICR1 (Input Capture Register1). Pentru a găsi valoarea TOP folosiți formula dată mai jos:
f pwm = f cpu / nx (1 + TOP)
Acest lucru poate fi simplificat, TOP = ( f cpu / ( f pwm xn)) - 1
Unde, N = Valoarea setului Prescaler
f cpu = CPU Frequencey
f pwm = Lățimea impulsului servomotorului care este de 50Hz
Acum calculați valoarea ICR1 deoarece avem toate valorile necesare, N = 1, f cpu = 1MHz, f pwm = 50Hz
Doar puneți valorile în formula de mai sus și vom obține
ICR1 = 1999
Aceasta înseamnă a atinge gradul maxim, adică 180 0 ICR1 ar trebui să fie 1999.
Pentru cristalul de 16 MHz și Prescalerul setat la 16, vom avea
ICR1 = 4999
Acum să trecem mai departe pentru a discuta schița.
Programarea Atmega16 folosind USBasp
Codul AVR complet pentru controlul servomotorului este dat mai jos. Codul este simplu și poate fi înțeles cu ușurință.
Aici am codat Atmega16 pentru a roti servomotorul de la 0 0 la 180 0 și a reveni din nou de la 180 0 la 0 0. Această tranziție se va finaliza în 9 pași, adică 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Pentru întârziere, vom folosi biblioteca internă a Atmel Studio ie
Conectați-vă USBASP v2.0 și urmați instrucțiunile din acest link pentru a programa microcontrolerul Atmega16 AVR utilizând USBASP și Atmel Studio 7.0. Pur și simplu construiți schița și încărcați utilizând un lanț de instrumente extern.
Codul complet cu Video demonstrativ este prezentat mai jos. Aflați, de asemenea, mai multe despre servo-motoare, cunoscând importanța lor în robotică.