- Komponenter kreves
- Pin Beskrivelse av Servomotor
- Kretsdiagram
- Kontrollerende servomotor med AVR ATmega16
- Programmering av Atmega16 ved hjelp av USBasp
Servomotorer brukes mye der det kreves presis kontroll, for eksempel roboter, automatiserte maskiner, robotarm osv. Imidlertid er omfanget av servomotoren ikke begrenset til så mye og kan brukes i mange bruksområder. For å vite mer om det grunnleggende, teorien og arbeidsprinsippet til servomotoren følger du lenken.
Vi har tidligere grensesnitt Servo Motor med mange mikrokontrollere:
- Grensesnitt Servomotor med ARM7-LPC2148
- Grensesnitt Servomotor med MSP430G2
- Grensesnitt Servomotor med STM32F103C8
- Grensesnitt Servomotor med PIC Microcontroller ved bruk av MPLAB og XC8
- Interfacing Servo Motor med Arduino Uno
- Servomotorgrensesnitt med 8051 mikrokontroller
I denne opplæringen vil vi grensesnitt Micro Servo Motor med Atmega16 AVR Microcontroller ved bruk av Atmel Studio 7.0. Servomotoren er vurdert til å fungere i 4,8-6V. Vi kan kontrollere rotasjonsvinkelen og retningen ved å bruke pulstog- eller PWM-signaler. Merk at servomotorene ikke kan bevege seg for full 360 graders rotasjon, så de brukes der kontinuerlig rotasjon ikke er nødvendig. Rotasjonsvinkelen er 0-180 grader eller (-90) - (+90) grader.
Komponenter kreves
- SG90 Tower Pro Micro Servomotor
- Atmega16 Microcontroller IC
- 16Mhz krystalloscillator
- To kondensatorer på 100nF
- To 22pF kondensatorer
- Trykknapp
- Jumper Wires
- Brettbrett
- USBASP v2.0
- Led (hvilken som helst farge)
Pin Beskrivelse av Servomotor
- Rød = Positiv strømforsyning (4,8V til 6V)
- Brun = Bakken
- Oransje = Kontrollsignal (PWM-stift)
Kretsdiagram
Koble til alle komponentene som vist i diagrammet nedenfor for å rotere servomotoren ved hjelp av AVR Microcontroller. Det er fire PWM-pinner, vi kan bruke hvilken som helst PWM-pinne av Atmega16. I denne opplæringen bruker vi Pin PD5 (OC1A) for å generere PWM. PD5 er direkte koblet til oransje ledning på servomotoren som er inngangssignalpinne. Koble til hvilken som helst fargeledning for strømindikator. Koble også til en trykknapp i Reset pin for å tilbakestille Atmega16 når det er nødvendig. Koble Atmega16 med riktig krystalloscillatorkrets. Hele systemet får strøm fra 5V forsyning.
Komplett oppsett vil se ut som nedenfor:
Kontrollerende servomotor med AVR ATmega16
I likhet med trinnmotor trenger ikke servomotor noen ekstern driver, for eksempel ULN2003 eller L293D-motordriver. Bare PWM er nok til å kjøre servomotoren, og det er veldig enkelt å generere PWM fra en mikrokontroller. Dreiemomentet på denne servomotoren er 2,5 kg / cm, så hvis du trenger større dreiemoment, er denne servoen ikke egnet.
Som vi vet at servomotoren søker en puls hver 20ms, og lengden på den positive pulsen vil bestemme rotasjonsvinkelen til servomotoren.
Frekvensen som kreves for å få 20ms-pulsen er 50Hz (f = 1 / T). Så for denne servomotoren sier spesifikasjonen at for 0 grader trenger vi 0,388ms, for 90 grader trenger vi 1,264ms og for 180 grader trenger vi 2,14ms puls.
For å generere spesifiserte pulser vil vi bruke Timer1 av Atmega16. CPU-frekvensen er 16Mz, men vi bruker bare 1Mhz da vi ikke har så mye periferiutstyr som er koblet til mikrokontroller, og det ikke er mye belastning på mikrokontroller, så 1Mhz vil gjøre jobben. Prescaler er satt til 1. Så klokken er delt som 1Mhz / 1 = 1Mhz (1uS), noe som er flott. Timer1 vil bli brukt som rask PWM-modus, dvs. Mode 14. Du kan bruke forskjellige moduser for timere for å generere ønsket pulstog. Referansen er gitt nedenfor, og du finner mer beskrivelse i Atmega16 offisielle datablad.
For å bruke Timer1 som rask PWM- modus trenger vi TOP-verdien til ICR1 (Input Capture Register1). For å finne TOP-verdien bruk formelen gitt nedenfor:
f pwm = f cpu / nx (1 + TOPP)
Dette kan forenkles til, TOPP = ( f cpu / ( f pwm xn)) - 1
Hvor, N = Verdien av Prescaler sett
f cpu = CPU Frequencyy
f pwm = Servomotorens pulsbredde som er 50Hz
Beregn nå ICR1-verdien ettersom vi har alle nødvendige verdier, N = 1, f cpu = 1MHz, f pwm = 50Hz
Bare sett verdiene i formelen ovenfor, så får vi det
ICR1 = 1999
Dette betyr å oppnå maksimal grad, dvs. 180 0 ICR1 skal være 1999.
For 16MHz krystall og prescaler satt til 16, vil vi ha
ICR1 = 4999
La oss nå gå videre til å diskutere skissen.
Programmering av Atmega16 ved hjelp av USBasp
Fullstendig AVR-kode for styring av servomotor er gitt nedenfor. Koden er enkel og kan forstås lett.
Her har vi kodet Atmega16 for å rotere servomotoren fra 0 0 til 180 0 og kommer tilbake igjen fra 180 0 til 0 0. Denne overgangen vil fullføres I 9 trinn, dvs. 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. For forsinkelse bruker vi det interne biblioteket til Atmel Studio, dvs.
Koble USBASP v2.0 og følg instruksjonene i denne lenken for å programmere Atmega16 AVR Microcontroller ved hjelp av USBASP og Atmel Studio 7.0. Bare bygg skissen og last opp ved hjelp av ekstern verktøykjede.
Fullstendig kode med demonstrasjonsvideo er gitt nedenfor. Lær også mer om servomotorer ved å vite hvor viktig de er i robotikk.