- Komponenter, der kræves
- Stiftbeskrivelse af servomotor
- Kredsløbsdiagram
- Styring af servomotor med AVR ATmega16
- Programmering af Atmega16 ved hjælp af USBasp
Servomotorer anvendes i vid udstrækning, hvor der kræves præcis kontrol, såsom robotter, automatiserede maskiner, robotarme osv. Servomotorens omfang er dog ikke begrænset til så meget og kan bruges i mange applikationer. For at vide mere om det grundlæggende, teori og funktionsmåde for servomotor, følg linket.
Vi har tidligere interfacet Servomotor med mange mikrocontrollere:
- Interfacing servomotor med ARM7-LPC2148
- Interfacing Servomotor med MSP430G2
- Interfacing servomotor med STM32F103C8
- Interfacing Servomotor med PIC Microcontroller ved hjælp af MPLAB og XC8
- Interfacing Servomotor med Arduino Uno
- Servomotorgrænseflade med 8051 mikrokontroller
I denne vejledning vil vi interface Micro Servo Motor med Atmega16 AVR Microcontroller ved hjælp af Atmel Studio 7.0. Servomotoren er klassificeret til at fungere i 4,8-6V. Vi kan styre rotations- og retningsvinklen ved at anvende pulstog- eller PWM-signaler. Bemærk, at servomotorer ikke kan bevæge sig for fuld 360 graders rotation, så de bruges, hvor kontinuerlig rotation ikke er påkrævet. Rotationsvinklen er 0-180 grader eller (-90) - (+90) grader.
Komponenter, der kræves
- SG90 Tower Pro Micro Servomotor
- Atmega16 Microcontroller IC
- 16Mhz krystaloscillator
- To 100nF kondensatorer
- To 22pF kondensatorer
- Trykknap
- Jumper Wires
- Brødbræt
- USBASP v2.0
- Led (enhver farve)
Stiftbeskrivelse af servomotor
- Rød = Positiv strømforsyning (4,8V til 6V)
- Brun = Jord
- Orange = kontrolsignal (PWM-pin)
Kredsløbsdiagram
Tilslut alle komponenterne som vist i diagrammet nedenfor for at dreje servomotoren ved hjælp af AVR Microcontroller. Der er fire PWM-pins, vi kan bruge enhver PWM-pin fra Atmega16. I denne vejledning bruger vi Pin PD5 (OC1A) til at generere PWM. PD5 er direkte forbundet til orange ledning på servomotor, som er indgangssignalstift. Tilslut en hvilken som helst farvediode til strømindikator. Tilslut også en trykknap i Reset pin for at nulstille Atmega16 når det er nødvendigt. Forbind Atmega16 med et korrekt krystaloscillatorkredsløb. Hele systemet får strøm fra 5V-forsyning.
Komplet opsætning vil se ud som nedenfor:
Styring af servomotor med AVR ATmega16
Ligesom trinmotor har servomotor ikke brug for nogen ekstern driver, f.eks. ULN2003 eller L293D-motordriver. Bare PWM er nok til at drive servomotoren, og det er meget let at generere PWM fra en mikrocontroller. Momentet på denne servomotor er 2,5 kg / cm, så hvis du har brug for større drejningsmoment, er denne servo ikke egnet.
Som vi ved, at servomotoren søger en puls hver 20 ms, og længden af den positive puls bestemmer servomotorens rotationsvinkel.
Frekvensen, der kræves for at få 20 ms-pulsen, er 50Hz (f = 1 / T). Så for denne servomotor siger specifikationen, at vi for 0 grader har brug for 0.388ms, for 90 grader har vi brug for 1.264ms og for 180 grader har vi brug for 2.14ms puls.
For at generere specificerede impulser bruger vi Timer1 fra Atmega16. CPU-frekvensen er 16Mz, men vi bruger kun 1Mhz, da vi ikke har meget perifert udstyr tilsluttet til microcontroller, og der ikke er meget belastning på microcontroller, så 1Mhz vil gøre jobbet. Prescaler er indstillet til 1. Så uret er opdelt som 1Mhz / 1 = 1Mhz (1uS), hvilket er fantastisk. Timer1 vil blive brugt som hurtig PWM-tilstand, dvs. tilstand 14. Du kan bruge forskellige tilstande af timere til at generere det ønskede pulstog. Henvisningen er angivet nedenfor, og du kan finde mere beskrivelse i Atmega16 officielle datablad.
For at bruge Timer1 som hurtig PWM- tilstand har vi brug for TOP-værdien af ICR1 (Input Capture Register1). For at finde TOP-værdien skal du bruge formlen nedenfor:
f pwm = f cpu / nx (1 + TOP)
Dette kan forenkles til, TOP = ( f cpu / ( f pwm xn)) - 1
Hvor, N = værdi af prescaler-sæt
f cpu = CPU Frequencyy
f pwm = Servomotorens pulsbredde, som er 50Hz
Beregn nu ICR1-værdien, da vi har alle krævede værdier, N = 1, f cpu = 1MHz, f pwm = 50Hz
Bare sæt værdierne i ovenstående formel, så får vi det
ICR1 = 1999
Denne midler for at nå maksimal grad dvs 180 0 den ICR1 bør være 1999.
For 16MHz krystal og Prescaler indstillet til 16, har vi det
ICR1 = 4999
Lad os nu gå videre og diskutere skitsen.
Programmering af Atmega16 ved hjælp af USBasp
Komplet AVR-kode til styring af servomotor er angivet nedenfor. Koden er enkel og kan let forstås.
Her har vi kodet Atmega16 for at rotere servomotoren fra 0 0 til 180 0 og kommer tilbage igen fra 180 0 til 0 0. Denne overgang gennemføres i 9 trin, dvs. 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. For forsinkelse bruger vi det interne bibliotek i Atmel Studio, dvs.
Tilslut din USBASP v2.0, og følg instruktionerne i dette link for at programmere Atmega16 AVR Microcontroller ved hjælp af USBASP og Atmel Studio 7.0. Bare bygg skitse og upload ved hjælp af ekstern værktøjskæde.
Komplet kode med demonstrationsvideo er angivet nedenfor. Lær også mere om servomotorer ved at kende deres betydning i robotteknologi.