Steuerung des Servos: Wie bestimmt man den Winkel und die benötigte Impulsbreite?

Ich bin ein bisschen neu, wenn es darum geht, Servos mit einem Raspberry Pi zu verwenden. Obwohl ich einige Erfahrung habe, würde ich die Dinge gerne ein bisschen besser verstehen. Deshalb möchte ich einige Fragen mit Ihnen teilen und hoffe, bessere Einblicke in die Arbeit mit Servos zu erhalten.

Die Fragen, die mich derzeit beschäftigen:

1. Wie kann ich angesichts der Spezifikationen des Servos die minimalen und maximalen Werte (Winkel) des Servos ableiten?
2. Wie genau berechne ich mit dem unten beschriebenen PWM-Hut und der mitgelieferten Python-Bibliothek die Zeit, die der PWM-Impuls auf High gesetzt werden muss, um einen bestimmten Winkel zu erreichen? Zum Beispiel: Was wäre die hohe PWM-Impulslänge, die an das Servo gesendet werden soll, damit es sich in einer 90-Grad-Position befindet? Und was wäre es für eine 120-Grad-Position?

Alle Gedanken, Bemerkungen oder Kommentare sind sehr willkommen, vielen Dank im Voraus!


Hard- und Softwarespezifikationen

Das Servo

Das Servo, das wir haben, ist dieses , das Power HD LF-20MG

Drehmoment (4,8 V): 16,5 kg-cm
Drehmoment (6,6 V): 20 kg-cm
Geschwindigkeit: 0,18 Sek. (4,8 V) | 0,16 Sek. (6,6 V)
Betriebsspannung: 4,8 - 6,6 V Gleichspannung
Gewicht: 60 g
Arbeitsfrequenz: 1520 us (= 1,52 ms) bei 333 Hz
Max. Verfahrweg: 165 Grad

Der PWM-Controller

Um den Servo mit einem Raspberry Pi zu steuern, verwenden wir den PWM/SERVO HAT von Adafruit für präzises Timing . Der HAT muss mit seiner Python-Bibliothek gesteuert werden, in der die folgenden Funktionen den Servo steuern:

Der PWM-Software-Controller

Zuerst die Frequenz einstellen. Basierend auf den Spezifikationen des Servos sollte es 333 sein.

pwm.setPWMFreq(333)

Zweitens gibt es eine Funktion, die den PWM-Impuls tatsächlich steuert. Dies ist, wo ich wirklich zweifle (siehe die zweite Frage oben).

var port = 15
var tickHigh = 0
var tickLow = 1400 #For example; range from 0-4096
pwm.setPWM(port, tickHigh, tickLow)

Wie in den Dokumenten angegeben (siehe diesen Link ), werden die zu verwendenden Werte basierend auf der erforderlichen Impulsbreite in Mikrosekunden berechnet. Aber ich kämpfe hier wirklich: Ich kann anscheinend nicht bestimmen, wie hoch die erforderliche Impulsbreite für dieses Servo sein sollte (daher die zwei Fragen).
Wenn ich das wüsste, wird die Berechnung für die Software viel einfacher:
(1 / Frequenz) / 4096 = Zeit pro Tick
Für die Frequenz dieses Servos wäre das: (1/333) / 4096 = 0,00000073315503
Dann könnte ich Verwenden Sie die folgende Formel unter Berücksichtigung der benötigten Pulsbreite: Benötigte Pulslänge
/ Zeit pro Tick = TickHigh

> If you need to calculate pulse-width in microseconds, you can do that
> by first figuring out how long each cycle is. That would be 1/freq
> where freq is the PWM frequency you set above. For 1000 Hz, that would
> be 1 millisecond. Then divide by 4096 to get the time per tick, eg 1
> millisecond / 4096 = ~0.25 microseconds. If you want a pulse that is
> 10 microseconds long, divide the time by time-per-tick (10us / 0.25 us
> = 40) then turn on at tick 0 and turn off at tick 40.

Antworten (2)

Ihre Frage war viel zu lang zum Lesen.

Diese Art von Hobby-Servomotoren werden durch die Breite eines Impulses gesteuert. Der Standardbereich liegt zwischen 1 und 2 ms und sollte alle 20-50 ms wiederholt werden. Eine Impulsbreite von 1,5 ms bringt den Servo in die Mitte seines Bereichs, mit 1 ms zu einem Ende und 2 ms zum anderen. Einige Servos können als Reaktion auf Werte, die etwas über den Bereich von 1-2 ms hinausgehen, etwas weiter gehen.

Die meisten geben Ihnen den Winkelbereich an, in dem sie arbeiten sollen, sodass Sie eine Vorstellung von der Winkeländerung pro Impulsbreiteninkrement an Ihrem Ende erhalten.

Denken Sie am Ende daran, dass es sich um Hobby- Servos handelt, also erwarten Sie kein echtes Datenblatt mit allem, was richtig geschrieben ist. Der beste Weg, um herauszufinden, was ein bestimmtes Hobby-Servo kann, ist, es zu messen. Richten Sie eine Vorrichtung ein, die die Impulsbreite von 500 µs bis 2,5 ms variieren kann, und sehen Sie, was das Gerät als Reaktion darauf tut.

Ausgehend von dieser Zeile - " Arbeitsfrequenz: 1520 us (= 1,52 ms) bei 333 Hz ", ist 1,52 ms die Impulsbreite, die für eine maximale Drehung Ihres Servos erforderlich ist, dh 165 Grad.

In diesem Fall:

Wie Sie bereits berechnet haben, beträgt die Zeitspanne Ihres Pulses 1/333 = 0,003003 Sekunden. Ihre erforderliche hohe Zeit in der Periode beträgt 1,52 ms = 0,00152 Sekunden. Wie Sie bereits berechnet haben, ist die Zeit pro Tick = 1/333/4096 = 0,000000733

Um also einen hohen Impuls mit einer Breite von 0,00152 Sekunden zu erzeugen, benötigen Sie 0,00152/0,000000733 = 2073 Ticks

versuchen Sie, tickHigh = 0 und tickLow = 2073 zu geben

oder tickHigh = 4096-2073 = 2023 und tickLow = 4096

Nein. Sie gehen von einer falschen Annahme aus. 1,5 Millisekunden ist typischerweise der Mittelpunkt , mit Abweichung zu beiden Seiten. Es wurde keine Größe der Abweichung angegeben, aber sie liegt traditionell in der Größenordnung von 0,5 ms zu jeder Seite. Die 333 Hz sind maximal keine Voraussetzung; Herkömmliche Aktualisierungsraten betragen 50 Hz, obwohl es wahrscheinlich ist, dass einige moderne MCU-basierte RC-Sets schneller aktualisieren, da sie so konzipiert sein könnten, dass sie Servoimpulse für mehrere Kanäle parallel erzeugen, anstatt abwechselnd zu kreisen.