Heim > Brancheneinblicke >Servo
TECHNISCHE UNTERSTÜTZUNG

Produktunterstützung

PWM-Signalsteuerung für Servomotoren: Eine vollständige Programmieranleitung

Veröffentlicht 2026-04-02

In dieser Anleitung wird erläutert, wie ein Standard gesteuert wirdServoMotor mithilfe von Pulsweitenmodulationssignalen (PWM). Sie lernen die genauen PWM-Parameter (Periode, Impulsbreite, Tastverhältnis) kennen, die zum Einstellen eines erforderlich sindServoin jedem Winkel von 0 bis 180 Grad. Die Anweisungen basieren auf weit verbreiteten Mikrocontroller-Plattformen und wurden mit gängigen 50-Hz-Analog- und Digitalgeräten verifiziertServoWird in der Hobbyrobotik eingesetzt. Indem Sie den Schritt-für-Schritt-Codebeispielen und Kalibrierungsmethoden folgen, können Sie ein Servo zuverlässig ohne Jitter oder Drift positionieren.

01Kern-PWM-Parameter für die Servosteuerung

Ein Standard-Servomotor erwartet ein PWM-Signal mit folgenden festen Eigenschaften:

Signalperiode: 20 ms (Millisekunden), was einer Frequenz von entspricht50 Hz.

Pulsbreite (High Time): variiert zwischen1,0 msUnd2,0 ms.

Arbeitszyklus= (Impulsbreite / 20 ms) × 100 %.

Gewünschter Servowinkel Pulsbreite Einschaltdauer (ca.)
0° (Minimum) 1,0 ms 5.0%
90° (neutral) 1,5 ms 7.5%
180° (maximal) 2,0 ms 10.0%

Hinweis: Einige Servos akzeptieren möglicherweise 0,5 ms bis 2,5 ms für eine größere Reichweite, aber der Standardwert von 1,0–2,0 ms funktioniert für fast alle gängigen Servos.

02PWM-Ausgang programmieren – Schritt für Schritt

Die folgende Codestruktur funktioniert auf jeder Plattform, die Hardware-PWM bietet (z. B. Arduino, STM32, ESP32, Raspberry Pi mit Hardware-PWM). Wir verwenden generischen Pseudocode, damit Sie ihn an Ihren spezifischen Mikrocontroller anpassen können.

2.1 Richten Sie das PWM-Peripheriegerät ein

Wählen Sie einen PWM-fähigen Pin.

Stellen Sie die PWM-Frequenz auf ein50 Hz(Periode = 20 ms).

Stellen Sie die Auflösung für eine genauere Steuerung auf mindestens 8 Bit (0–255) oder 16 Bit ein.

2.2 Konvertieren Sie den gewünschten Winkel in den Arbeitszykluswert

Für eine 8-Bit-PWM (0 = 0 % Einschaltdauer, 255 = 100 % Einschaltdauer):

Arbeitszyklus für 1,0 ms = (1,0 / 20,0) × 255 = 12,75 → runden auf13

Arbeitszyklus für 1,5 ms = (1,5 / 20,0) × 255 = 19,125 → runden auf19

Arbeitszyklus für 2,0 ms = (2,0 / 20,0) × 255 = 25,5 → runden auf26

Allgemeine Formel für jeden Winkel (0–180°):

puls_width_ms = 1,0 + (Winkel / 180,0)(2,0 - 1,0) Duty_value = (pulse_width_ms / 20,0)(2^Auflösung - 1)

Beispiel für 8-Bit-Auflösung und 45°:

舵机pwm控制源码_pwm控制舵机程序_pwm波控制舵机转动程序

puls_width_ms = 1,0 + (45/180)1,0 = 1,25 ms

Pflichtwert = (1,25/20)255 = 15,9375 → ganze Zahl16

2.3 Schreiben Sie den Duty-Wert in das PWM-Register

// Pseudocode pwm_set_frequenz(PWM_PIN, 50); // 50 Hz pwm_set_resolution(PWM_PIN, 8); // 8-Bit-Int-Winkel = 90; // Zielwinkel int Duty = Map(angle, 0, 180, 13, 26); // unter Verwendung der vorberechneten Mindest-/Höchstlast pwm_write(PWM_PIN, Pflicht);

2.4 Kalibrierung unter realen Bedingungen (eliminiert Jitter)

Da keine zwei Servos exakt identisch sind, messen Sie immer die tatsächlichen Impulsbreitengrenzen:

1. Schreiben Sie einen 1,0-ms-Impuls – beobachten Sie die Servoposition. Wenn der physische Stopp nicht erreicht wird, erhöhen Sie die Impulsbreite in Schritten von 0,05 ms, bis die Bewegung zum Stillstand kommt (aufzeichnen als).mein_puls).

2. Schreiben Sie einen 2,0-ms-Impuls – ermitteln Sie auf ähnliche Weise die maximale Impulsbreite, die eine vollständige Drehung ergibt (max_pulse).

3. Verwenden Sie diese Messwerte in Ihrem Code anstelle der theoretischen 1,0/2,0 ms.

Häufiger Fall: Ein typisches Tower Pro SG90 Mikroservo erforderlichmin_pulse = 0,9 msUndmax_pulse = 2,1 msfür einen echten Bereich von 0–180°. Kalibrieren Sie immer pro Servomodell.

03Vollständiger Beispielcode (Arduino-Stil, hardwareunabhängig)

// Servosteuerung mit PWM – keine externen Bibliotheken erforderlich // Funktioniert auf jedem Board mit Hardware-PWM (z. B. Uno, Nano, Mega, ESP32) const int servoPin = 9; // PWM-Pin const int freq = 50; // 50 Hz const int Auflösung = 8; // 8-Bit (0-255) // Vorkalibrierte Impulsgrenzen (in Mikrosekunden) const int minPulseUs = 1000; // 1,0 ms = 1000 µs const int maxPulseUs = 2000; // 2,0 ms = 2000 µs void setup() { // PWM konfigurieren ledcSetup(0, freq,solution); // Kanal 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int angle) { // Winkel auf 0-180 beschränken angle = constrain(angle, 0, 180); // Winkel in Impulsbreite (Mikrosekunden) umwandeln int pulsUs = minPulseUs + (angle(maxPulseUs - minPulseUs)) / 180; // Impulsbreite in Arbeitszyklus umwandeln (0-255) int Duty = (pulseUs255) / 20000; // 20000 µs = 20 ms Periode ledcWrite(0, Duty); } void loop() { setServoAngle(0); // auf 0° verschieben Verzögerung(1000); setServoAngle(90); // auf 90° verschieben, Verzögerung (1000); setServoAngle(180); // auf 180° verschieben delay(1000); }

04Behebung häufiger Probleme mit dem PWM-Servo

Problem Höchstwahrscheinlich Ursache Lösung
Servo bewegt sich nicht Falsche PWM-Frequenz (nicht 50 Hz) Stellen Sie die Frequenz auf genau 50 Hz ein
Ruckartige/zuckende Bewegung Unzureichende Stromversorgung Verwenden Sie eine separate 5-V-Versorgung (z. B. 4×AA-Batterien oder 5V/2A-Regler)
Ungenaue Winkel Die theoretischen Impulsgrenzen unterscheiden sich vom tatsächlichen Servo Führen Sie die Kalibrierung durch (Schritt 2.4) und verwenden Sie gemessene Min/Max-Impulse
Servo brummt, dreht sich aber nicht Arbeitszyklusauflösung zu niedrig (Erhöhen Sie die PWM-Auflösung auf 10 Bit oder 12 Bit
Bewegt sich nur zwischen 0° und 90° Signalperiode zu kurz oder Impulsbreitenbereich stimmt nicht überein Stellen Sie sicher, dass die Periode 20 ms beträgt und dass Sie Impulse zwischen 1,0 und 2,0 ms senden

05Umsetzbare Empfehlungen für eine zuverlässige Servosteuerung

1. Kalibrieren Sie jedes Servo immer einzeln– Sogar zwei Servos desselben Modells können eine Abweichung von ±0,1 ms aufweisen. Schreiben Sie eine einfache Testskizze, die von 0,5 ms bis 2,5 ms reicht, und notieren Sie die genauen Impulsbreiten für 0° und 180°.

2. Verwenden Sie ein separates Netzteil– Versorgen Sie ein Servo niemals direkt über den 5-V-Pin Ihres Mikrocontrollers mit Strom (Stromspitzen können die Platine zurücksetzen). Eine geregelte 5V/2A-Stromversorgung oder 4×NiMH-Akkus (4,8V) funktionieren zuverlässig.

3. Fügen Sie einen 100–470 µF-Elektrolytkondensator hinzuüber die Stromanschlüsse des Servos in der Nähe des Servos. Dadurch werden Spannungseinbrüche durch plötzliche Motoranläufe aufgefangen.

4. Vermeiden Sie Softwareverzögerungenwährend sich das Servo bewegt. Verwenden Sie nicht blockierendes Timing (z. B. millis()-basierte Zustandsmaschinen), damit Ihr Programm andere Aufgaben bewältigen kann.

5. Für hochpräzise Anwendungen (z. B. Roboterarme), verwenden Sie einen 16-Bit-PWM-Timer und eine lineare Interpolation zwischen kalibrierten Punkten. Erwägen Sie auch den Einbau eines analogen 10-Bit-Rückkopplungspotentiometers, um den Regelkreis zu schließen.

Kernstück zum Mitnehmen: Die Steuerung eines Servos mit PWM ist einfach, wenn Sie die Frequenz auf 50 Hz festlegen und den Winkel einer Impulsbreite von 1,0–2,0 ms zuordnen. Die Zuverlässigkeit in der Praxis beruht jedoch auf einer ordnungsgemäßen Kalibrierung, ausreichender Leistung und der Verwendung gemessener Grenzwerte anstelle theoretischer Werte. Wenden Sie die in Abschnitt 2.4 beschriebene Kalibrierungsmethode auf jedes neue Servo an, das Sie integrieren, und Ihre Projekte werden jedes Mal eine reibungslose und präzise Bewegung erzielen.

Aktualisierungszeit: 02.04.2026

Die Zukunft vorantreiben

Wenden Sie sich an den Produktspezialisten von Kpower, um einen geeigneten Motor oder ein geeignetes Getriebe für Ihr Produkt zu empfehlen.

Mail an Kpower
Anfrage senden
+86 0769 8399 3238
 
kpowerMap