| Next revision | Previous revision |
| de:examples:motor:servo [2010/11/15 11:21] – angelegt Wember | de:examples:motor:servo [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ====== Servomotor ====== | ====== Servomotor ====== |
| |
| //Necessary knowledge: [HW] [[en:hardware:homelab:motor]], [HW] [[en:hardware:homelab:sensor]], [AVR] [[en:avr:io]], [LIB] [[en:software:homelab:library:module:motor]], [LIB] [[en:software:homelab:library:adc]]// | //Notwendiges Wissen: [HW] [[en:hardware:homelab:motor]], [HW] [[en:hardware:homelab:sensor]], [AVR] [[en:avr:io]], [LIB] [[en:software:homelab:library:module:motor]], [LIB] [[en:software:homelab:library:adc]]// |
| |
| ===== Theorie ===== | ===== Theorie ===== |
| |
| [{{ :examples:motor:servo:motor_servomotor.jpg?220|RC servo motor}}] | [{{ :examples:motor:servo:motor_servomotor.jpg?220|RC Servomotor}}] |
| |
| [{{ :examples:motor:servo:motor_servo_signal_position.png?220|The relationship between width of the signal and position of Servo PWM.}}] | [{{ :examples:motor:servo:motor_servo_signal_position.png?220|Das Verhältnis von Signalweite und Position der PWM des Servomotors.}}] |
| |
| Servomotoren werden oft in ferngesteuerten (RC) Modellen benutzt und sind nehr nützlich in kleinen robotischen Anwendungen, weil sie sehr kompakt und günstig sind. | Servomotoren werden oft in funkgesteuerten (RC) Modellen benutzt und sind sehr nützlich für kleine robotischen Anwendungen, da sie sehr kompakt und günstig sind. |
| Ein RC-Servomotor hat einen eingebauten Gleichstrommotor, eine Gearbox, Positionsfeedbacksensor, und Steuerelektronik. RC-Servomotren können mit einem externen PWM-Signal gesteuert werden. Wenn das Signal der RC Servotiming entspricht, "beschreibt" es normalerweise ein Positionsinput für die Servosteuerelektronik. | Ein RC-Servomotor verfügt über einen eingebauten Gleichstrommotor, ein Getriebe, einen Positionsfeedbacksensor (meistens ein Potentiometer, und eine Steuerelektronik. RC-Servomotren können mit einem externen PWM-Signal gesteuert werden. Wenn das Signal den RC Servotiming-Vorraussetzungen entspricht, "beschreibt" es normalerweise ein Positionsinput für die Servo-Steuer-Elektronik. Die Servomotor Elektronik vergleicht die Achsenstellung mit der eingegebenen Position und versucht eine übereinstimmende Position zu erreichen. Das Positionskontrollsignal ist eine durchgehende Rechteckschwingung, wie in dem Bild dargestellt. |
| Die Servomotor Elektronik vergleicht die Achsenstellung mit der eigegebenen Position, während versucht wird eine passende Position für die Achse zu finden. Das Positionskontrollsignal ist eine durchgehende Rechteckschwingung, wie in dem Bild dargestellt. | |
| |
| RC (//radio-controlled//) Servomotoren sind sehr verbreitete Aktuatoren in den Robotics und im Modellbau. RC-Servomotoren bestehen aus einem kleinen Gleichstrommotor, einer Übersetzung und der logischen Kontrolleinheit. Normalerweise versucht der Rotor des Servomotors sich in eine bestimmte Position zu bringen und diese zu halten. Die Position des Rotors hängt von dem Kontrollsignal ab, dass der Servomotor empfangen hat. Je nach Typ des Motor kann der maximale Drehwinkel des Motors variieren. Servomotoren, die sich konstant drehen, sind selten. In diesem Fall gibt das Kontrollsignal nicht den Rotationswinkel, sondern die Geschwindigkeit an. | RC (//radio-controlled//) Servomotoren sind in der Robotik und im Modellbau sehr verbreitete Antriebe. Sie bestehen aus einem kleinen Gleichstrommotor, einer Übersetzung und der logischen Kontrolleinheit. Normalerweise versucht der Rotor des Servomotors sich in eine bestimmte Position zu bringen und diese zu halten. Die Position des Rotors hängt von dem Kontrollsignal ab, dass der Servomotor empfangen hat. Je nach Typ des Motors kann der maximale Drehwinkel des Motors variieren. Servomotoren, die sich konstant drehen, sind selten. In diesem Fall gibt das Kontrollsignal nicht den Rotationswinkel, sondern die Rotationsgeschwindigkeit an. Servomotor-Hacks sind auch sehr verbreitet. Hierdurch wird ein positionsbestimmender Servomotor zu einem konstant drehenden. In diesem Fall wird das Feedback Potentiometer durch zwei Widerstände ersetzt, und der mechanische Widerstand, welcher verhindert, dass eine vollständige Rotation stattfinden kann, wird entfernt. |
| Servomotoren "hacks" sind auch sehr verbreitet. Das bewirkt, dass die Positionsbestimmung des Motor sich konstant drehen lässt. In diesem Fall ist das Feedback Potentiometer durch zwei Widerstände ersetzt worden, und der mechanische Widerstand der verhindert, dass eine vollständige Rotation stattfinden kann, wurde entfernt. | Eine wichtige Eigenschaft des Servomotors ist das Kraft-Gewicht-Verhältnis. |
| Ein wichtiger Charakter der Servomotors ist das Kraft-Gewicht-Verhältnis. | |
| |
| Das Kontrollsignal des Servomotors ist ein speziellen Pulsweitenmoduliertes Signal (PWM), wo die Pulsweite die Position des Rotors angibt. Die Periode des Signals ist 20 ms (50 Hz) und die Weite der hohen Periode ist 1 ms - 2 ms. | Das Kontrollsignal des Servomotors ist ein speziell pulsweitenmoduliertes Signal (PWM), bei dem die Pulsweite die Position des Rotors angibt. Die Periode des Signals liegt bei 20 ms (50 Hz) und die Weite der hohen Periode ist 1 ms - 2 ms. 1 ms markiert die eine äußerste Position 2 ms die Andere. 1,5 ms markieren die Mittelposition des Servomotorrotors. |
| 1 ms markiert die eine äußerste Position 2 ms die Andere. 1,5 ms markieren die Mittelposition des Servomotor Rotors. | |
| |
| Traditionelle RC-Servomotoren sind auch bekannt als analoge Servomotoren. Dies liegt daran, dass in dem letzten Jahrzehnt so genannte digitale Servomotoren auf den Markt kamen. Der Unterschied zwischen beiden, dass analoge RC-Servomotoren mit einem 50 Hz PWM Signal gesteuert werden, digitale RC-Servomotoren werden durch einen Microcontroller mit einem höherfrequenten Signal gesteuert. Das Inputsignal ist das Gleiche, jedoch ist durch die höhere Modulationsfrequenz wird eine schnellere und präzisere Positionsbestimmung ermöglicht. | Traditionelle RC-Servomotoren sind auch bekannt als analoge Servomotoren. Dies liegt daran, dass in dem letzten Jahrzehnt so genannte digitale Servomotoren auf den Markt kamen. Der Unterschied zwischen beiden besteht darin, dass analoge RC-Servomotoren mit einem 50 Hz PWM Signal gesteuert werden, digitale RC-Servomotoren durch einen Mikrocontroller mit einem höherfrequenten Signal. Das Inputsignal ist das Gleiche, jedoch ist durch die höhere Modulationsfrequenz wird eine schnellere und präzisere Positionsbestimmung ermöglicht. |
| |
| ~~CL~~ | ~~CL~~ |
| ===== Übung ===== | ===== Übung ===== |
| |
| Auf dem Board des HomeLab Motormoduls sind 2 Anschlüsse für RC-Servomotoren. | Auf dem Platine des HomeLab Motormoduls sind 2 Anschlüsse für RC-Servomotoren vorhanden. |
| Die PWM-Enden der Anschlüsse sind an den Pins PB5 und PB6 am Microcontroller angeschlossen, dessen sekundäre Funktion das Vergleichen der Einheiten A und B von Timer 1 sind. Timer 1 kann ein PWM Signal erzeugen, und daher ist das Steuern eines Motors sehr einfach zu programmieren. Das einzige schwierige ist das Einstellen des Timers. | Die PWM-Enden der Stecker sind an den Pins PB5 und PB6 am Mikrocontroller angeschlossen, dessen sekundäre Funktion das Vergleichen der Einheiten A und B von Timer 1 ist. Timer 1 kann ein PWM Signal erzeugen, und daher ist das Steuern eines Motors sehr einfach zu programmieren. Die einzige Schwierigkeit besteht im Einstellen des Timers. |
| |
| | Timer 1 muss in den PWM-Produktionsmodus eingestellt werden, wobei der maximale Wert des Timers mit dem ICR Register bestimmt wird. Durch Änderung des maximales Wertes im Programm und im Taktgeber des Timers, kann die präzise PWM Frequenz zur Steuerung des Servomotors bestimmt werden. Mit dem Vergleichs-Register des Timers werden die Längen für beiden hohen Semi-Perioden des Signals bestimmt. Der Timer hat eine spezielle Vergleichseinheit, welche den Wert des Zählwerks beobachtet und für den Fall, dass es gleich dem Wert des Vergleichs-Registers ist, den Output-Wert der Vergleichseinheit ändert. Es folgt ein Programm-Code der Servomotor-Steuerbibliothek des HomeLab. Für die Ausführung nutzt es Parameter für Timer welche durch Makrofunktionen bestimmt werden. Zum Beispiel, wird die Periode durch die F-CPU Konstante angegeben, welche die Taktrate des Mikrocontrollers angibt. Wenn man Makros nutzt, müssen die Parameter des Timers für verschiedene Taktzyklen nicht berechnet werden und der Compiler konvertiert die Operationen mit Makros zu Konstanten. Dadurch erhöht sich der Programmspeicher nicht, und es wird auch nicht mehr Rechenzeit benötigt. |
| Der Timer 1 muss in den PWM-Produktionsmodus eingestellt werden, wo der maximale Wert des Timers mit dem ICR Register bestimmt wird. Durch ändern des maximales Wertes im programm und im Taktgeber des Timers, kann die präzise PWM Frequenz um den Servomotor zu steuern bestimmt werden. Mit dem Vergleichs-Register des Timers werden die Längen für beiden hohen Semi-Perioden des Signals bestimmt. | |
| Der Timer hat eine spezielle Vergleichseinheit, welche den Wert des Zählwerks beobachtet und für den Fall, dass es gleich dem Wert des Vergleichs-Registers ist, ändert es des Output-Wert der Vergleichseinheit. Es folgt ein Programm-Code der Servomotor-Steuer-Library von HomeLab. | |
| Für die Ausführung nutzt es Parameter für Timer welche durch Macrofunktionen bestimmt werde. Zum Beispiel, wird die Periode durch die F-CPU Kosntante angegeben, welche die Taktrate des Microcontrollers angibt. | |
| Wenn man Macros nutzt, brauch man nicht die Parameter des Timers für verschiedene Taktzyklen zu berechnen und der Compiler konvertiert die Operationen mit Macros zu Konstante, daher steigt der Programmspeicher nicht, und es wird auch nicht mehr Rechenzeit benötigt. | |
| |
| |
| <code c> | <code c> |
| // | // |
| // The value of the timer (20 ms)for achieving the full period of PWM. | // Der WErt des Timers (20 ms) zum ERreichen der vollen PWM-Periode. |
| // F_CPU is the clock rate of the microcontroller which is divided with 50 Hz and 8. | // F_CPU ist die Taktrate des Mikrocontrollers, welche durch 50 Hz und 8 dividiert wird. |
| // | // |
| // | // |
| | |
| // | // |
| // Middle position of PWM servo (5 ms / 20 ms) | // Mittlere Position der PWM des Servomotors (5 ms / 20 ms) |
| // Middle position is 15/200 of full period. | // Mittlere Position liegt bei 15/200 der vollen Periode. |
| // | // |
| #define PWM_MIDDLE_POS (PWM_PERIOD * 15 / 200) | #define PWM_MIDDLE_POS (PWM_PERIOD * 15 / 200) |
| | |
| // | // |
| // Factor for converting the percents (-100% to 100%)to periods. | // Faktor zur Konvertierung von Prozenten in Perioden(-100% to 100%). |
| // +1 is added to ensure that semi periods would reach to the boundaries of 1 ms and 2 ms or // a little over. | // +1 wird addiert um sicherzustellen, dass die Halbperioden die Grenzen von 1 ms und 2 ms erreichen oder // etwas höher liegen. |
| // | // |
| #define PWM_RATIO (PWM_PERIOD / 20 / 2 / 100 + 1) | #define PWM_RATIO (PWM_PERIOD / 20 / 2 / 100 + 1) |
| |
| // | // |
| // Set-up of the pins. | // Einrichtung der Pins. |
| // | // |
| static pin servo_pins[2] = | static pin servo_pins[2] = |
| |
| // | // |
| // Preparing the servo motor for working. | // Servomotor vorbereiten. |
| // | // |
| void servomotor_init(unsigned char index) | void servomotor_init(unsigned char index) |
| { | { |
| // The pin of PWM signal for output. | // Pin des PWM Signals als Output. |
| pin_setup_output(servo_pins[index]); | pin_setup_output(servo_pins[index]); |
| | |
| // Setup of timer 1. | // Einrichtung von Timer 1. |
| // Prescaler = 8 | // Vorzähler = 8 |
| // Fast PWM mode, where TOP = ICR | // Schneller PWM Modus, wobei TOP = ICR |
| // OUTA and OUTB to low in comparisson. | // OUTA und OUTB auf low im Vergleich. |
| timer1_init_fast_pwm( | timer1_init_fast_pwm( |
| TIMER1_PRESCALE_8, | TIMER1_PRESCALE_8, |
| TIMER1_FAST_PWM_OUTPUT_DISABLE); | TIMER1_FAST_PWM_OUTPUT_DISABLE); |
| | |
| // Determining the period by maximum value. | // Festlegung der Periode durch maximalen Wert. |
| timer1_set_input_capture_value(PWM_PERIOD); | timer1_set_input_capture_value(PWM_PERIOD); |
| } | } |
| |
| // | // |
| // Determining the position of the servo motor. | // Festlegung der Postition des Servomotors. |
| // The parameter of the position is from -100% to +100%. | // Parameter der Position liegen zwischen -100% und +100%. |
| // | // |
| void servomotor_position(unsigned char index, signed short position) | void servomotor_position(unsigned char index, signed short position) |
| </code> | </code> |
| |
| Das Beispielprogramm nutzt beschriebene Funktionen der HomeLab Library. Am Anfang des Programms wird der erste Servomotor PWM-Signal Generator gestartet, mit der //servomotor_init// Funktion. Der Wert der Position des Servomotors wird durch die Kanalnummer 3 des ADC erhalten, wo ein Potentiometer am Sensorboard angeschlossen ist. | Das Beispielprogramm nutzt beschriebene Funktionen der HomeLab Bibliothek. Am Anfang des Programms wird der erste PWM-Signal Generator des Servomotors mit der //servomotor_init// Funktion gestartet. Der Wert der Position des Servomotors wird durch die Kanalnummer 3 des Analog-Digital-Konverters (ADC) empfangen, an dem ein Potentiometer an der Sensorplatine angeschlossen ist. Um die Reichweite von -100 % bis +100 %, die für die Steuerung des Servomotors notwendig, ist zu erhalten wird die Hälfte des Maximums (512) vom ADC Wert abgezogen und das Ergebnis durch fünf dividiert. Das Ergebnis ist +/- 102, kleine Ungenauigkeiten können unbeachtet bleiben, da Servomotoren sich auch in der Relation des PWM-Signals und des Drehwinkels unterscheiden. Die finale PWM Halbperiodenweite in Anwendungen muss über das "Try-and-Error"-Verfahren gefunden werden. Auch wenn die Funksteuerungen von RC-Modellen Möglichkeiten für ein präzises Setup besitzen. Wenn das Programm läuft, wird die Rotorposition des Servomotors je nach Position des Potentiometers verändert. |
| Um die Reichweite -100 % - +100 % die für die Steuerung des Servomotors notwendig ist zu erhalten wird die Hälfte des Maximums (512) vom ADC Wert abgezogen und das Ergebnis wird durch 5 dividiert. Das Ergebnis ist +/- 102, aber kleine Ungenauigkeiten werden nicht gezählt, da Servomotren sich auch in der Relation des PWM-Signals und des Drehwinkels unterscheiden. Die finale PWM Halbperioden Weite in Anwendungen muss über das "Try-and-Error"-Verfahren gefunden werden. Die Fernsteuerungen von RC-Modellen haben auch Möglichkeiten für ein präzises Setup. Wenn das Programm läuft, wird die Rotorposition des Servomotors je nach Position des Potentiometers verändert. | |
| |
| <code c> | <code c> |
| // | // |
| // Testing program of the motors module of the HomeLab kit. | // Testprogramm des Motormoduls des HomeLab kit. |
| // | // |
| #include <homelab/adc.h> | #include <homelab/adc.h> |
| |
| // | // |
| // Main program. | // Hauptprogramm. |
| // | // |
| int main(void) | int main(void) |
| short position; | short position; |
| |
| // Set-up of the ADC. | // Einrichtung des ADC. |
| adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); | adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); |
| |
| // Set-up of the motor. | // Einrichtung des Motors. |
| servomotor_init(0); | servomotor_init(0); |
| |
| // Endless loop. | // Endlosschleife. |
| while (true) | while (true) |
| { | { |
| // Reading the position of the potentiometer and converting the range of | // Auslesen der Position aus dem Potentiometer und Konvertiereung der Reichweite |
| // the servo motor. | // des Servomotors. |
| position = ((short)adc_get_value(3) - (short)512) / (short)5; | position = ((short)adc_get_value(3) - (short)512) / (short)5; |
| |
| // Determining the position of the servo motor. | // Festlegung der Position des Servomotors. |
| servomotor_position(0, position); | servomotor_position(0, position); |
| } | } |
| } | } |
| </code> | </code> |