Veröffentlicht 2026-04-01
Dieser Leitfaden bietet eine vollständige, praktische Erläuterung des Pulsweitenmodulationscodes (PWM) zur Steuerung von StandardsServoMotoren. Wenn Sie nach dem genauen Code, Verdrahtungsanweisungen und Timing-Prinzipien suchen, um eine zu erstellenServoBewegen Sie sich in einem präzisen Winkel, dann sind Sie hier genau richtig. Dieser Artikel konzentriert sich auf den allgemein akzeptierten Standard fürServoSteuerung – das 50-Hz-PWM-Signal mit einer Impulsbreite zwischen 1 ms und 2 ms – und stellt funktionierende Codebeispiele bereit, die hardwareunabhängig sind, sodass Sie sie auf jede Mikrocontroller-Plattform anwenden können.
Im Kern geht es bei der Steuerung eines Standard-Analogservos nicht um das Senden komplexer Datenpakete, sondern um die Erzeugung eines spezifischen, sich wiederholenden elektrischen Impulses. Die interne Schaltung des Servos interpretiert die Breite dieses Impulses, um die Zielposition seiner Ausgangswelle zu bestimmen.
Das Standardsteuersignal wird durch zwei Schlüsselparameter definiert:
1. Zeitraum (Häufigkeit):Das Signal wiederholt sich alle 20 Millisekunden (ms). Dies entspricht einer Frequenz von 50 Hz (1 / 0,02 s = 50 Hz).
2. Impulsbreite (Arbeitszyklus):Die Dauer, für die das Signal innerhalb dieses Zeitraums von 20 ms hoch ist (logisch 1). Dieser Wert wird direkt dem Winkel des Servos zugeordnet.
Die Zuordnung zwischen Impulsbreite und Winkel ist die entscheidende Information. Bei der überwiegenden Mehrheit der Standardservos ist die Beziehung linear und folgt dieser branchenüblichen Spezifikation:
1,0 ms Impuls:Dreht das Servo auf 0 Grad (vollständig gegen den Uhrzeigersinn).
1,5 ms Impuls:Dreht das Servo um 90 Grad (Mittelposition).
2,0 ms Impuls:Dreht das Servo um 180 Grad (vollständig im Uhrzeigersinn).
Obwohl viele Servos diesem Standard entsprechen, ist es wichtig, den genauen Bereich für Ihr spezifisches Modell zu überprüfen, da einige Servos mit hohem Drehmoment oder spezielle Servos leicht unterschiedliche Endpunkte haben können (z. B. 0,9 ms bis 2,1 ms). Die folgenden Codebeispiele sind so strukturiert, dass sie eine einfache Anpassung dieser minimalen und maximalen Impulsbreitenkonstanten ermöglichen.
Die Codelogik ist auf allen Plattformen konsistent: Initialisieren Sie einen Timer/Zähler, um ein 50-Hz-Signal zu erzeugen, und modulieren Sie dann die „Einschaltzeit“ dieses Signals, um den Servowinkel festzulegen. Der folgende Pseudocode demonstriert die Kernlogik, die Sie an jede Programmierumgebung anpassen können.
// --- Konfigurationskonstanten --- #define PWM_FREQUENCY_HZ 50 #define PERIOD_MS (1000 / PWM_FREQUENCY_HZ) // Berechnet auf 20 ms #define PULSE_MIN_MS 1.0 // Impulsbreite für 0 Grad #define PULSE_MAX_MS 2.0 // Impulsbreite für 180 Grad #define ANGLE_MIN 0 #define ANGLE_MAX 180 // --- Funktion zum Zuordnen eines Winkels zu einer Impulsbreite --- float angleToPulseWidth(int angle_degrees) { // Winkel auf gültigen Bereich beschränken if (angle_degrees ANGLE_MAX) angle_degrees = ANGLE_MAX; // Lineare Abbildung vom Winkelbereich zum Impulsbreitenbereich float pulse_width = PULSE_MIN_MS + ( (float)(angle_degrees - ANGLE_MIN) / (ANGLE_MAX - ANGLE_MIN) )(PULSE_MAX_MS - PULSE_MIN_MS); return pulse_width; } // --- Hauptregelkreiskonzept --- // In einer realen Implementierung würde Folgendes von einem Hardware-Timer verarbeitet werden. // 1. Den Ausgangspin auf HIGH setzen. // 2. Warten (Verzögerung) auf die berechnete Impulsbreite (z. B. 1,5 ms). // 3. Den Ausgangspin auf LOW setzen. // 4. Warten Sie den Rest der 20-ms-Periode ab (PERIOD_MS - pulse_width).
Um dies sofort umsetzbar zu machen, finden Sie hier konkrete Implementierungen für zwei der gängigsten Entwicklungsplattformen. Die Prinzipien bleiben identisch und demonstrieren die Portabilität des 50-Hz-1-2-ms-Standards.
Dies ist der häufigste Einstiegspunkt für Bastler. Der ArduinoServoDie Bibliothek abstrahiert die Komplexität des Hardware-Timers und bietet eine saubere Schnittstelle. Dieses Beispiel basiert auf der Standardpraxis, die Signalleitung des Servos an einen PWM-fähigen digitalen Pin anzuschließen.
#enthalten// Ein Servoobjekt erstellen Servo myServo; // Definieren Sie den Pin, der mit der Signalleitung des Servos verbunden ist. const int servoPin = 9; void setup() { // Das Servoobjekt an den Pin anhängen // Die Bibliothek richtet automatisch das 50-Hz-Signal ein myServo.attach(servoPin); // --- Häufiges Szenario: Zentrieren Sie den Servo beim Start --- // Bei vielen Roboteranwendungen ist es wichtig, von einer bekannten, // sicheren Position aus zu starten, um mechanische Belastungen zu vermeiden. Die Zentrierung bei 90 Grad // ist eine universelle Best Practice. myServo.write(90); // In die Mittelposition verschieben Verzögerung (1000); // Warten Sie, bis die Position erreicht ist } void loop() { // Sweep von 0 bis 180 Grad for (int angle = 0; angle = 0; angle--) { myServo.write(angle); Verzögerung(15); } }
Hinweis: Dieschreiben()Die Funktion wandelt den Winkel (0-180) automatisch in die richtige Impulsbreite (1-2 ms) um.
Auf einem Raspberry Pi erzeugen Sie das PWM-Signal normalerweise per Software, was ein präzises Timing erfordert. DerRPi.GPIODie Bibliothek bietet eine hardwaregestützte PWM-Schnittstelle an bestimmten Pins für genauere Signale. Dieses Beispiel spiegelt den Standardansatz für die Einzelservosteuerung auf einem Linux-basierten Einplatinencomputer wider.
RPi.GPIO als GPIO-Importzeit importieren # Pin-Definitionen servo_pin = 18 # Verwenden Sie einen Pin, der Hardware-PWM unterstützt, wie GPIO 18 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # PWM-Setup: 50 Hz Frequenz pwm = GPIO.PWM(servo_pin, 50) pwm.start(0) # Beginnen Sie mit 0 % Arbeitszyklusdefinition set_angle(angle): """Konvertieren Sie einen Winkel (0-180) in ein Tastverhältnis für ein 50-Hz-Signal."" = 1,0 + (Winkel / 180,0)1.0 # Zuordnung zu 1,0–2,0 ms Duty_cycle = (pulse_width_ms / 20,0)100.0 pwm.ChangeDutyCycle(duty_cycle) # --- Häufiges Szenario: Kalibrieren eines neuen Servos --- # Bei der ersten Integration eines Servos ist es wichtig, seine tatsächlichen # mechanischen Grenzen zu überprüfen. Der folgende Code demonstriert eine sichere Kalibrierungsroutine. try: # Mittelposition testen print("Bewegen auf 90 Grad ...") set_angle(90) time.sleep(2) # 0-Grad-Position testen (1,0-ms-Impuls) print("Bewegen auf 0 Grad ...") set_angle(0) time.sleep(2) # 180-Grad-Position testen (2,0-ms-Impuls) print("Bewegen auf 180 Grad ...") set_angle(180) time.sleep(2) # Zurück zur Mitte print("Zurück zur Mitte.") set_angle(90) time.sleep(1) außer KeyboardInterrupt: print("Vom Benutzer gestoppt") Finally: pwm.stop() GPIO.cleanup()
Hinweis: Diese Methode verwendet die Berechnung des Arbeitszyklus. Bei einem 50-Hz-Signal entspricht ein Impuls von 1 ms einem Arbeitszyklus von (1/20).100 = 5 %. Ein 2-ms-Impuls ist (2/20)100 = 10%.
Selbst bei korrektem Code können verschiedene Hardwareprobleme dazu führen, dass ein Servo nicht funktioniert. Wenn Sie diese häufigen Szenarien verstehen, können Sie Probleme schnell diagnostizieren und lösen.
1. Unzureichende Stromversorgung:Dies ist das häufigste Problem. Ein typisches Servo kann beim Bewegen 200–500 mA und noch höhere Blockierströme ziehen. USB-Anschlüsse von Mikrocontrollern (typischerweise 500 mA) reichen oft nicht aus, insbesondere für mehrere Servos.
Lösung:Verwenden Sie eine dedizierte externe Stromversorgung (z. B. 5 V von einem Akku oder eine geregelte Tischversorgung). Stellen Sie sicher, dass die Masse (GND) des Mikrocontrollers mit der Masse des externen Netzteils verbunden ist.
2. Falsche Timing-Werte:Wenn das Servo zittert, brummt oder sich nicht im vollen Bereich bewegt, stimmen die Impulsbreitengrenzen wahrscheinlich nicht mit der Spezifikation des Servos überein.
Lösung:Den genauen Impulsbreitenbereich finden Sie im Datenblatt des Servos. Eine übliche Variation ist 0,9 ms bis 2,1 ms. Passen Sie die anPULSE_MIN_MSUndPULSE_MAX_MSKonstanten in Ihrem Code entsprechend.
3. Frequenzdrift bei Software-PWM:Auf Plattformen wie dem Raspberry Pi ohne dedizierte Hardware-PWM-Pins kann softwaregeneriertes PWM aufgrund von Betriebssystem-Multitasking zu Timing-Inkonsistenzen führen.
Lösung:Verwenden Sie für kritische oder Hochgeschwindigkeitsanwendungen eine dedizierte Servo-Controller-Karte (wie eine PCA9685), die das Timing auf einen dedizierten Hardware-Chip verlagert und so eine stabile 50-Hz-Erzeugung gewährleistet.
Um einen Servo mit PWM-Code erfolgreich anzusteuern, beachten Sie diese drei Grundprinzipien:
1. Standardisieren Sie das Signal:Versuchen Sie immer, ein präzises 50-Hz-Signal zu erzeugen. Die Impulsbreite ist die einzige Variable, die die Position steuert.
2. Ordnen Sie Winkel Impulsen zu:Verwenden Sie die lineare Abbildung von 1,0 ms (0°) bis 2,0 ms (180°) als Basislinie. Diese Formel funktioniert für über 90 % der Standardservos.
3. Priorisieren Sie die Leistung:Stellen Sie sicher, dass Ihre Stromquelle den erforderlichen Strom liefern kann. Ein Servo, das unregelmäßig zuckt, ist fast immer ein Leistungsproblem und kein Codeproblem.
Aktionsschritt:Beginnen Sie mit dem einfachen Sweep-Code auf der von Ihnen gewählten Plattform unter Verwendung eines einzelnen Servos. Sobald der Sweep funktioniert, ersetzen Sie die fest codierten Winkel durch Sensoreingaben, Joystick-Werte oder berechnete Positionen, um das Servo in Ihr größeres Projekt zu integrieren. Durch die Einhaltung des 50-Hz-Standards und die Überprüfung Ihrer Stromversorgung schaffen Sie eine solide Grundlage für jede Bewegungssteuerungsanwendung.
Aktualisierungszeit: 01.04.2026
Wenden Sie sich an den Produktspezialisten von Kpower, um einen geeigneten Motor oder ein geeignetes Getriebe für Ihr Produkt zu empfehlen.