- Erforderliche Komponenten
- Pin Beschreibung des Servomotors
- Schaltplan
- Servomotor mit AVR ATmega16 steuern
- Programmieren von Atmega16 mit USBasp
Servomotoren sind weit verbreitet, wenn eine präzise Steuerung erforderlich ist, wie z. B. Roboter, automatisierte Maschinen, Roboterarme usw. Der Umfang des Servomotors ist jedoch nicht auf diese Menge beschränkt und kann in vielen Anwendungen verwendet werden. Um mehr über die Grundlagen, Theorie und Funktionsweise des Servomotors zu erfahren, folgen Sie dem Link.
Wir haben zuvor Servomotoren mit vielen Mikrocontrollern verbunden:
- Schnittstelle zwischen Servomotor und ARM7-LPC2148
- Schnittstelle zwischen Servomotor und MSP430G2
- Servomotor mit STM32F103C8 verbinden
- Schnittstelle zwischen Servomotor und PIC-Mikrocontroller mit MPLAB und XC8
- Schnittstelle zwischen Servomotor und Arduino Uno
- Schnittstelle zwischen Servomotor und 8051-Mikrocontroller
In diesem Tutorial werden wir den Micro Servo Motor mit dem Atmega16 AVR Microcontroller unter Verwendung von Atmel Studio 7.0 verbinden. Der Servomotor ist für eine Leistung von 4,8-6 V ausgelegt. Wir können seinen Drehwinkel und seine Richtung steuern, indem wir Impulsfolgen- oder PWM-Signale anlegen. Beachten Sie, dass sich die Servomotoren nicht für eine vollständige 360-Grad-Drehung bewegen können. Sie werden daher verwendet, wenn keine kontinuierliche Drehung erforderlich ist. Der Drehwinkel beträgt 0-180 Grad oder (-90) - (+90) Grad.
Erforderliche Komponenten
- SG90 Tower Pro Mikro-Servomotor
- Atmega16 Mikrocontroller IC
- 16 MHz Kristalloszillator
- Zwei 100nF Kondensatoren
- Zwei 22pF-Kondensatoren
- Druckknopf
- Überbrückungsdrähte
- Steckbrett
- USBASP v2.0
- LED (beliebige Farbe)
Pin Beschreibung des Servomotors
- Rot = positive Stromversorgung (4,8 V bis 6 V)
- Braun = Boden
- Orange = Steuersignal (PWM-Pin)
Schaltplan
Schließen Sie alle Komponenten wie in der folgenden Abbildung gezeigt an, um den Servomotor mit dem AVR-Mikrocontroller zu drehen. Es gibt vier PWM-Pins, wir können jeden PWM-Pin von Atmega16 verwenden. In diesem Tutorial verwenden wir Pin PD5 (OC1A) zum Generieren von PWM. Der PD5 ist direkt mit dem orangefarbenen Kabel des Servomotors verbunden, der der Eingangssignalstift ist. Schließen Sie eine beliebige Farb-LED für die Betriebsanzeige an. Schließen Sie außerdem einen Druckknopf an den Reset-Pin an, um Atmega16 bei Bedarf zurückzusetzen. Verbinden Sie Atmega16 mit der richtigen Quarzoszillatorschaltung. Das gesamte System wird mit 5 V versorgt.
Das vollständige Setup sieht wie folgt aus:
Servomotor mit AVR ATmega16 steuern
Wie der Schrittmotor benötigt der Servomotor keinen externen Treiber, z. B. den Motortreiber ULN2003 oder L293D. Nur PWM reicht aus, um den Servomotor anzutreiben, und es ist sehr einfach, PWM aus einem Mikrocontroller zu generieren. Das Drehmoment dieses Servomotors beträgt 2,5 kg / cm. Wenn Sie also ein höheres Drehmoment benötigen, ist dieses Servo nicht geeignet.
Wie wir wissen, sucht der Servomotor alle 20 ms einen Impuls und die Länge des positiven Impulses bestimmt den Drehwinkel des Servomotors.
Die Frequenz, die erforderlich ist, um den 20-ms-Impuls zu erhalten, beträgt 50 Hz (f = 1 / T). Also für diesen Servomotor, sagt die Spezifikation, dass für 0 Grad wir 0.388ms benötigen, für 90 Grad brauchen wir 1.264ms und 180 Grad brauchen wir 2.14ms Puls.
Um bestimmte Impulse zu erzeugen, verwenden wir Timer1 von Atmega16. Die CPU-Frequenz beträgt 16 MHz, aber wir werden nur 1 MHz verwenden, da nicht viele Peripheriegeräte an den Mikrocontroller angeschlossen sind und der Mikrocontroller nicht stark belastet ist, sodass 1 MHz die Arbeit erledigt. Der Prescaler ist auf 1 eingestellt. Die Uhr wird also als 1 MHz / 1 = 1 MHz (1 uS) geteilt, was großartig ist. Timer1 wird als schneller PWM-Modus verwendet, dh als Modus 14. Sie können verschiedene Timer-Modi verwenden, um die gewünschte Impulsfolge zu erzeugen. Die Referenz ist unten angegeben. Weitere Beschreibungen finden Sie im offiziellen Atmega16-Datenblatt.
Um Timer1 als schnellen PWM- Modus zu verwenden, benötigen wir den TOP-Wert von ICR1 (Input Capture Register1). Um den TOP-Wert zu finden, verwenden Sie die folgende Formel:
f pwm = f cpu / nx (1 + TOP)
Dies kann vereinfacht werden, TOP = ( f cpu / ( f pwm xn)) - 1
Wobei N = Wert des Prescaler-Sets
f cpu = CPU-Frequenz
f pwm = Impulsbreite des Servomotors, die 50 Hz beträgt
Berechnen Sie nun den ICR1-Wert, da wir alle erforderlichen Werte haben.
N = 1, f cpu = 1 MHz, f pwm = 50 Hz
Geben Sie einfach die Werte in die obige Formel ein und wir werden erhalten
ICR1 = 1999
Dies bedeutet, um den maximalen Grad zu erreichen, dh 180 0, sollte der ICR1 1999 sein.
Für 16-MHz-Quarz und Prescaler auf 16 haben wir
ICR1 = 4999
Lassen Sie uns nun die Skizze diskutieren.
Programmieren von Atmega16 mit USBasp
Der vollständige AVR-Code zur Steuerung des Servomotors ist unten angegeben. Code ist einfach und leicht verständlich.
Hier haben wir den Atmega16 so codiert, dass er den Servomotor von 0 0 auf 180 0 dreht und wieder von 180 0 auf 0 0 zurückkehrt. Dieser Übergang wird in 9 Schritten abgeschlossen, dh 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Für Verzögerungen verwenden wir die interne Bibliothek von Atmel Studio, d. H.
Schließen Sie Ihren USBASP v2.0 an und befolgen Sie die Anweisungen in diesem Link, um den Atmega16 AVR-Mikrocontroller mit USBASP und Atmel Studio 7.0 zu programmieren. Erstellen Sie einfach die Skizze und laden Sie sie mit einer externen Toolchain hoch.
Der vollständige Code mit dem Demonstrationsvideo ist unten angegeben. Erfahren Sie auch mehr über Servomotoren, indem Sie deren Bedeutung in der Robotik kennen.