This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| de:examples:motor:servo [2010/11/23 14:19] – Wember | de:examples:motor:servo [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Servomotor ====== | ||
| + | // | ||
| + | |||
| + | ===== Theorie ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Servomotoren werden oft in funkgesteuerten (RC) Modellen benutzt und sind sehr nützlich für kleine robotischen Anwendungen, | ||
| + | Ein RC-Servomotor verfügt über einen eingebauten Gleichstrommotor, | ||
| + | |||
| + | RC (// | ||
| + | Eine wichtige Eigenschaft des Servomotors ist das Kraft-Gewicht-Verhältnis. | ||
| + | |||
| + | 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. | ||
| + | |||
| + | 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~~ | ||
| + | |||
| + | ===== Übung ===== | ||
| + | |||
| + | Auf dem Platine des HomeLab Motormoduls sind 2 Anschlüsse für RC-Servomotoren vorhanden. | ||
| + | Die PWM-Enden der Stecker sind an den Pins PB5 und PB6 am Mikrocontroller angeschlossen, | ||
| + | |||
| + | 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, | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Der WErt des Timers (20 ms) zum ERreichen der vollen PWM-Periode. | ||
| + | // F_CPU ist die Taktrate des Mikrocontrollers, | ||
| + | // | ||
| + | // | ||
| + | #define PWM_PERIOD | ||
| + | |||
| + | // | ||
| + | // Mittlere Position der PWM des Servomotors (5 ms / 20 ms) | ||
| + | // Mittlere Position liegt bei 15/200 der vollen Periode. | ||
| + | // | ||
| + | #define PWM_MIDDLE_POS | ||
| + | |||
| + | // | ||
| + | // Faktor zur Konvertierung von Prozenten in Perioden(-100% to 100%). | ||
| + | // +1 wird addiert um sicherzustellen, | ||
| + | // | ||
| + | #define PWM_RATIO | ||
| + | |||
| + | // | ||
| + | // Einrichtung der Pins. | ||
| + | // | ||
| + | static pin servo_pins[2] = | ||
| + | { | ||
| + | PIN(B, 5), PIN(B, 6) | ||
| + | }; | ||
| + | |||
| + | // | ||
| + | // Servomotor vorbereiten. | ||
| + | // | ||
| + | void servomotor_init(unsigned char index) | ||
| + | { | ||
| + | // Pin des PWM Signals als Output. | ||
| + | pin_setup_output(servo_pins[index]); | ||
| + | |||
| + | // Einrichtung von Timer 1. | ||
| + | // Vorzähler = 8 | ||
| + | // Schneller PWM Modus, wobei TOP = ICR | ||
| + | // OUTA und OUTB auf low im Vergleich. | ||
| + | timer1_init_fast_pwm( | ||
| + | TIMER1_PRESCALE_8, | ||
| + | TIMER1_FAST_PWM_TOP_ICR, | ||
| + | TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, | ||
| + | TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, | ||
| + | TIMER1_FAST_PWM_OUTPUT_DISABLE); | ||
| + | |||
| + | // Festlegung der Periode durch maximalen Wert. | ||
| + | timer1_set_input_capture_value(PWM_PERIOD); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // Festlegung der Postition des Servomotors. | ||
| + | // Parameter der Position liegen zwischen -100% und +100%. | ||
| + | // | ||
| + | void servomotor_position(unsigned char index, signed short position) | ||
| + | { | ||
| + | switch (index) | ||
| + | { | ||
| + | case 0: | ||
| + | timer1_set_compare_match_unitA_value( | ||
| + | PWM_MIDDLE_POS + position * PWM_RATIO); | ||
| + | break; | ||
| + | |||
| + | case 1: | ||
| + | timer1_set_compare_match_unitB_value( | ||
| + | PWM_MIDDLE_POS + position * PWM_RATIO); | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Das Beispielprogramm nutzt beschriebene Funktionen der HomeLab Bibliothek. Am Anfang des Programms wird der erste PWM-Signal Generator des Servomotors mit der // | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Testprogramm des Motormoduls des HomeLab kit. | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Hauptprogramm. | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | short position; | ||
| + | |||
| + | // Einrichtung des ADC. | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Einrichtung des Motors. | ||
| + | servomotor_init(0); | ||
| + | |||
| + | // Endlosschleife. | ||
| + | while (true) | ||
| + | { | ||
| + | // Auslesen der Position aus dem Potentiometer und Konvertiereung der Reichweite | ||
| + | // des Servomotors. | ||
| + | position = ((short)adc_get_value(3) - (short)512) / (short)5; | ||
| + | |||
| + | // Festlegung der Position des Servomotors. | ||
| + | servomotor_position(0, | ||
| + | } | ||
| + | } | ||
| + | </ | ||