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.
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 %.
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.
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.
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.
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°:
![]()
puls_width_ms = 1,0 + (45/180)1,0 = 1,25 ms
Pflichtwert = (1,25/20)255 = 15,9375 → ganze Zahl16
// 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);
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.
// 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); }
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
Wenden Sie sich an den Produktspezialisten von Kpower, um einen geeigneten Motor oder ein geeignetes Getriebe für Ihr Produkt zu empfehlen.