- Komponenter krävs
- Stiftbeskrivning av servomotor
- Kretsschema
- Kontrollerande servomotor med AVR ATmega16
- Programmera Atmega16 med USBasp
Servomotorer används i stor utsträckning där exakt kontroll krävs såsom robotar, automatiserade maskiner, robotarmar etc. Servomotorns omfattning är dock inte begränsad till så mycket och kan användas i många applikationer. För att lära dig mer om servomotorens grunder, teori och arbetsprincip, följ länken.
Vi har tidigare kopplat servomotor med många mikrokontroller:
- Gränssnitts Servomotor med ARM7-LPC2148
- Gränssnitts servomotor med MSP430G2
- Gränssnitts Servomotor med STM32F103C8
- Interfacing Servomotor med PIC Microcontroller med MPLAB och XC8
- Interfacing Servomotor med Arduino Uno
- Servomotorgränssnitt med 8051 mikrokontroller
I den här handledningen kommer vi att ansluta Micro Servo Motor till Atmega16 AVR Microcontroller med Atmel Studio 7.0. Servomotorn är klassad för att fungera i 4,8-6V. Vi kan styra dess rotationsvinkel och riktning genom att använda pulståg- eller PWM-signaler. Observera att servomotorerna inte kan röra sig för 360 graders rotation, så de används där kontinuerlig rotation inte krävs. Rotationsvinkeln är 0-180 grader eller (-90) - (+90) grader.
Komponenter krävs
- SG90 Tower Pro Micro Servomotor
- Atmega16 Microcontroller IC
- 16Mhz kristalloscillator
- Två 100nF kondensatorer
- Två 22pF kondensatorer
- Tryckknapp
- Bygeltrådar
- Bakbord
- USBASP v2.0
- Led (valfri färg)
Stiftbeskrivning av servomotor
- Röd = Positiv strömförsörjning (4,8V till 6V)
- Brun = mark
- Orange = Kontrollsignal (PWM-stift)
Kretsschema
Anslut alla komponenter enligt bilden nedan för att rotera servomotorn med AVR Microcontroller. Det finns fyra PWM-stift, vi kan använda valfri PWM-stift av Atmega16. I denna handledning använder vi Pin PD5 (OC1A) för att generera PWM. PD5 är direkt ansluten till orange ledning på servomotorn som är ingångssignalstift. Anslut vilken färgled som helst för strömindikatorn. Anslut också en tryckknapp i Återställ stift för att återställa Atmega16 vid behov. Anslut Atmega16 med rätt kristalloscillatorkrets. Hela systemet drivs av 5V-matning.
Komplett installation kommer att se ut nedan:
Kontrollerande servomotor med AVR ATmega16
Liksom stegmotor behöver servomotorn ingen extern drivrutin, t.ex. ULN2003 eller L293D-motorförare. Bara PWM räcker för att köra servomotorn och det är väldigt enkelt att generera PWM från en mikrokontroller. Vridmomentet på denna servomotor är 2,5 kg / cm, så om du behöver större vridmoment är denna servo inte lämplig.
Som vi vet att servomotorn söker en puls var 20: e ms och längden på den positiva pulsen bestämmer servomotorns rotationsvinkel.
Frekvensen som krävs för att få 20 ms-pulsen är 50Hz (f = 1 / T). Så för denna servomotor säger specifikationen att för 0 grader behöver vi 0,388ms, för 90 grader behöver vi 1,264ms och för 180 grader behöver vi 2,14ms puls.
För att generera specificerade pulser använder vi Timer1 of Atmega16. CPU-frekvensen är 16Mz men vi använder bara 1Mhz eftersom vi inte har så mycket kringutrustning ansluten till mikrokontroller och det inte finns mycket belastning på mikrokontroller, så 1Mhz kommer att göra jobbet. Prescaler är inställd på 1. Så klockan är uppdelad som 1Mhz / 1 = 1Mhz (1uS) vilket är bra. Timer1 kommer att användas som snabbt PWM-läge, dvs läge 14. Du kan använda olika lägen för timers för att generera önskat pulståg. Referensen ges nedan och du kan hitta mer beskrivning i Atmega16 officiella datablad.
För att använda Timer1 som snabbt PWM- läge behöver vi TOP-värdet på ICR1 (Input Capture Register1). För att hitta TOP-värdet använd formeln nedan:
f pwm = f cpu / nx (1 + TOP)
Detta kan förenklas för att
TOPP = ( f cpu / ( f pwm xn)) - 1
Var, N = värdet på förskjutningsapparaten
f cpu = CPU Frequencyy
f pwm = Servomotorns pulsbredd som är 50Hz
Beräkna nu ICR1-värdet eftersom vi har alla värden som krävs, N = 1, f cpu = 1MHz, f pwm = 50Hz
Lägg bara värdena i ovanstående formel så får vi det
ICR1 = 1999
Detta innebär att uppnå maximal grad, dvs 180 0 ICR1 ska vara 1999.
För 16MHz crystal och Prescaler inställd på 16, kommer vi att ha
ICR1 = 4999
Låt oss nu gå vidare för att diskutera skissen.
Programmera Atmega16 med USBasp
Komplett AVR-kod för styrning av Servomotor ges nedan. Koden är enkel och kan förstås enkelt.
Här har vi kodat Atmega16 för att rotera servomotorn från 0 0 till 180 0 och kommer tillbaka igen från 180 0 till 0 0. Denna övergång kommer att slutföras i 9 steg, dvs 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. För fördröjning använder vi det interna biblioteket i Atmel Studio, dvs.
Anslut din USBASP v2.0 och följ instruktionerna i denna länk för att programmera Atmega16 AVR Microcontroller med USBASP och Atmel Studio 7.0. Bygg bara skissen och ladda upp med extern verktygskedja.
Komplett kod med demonstrationsvideo ges nedan. Lär dig också mer om servomotorer genom att känna till deras betydelse i robotik.