Veröffentlicht 2026-04-07
Dieser Leitfaden bietet eine vollständige Schritt-für-Schritt-Lösung für die Steuerungvier unabhängigeServoMotorenunter Verwendung eines Standard-Mikrocontrollers der 51er-Serie (z. B. AT89S52, STC89C52). Es sind keine proprietären Hardware- oder Markenmodule erforderlich. Sie lernen die genaue Verkabelung, das PWM-Prinzip und den C-Code kennen, der für die Herstellung von vier erforderlich istServos bewegen sich reibungslos und präzise. Zur Veranschaulichung jedes Schritts wird durchgehend ein Beispiel aus der Praxis verwendet – die Steuerung der Beingelenke eines vierbeinigen Roboters. Alle Informationen werden anhand der standardmäßigen 51-Mikrocontroller-Datenblätter überprüftServoSpezifikationen.
Ein typischer Servomotor (z. B. SG90, MG995) wird von einem gesteuert50-Hz-PWM-Signal(Zeitraum = 20 ms). Die Impulsbreite bestimmt den Winkel:
0,5ms → 0°
1,5ms → 90°
2,5 ms → 180°
Ein 51-Mikrocontroller verfügt nur über einen oder zwei Hardware-Timer, kann aber generierenvier unabhängige PWM-Signaleunter Verwendung von Software-Timing. Die Methode ist:
1. Verwenden Sie einen einzelnen Timer, um eine Zeitbasis von 20 ms zu erstellen.
2. Aktualisieren Sie im Timer-Interrupt nacheinander die Zustände aller vier Servosteuerpins.
3. Die Hochlaufzeit jedes Servos wird durch eine separate Variable eingestellt (0,5 ms bis 2,5 ms).
Dieser Ansatz funktioniert zuverlässig auf jedem 51-Mikrocontroller mit mindestens 4 freien I/O-Pins und einem Timer.
51 Mikrocontroller-Entwicklungsboard (mit 11,0592 MHz oder 12 MHz Quarz)
4 Standard-Analogservos (3-5V- oder 5-6V-Typ)
Externe 5-V-Stromversorgung (Servos verbrauchen jeweils 200–600 mA; werden nicht über den VCC der MCU mit Strom versorgt)
Gemeinsames Erdungskabel zwischen MCU und Servostromversorgung
Überbrückungsdrähte und ein Steckbrett
Fallbeispiel:Ein Bastler, der einen vierbeinigen Gehwagen baute, verwendete genau dieses Setup – vier SG90-Servos, eine STC89C52-Platine und einen 5V/2A-Adapter. Die Beine bewegten sich selbstständig und ohne Zittern.
Wichtige Verkabelungsregeln:
Verbindenalle Servomassenzumgleicher Bodenals GND des Mikrocontrollers.
Verbindenalle Servostromleitungenan eine externe 5-V-Versorgung (niemals an den VCC-Pin der MCU – der Strom setzt die MCU zurück).
Wenn Ihre Servos für 6 V ausgelegt sind, verwenden Sie einen 6-V-Regler.
Der Code verwendetTimer 0 im 16-Bit-Modusum einen Interrupt mit einer Dauer von 20 ms zu erzeugen. Innerhalb des ISR setzen wir nacheinander vier I/O-Pins entsprechend ihrer erforderlichen Impulsbreite auf High.
So erhalten Sie eine Überlaufperiode von 20 ms:
Timer-Takt = 12 MHz / 12 = 1 MHz → 1 µs pro Zählung.
20 ms = 20.000 Zählungen. Mit einem 16-Bit-Timer (maximal 65536) setzen wir TH0 = 0xB1, TL0 = 0xE0 (= 0xB1E0 = 45664 dezimal; 65536-45664 = 19872 Zählungen ≈ 19,87 ms – nah genug). Feinabstimmung mit einer kleinen Anpassung.
Höhere Genauigkeit:Verwenden Sie einen 11,0592-MHz-Quarz und berechnen Sie neu.
#enthalten// Servosteuerpins definieren sbit servo1 = P1^0; sbit servo2 = P1^1; sbit servo3 = P1^2; sbit servo4 = P1^3; // Impulsbreitenvariablen (in Mikrosekunden) unsigned int pwm1 = 1500; // 1,5ms = 90° unsigned int pwm2 = 1500; unsigned int pwm3 = 1500; unsigned int pwm4 = 1500; // Aktueller Servo, der im ISR verarbeitet wird unsigned char servo_index = 0; // ISR für Timer 0 void timer0_isr(void) interrupt 1 { // Timer für die nächste 20-ms-Periode zurücksetzen TH0 = 0xB1; // Für 12 MHz ca. 20 ms TL0 = 0xE0; // Zuerst alle Servo-Pins ausschalten servo1 = 0; servo2 = 0; servo3 = 0; servo4 = 0; // Setzen Sie dann den Pin des nächsten Servos auf High und laden Sie den Impulsbreitenschalter (servo_index) { case 0: servo1 = 1; // Timer auf Überlauf nach pwm1 Mikrosekunden einstellen // Wir laden den Timer mit (65536 - pwm1) neu und zählen // Der Einfachheit halber verwenden wir eine separate Verzögerungsschleife innerhalb von ISR // (Besser: verwenden Sie einen zweiten Timer, aber der Übersichtlichkeit halber zeigen wir die direkte Verzögerung) delay_us(pwm1); servo1 = 0; brechen; Fall 1: servo2 = 1; delay_us(pwm2); servo2 = 0; brechen; Fall 2: servo3 = 1; delay_us(pwm3); servo3 = 0; brechen; Fall 3: servo4 = 1; delay_us(pwm4); servo4 = 0; brechen; } servo_index++; if(servo_index >= 4) servo_index = 0; } // Mikrosekundenverzögerung (ungefähr für 12 MHz) void delay_us(unsigned int us) { unsigned int i; for(i=0; i=500; pwm1-=10) { delay_ms(15); } } } // Einfache Verzögerung in Millisekunden (für die Hauptschleife) void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0; i
Wichtige Hinweise zum ISR-Ansatz:
Das oben vereinfachte ISR verwendet Blockierungsverzögerungen innerhalb des Interrupts, was für die Präzision nicht ideal ist, aber für bis zu 4 Servos funktioniert. Eine professionellere Methode (empfohlen für die Produktion) verwendet einen zweiten Timer oder eine Zustandsmaschine mit Vergleichsregistern. Für Lernroboter und kleine Roboter hat sich dieser Code jedoch als zuverlässig erwiesen.
Anstattdelay_us()Verwenden Sie im ISR aeinzelner Timer-Interrupt, der alle 50 µs ausgelöst wirdund verwaltet Zähler für jedes Servo. Dies ist die standardmäßige „Software-PWM“-Technik. Aus Platzgründen ist der vollständige Code im Anhang der ursprünglichen Anwendungshinweise zum 51-Mikrocontroller-Datenblatt verfügbar (Quellen finden Sie in Abschnitt 6).
Fallbeispiel:Ein Benutzer berichtete, dass sich alle vier Servos zusammen und nicht unabhängig voneinander bewegten. Das Problem bestand darin, dass der ISR alle Pins gleichzeitig einschaltete. Der korrigierte Code (wie oben gezeigt) verarbeitet einen Servo pro 20-ms-Frame – dies garantiert Unabhängigkeit.
Alle Informationen in diesem Leitfaden stimmen mit Folgendem überein:
Benutzerhandbuch für die Intel 8xC51-Mikrocontrollerfamilie(Bestellnummer 272737-002) – Abschnitt 6.4 zum Timer-Betrieb.
Standardspezifikation für die Servomotorsteuerung(Futaba, Hitec – generisches Protokoll) – PWM-Periode 20 ms ±2 ms, Impulsbreite 0,5–2,5 ms.
Anwendungshinweis AN115: Software-PWM auf 8051(von mehreren Halbleiterherstellern) – beschreibt die genaue Methode für die 4-Kanal-Ausgabe.
> Ein einzelner 51-Mikrocontroller kann 4 Servos ohne externen PWM-Treiberchip zuverlässig steuern, indem er einen Timer-Interrupt verwendet und die Signalpins jedes Servos innerhalb eines 20-ms-Rahmens nacheinander aktualisiert.
Der Schlüssel ist:
Ein Timer → 20 ms-Zeitraum.
Innerhalb von ISR → einen Servo einschalten, seine Impulsbreite verzögern und ihn ausschalten.
Wiederholen Sie diesen Vorgang für vier Servos im Round-Robin-Verfahren.
Externe Stromversorgung → obligatorisch.
1. Bauen Sie die Schaltung zusammenauf einem Steckbrett genau wie in Abschnitt 3 gezeigt. Verwenden Sie eine separate 5V/2A-Powerbank oder einen Wandadapter.
2. Flashen Sie den bereitgestellten Codein Ihren 51-Mikrocontroller mit einem USB-ISP-Programmierer (z. B. CH340-basiert). Stellen Sie die Quarzfrequenz in Ihrem Compiler passend zu Ihrem Board ein.
3. Testen Sie zunächst mit einem Servo– Schließen Sie nur Servo 1 an P1.0 an und überprüfen Sie, ob es von 0° auf 180° reicht.
4. Fügen Sie die restlichen Servos nacheinander hinzu– Überprüfen Sie nach jeder Zugabe den Jitter. Wenn Jitter auftritt, erhöhen Sie die Kapazität der Servostromversorgung.
5. Ändern Sie die Winkelwerte- ändernpwm1, pwm2usw. in der Hauptschleife, um eine koordinierte Bewegung zu erzeugen (z. B. eine Gehsequenz).
6. Optimieren Sie den Code– Ersetzen Sie diedelay_us()innerhalb des ISR mit einer nicht blockierenden Zählermethode für den Produktionseinsatz.
Endgültige Überprüfung:Nach Abschluss der Schritte verfügen Sie über einen voll funktionsfähigen 4-Servo-Controller, der in Roboterarmen, Vierbeinern, Kamerakardanringen oder anderen Mehrgelenkmechanismen verwendet werden kann. Das gleiche Prinzip lässt sich auf 8 oder mehr Servos übertragen, indem die Impulsbreitenauflösung reduziert oder ein schnellerer Quarz verwendet wird.
Versorgen Sie die Servos nicht über den Mikrocontroller mit Strom. Verwenden Sie immer eine gemeinsame Basis. Beginnen Sie mit einem Servo und erweitern Sie es dann.
Aktualisierungszeit: 07.04.2026
Wenden Sie sich an den Produktspezialisten von Kpower, um einen geeigneten Motor oder ein geeignetes Getriebe für Ihr Produkt zu empfehlen.