- Componenten vereist
- Pin Beschrijving van de servomotor
- Schakelschema
- Servomotor besturen met AVR ATmega16
- Atmega16 programmeren met USBasp
Servomotoren worden veel gebruikt waar nauwkeurige besturing vereist is, zoals robots, geautomatiseerde machines, robotarm enz. De reikwijdte van de servomotor is echter niet tot zoveel beperkt en kan in veel toepassingen worden gebruikt. Volg de link om meer te weten over de basis, theorie en werkingsprincipe van servomotor.
We hebben eerder de servomotor met veel microcontrollers gekoppeld:
- Koppeling van servomotor met ARM7-LPC2148
- Koppeling van servomotor met MSP430G2
- Koppeling van servomotor met STM32F103C8
- Koppeling van servomotor met PIC-microcontroller met behulp van MPLAB en XC8
- Servomotor koppelen aan Arduino Uno
- Servomotor-interface met 8051 Microcontroller
In deze tutorial zullen we Micro Servo Motor koppelen aan Atmega16 AVR Microcontroller met Atmel Studio 7.0. De servomotor is geschikt om te werken in 4,8-6V. We kunnen de draaihoek en richting regelen door pulstrein- of PWM-signalen toe te passen. Merk op dat de servomotoren niet kunnen bewegen voor een volledige rotatie van 360 graden, dus worden ze gebruikt waar continue rotatie niet vereist is. De rotatiehoek is 0-180 graden of (-90) - (+90) graden.
Componenten vereist
- SG90 Tower Pro Micro-servomotor
- Atmega16 Microcontroller IC
- 16Mhz kristaloscillator
- Twee 100nF condensatoren
- Twee 22pF condensatoren
- Druk op de knop
- Doorverbindingsdraden
- Breadboard
- USBASP v2.0
- Led (elke kleur)
Pin Beschrijving van de servomotor
- Rood = positieve voeding (4,8 V tot 6 V)
- Bruin = aarde
- Oranje = stuursignaal (PWM-pin)
Schakelschema
Sluit alle componenten aan zoals weergegeven in het onderstaande diagram om de servomotor te draaien met behulp van AVR Microcontroller. Er zijn vier PWM-pinnen, we kunnen elke PWM-pincode van Atmega16 gebruiken. In deze tutorial gebruiken we Pin PD5 (OC1A) voor het genereren van PWM. PD5 is direct verbonden met de oranje draad van de servomotor die een ingangssignaal is. Sluit een willekeurige kleuren-led aan voor de stroomindicator. Sluit ook een drukknop aan op de reset-pin om Atmega16 te resetten wanneer dat nodig is. Verbind Atmega16 met het juiste kristaloscillatorcircuit. Het hele systeem wordt gevoed door 5V-voeding.
De volledige installatie ziet er als volgt uit:
Servomotor besturen met AVR ATmega16
Net als de stappenmotor heeft de servomotor geen externe driver nodig, bijvoorbeeld een ULN2003- of L293D-motordriver. Alleen PWM is voldoende om de servomotor aan te drijven en het is heel eenvoudig om PWM te genereren vanaf een microcontroller. Het koppel van deze servomotor is 2,5 kg / cm, dus heb je meer koppel nodig dan is deze servo niet geschikt.
Zoals we weten, zoekt de servomotor elke 20 ms een puls en zal de lengte van de positieve puls de rotatiehoek van de servomotor bepalen.
De frequentie die nodig is om de puls van 20 ms te krijgen, is 50 Hz (f = 1 / T). Dus voor deze servomotor zegt de specificatie dat voor 0 graden we 0,388 ms nodig hebben, voor 90 graden hebben we 1,264 ms nodig en voor 180 graden hebben we 2,14 ms puls nodig.
Om bepaalde pulsen te genereren, gebruiken we Timer1 van Atmega16. De CPU-frequentie is 16 MHz, maar we zullen slechts 1 MHz gebruiken, omdat we niet veel randapparatuur op de microcontroller hebben aangesloten en de microcontroller niet veel wordt belast, dus 1 MHz zal het werk doen. De Prescaler is ingesteld op 1. De klok is dus verdeeld als 1Mhz / 1 = 1Mhz (1uS), wat geweldig is. Timer1 wordt gebruikt als snelle PWM-modus, dwz modus 14. U kunt verschillende modi van timers gebruiken om de gewenste pulstrein te genereren. De referentie wordt hieronder gegeven en u kunt meer informatie vinden in Atmega16 Official Datasheet.
Om Timer1 als snelle PWM- modus te gebruiken, hebben we de TOP-waarde van ICR1 (Input Capture Register1) nodig. Gebruik de onderstaande formule om de TOP-waarde te vinden:
f pwm = f cpu / nx (1 + TOP)
Dit kan worden vereenvoudigd tot, TOP = ( f cpu / ( f pwm xn)) - 1
Waar, N = waarde van prescaler-set
f cpu = CPU-frequentie
f pwm = pulsbreedte van de servomotor die 50Hz is
Bereken nu de ICR1-waarde, want we hebben alle vereiste waarden, N = 1, f cpu = 1 MHz, f pwm = 50 Hz
Zet gewoon de waarden in bovenstaande formule en we zullen krijgen
ICR1 = 1999
Dit betekent dat om de maximale graad te bereiken, dwz 180 0, de ICR1 1999 moet zijn.
Voor 16 MHz kristal en Prescaler ingesteld op 16, hebben we
ICR1 = 4999
Laten we nu verder gaan met het bespreken van de schets.
Atmega16 programmeren met USBasp
De volledige AVR-code voor het besturen van de servomotor wordt hieronder gegeven. Code is eenvoudig en kan gemakkelijk worden begrepen.
Hier hebben we de Atmega16 gecodeerd om de servomotor van 0 0 naar 180 0 te laten draaien en weer terug te komen van 180 0 naar 0 0. Deze overgang wordt voltooid in 9 stappen, dwz 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Voor vertraging gebruiken we de interne bibliotheek van Atmel Studio, dwz
Sluit uw USBASP v2.0 aan en volg de instructies in deze link om de Atmega16 AVR Microcontroller te programmeren met USBASP en Atmel Studio 7.0. Bouw gewoon de schets en upload deze met behulp van een externe toolchain.
De volledige code met demonstratievideo wordt hieronder gegeven. Leer ook meer over servomotoren door hun belang in robotica te kennen.