Ich habe ein TowerPro MG90D-Servo ( Hersteller-Link ) ( ServoDatabase-Link ).
Es hat einen Bereich von 180 Grad (nicht kontinuierlich).
Es reagiert sehr gut auf meinen Servotester:
Beachten Sie den folgenden 7% Arbeitszyklus (ca. 90 °) am Tester:
Servo reagiert gut.
Wenn ich jedoch servo.write()
mit meinem Arduino Mega 2560-Klon verwende, reagiert das Servo nicht auf eine Winkelausgabe. Ich habe mehrere andere Servos, die mit demselben Code an denselben Pins einwandfrei funktionieren.
Beachten Sie den folgenden 7% Duty Cycle auf dem Arduino mit servo.write(90)
:
Keine Antwort. Das Servo ist "schlaff"; es hält keine Position.
Während ich diese Frage schrieb, dachte ich daran, es zu versuchen servo.writeMicroseconds()
.
Hier ist servo.writeMicroseconds(1450)
:
Servo antwortet!
Hier ist servo.writeMicroseconds(1472)
(arbeiten), das hat die gleichen Zeitintervalle wie der Prevoius nicht funktioniert servo.write(90)
!
servo.writeMicroseconds(1550)
(Arbeiten):
Was ist der Unterschied?
Der Servotester arbeitete bei 49,5 Hz, während er servo.write()
bei 49,9 Hz ausfiel. Ich habe mich gefragt, ob diese 0,4 Hz irgendwie einen Unterschied machen, aber dann sehe ich, dass das servo.writeMicroseconds()
auch bei 49,9 Hz funktioniert.
In den obigen Scope-Erfassungen ist ersichtlich, dass beide servo.write(90)
und servo.writeMicroseconds(1472)
dieselben Zeitintervalle haben:
1,474,560ns HIGH
18,544,640ns LOW
Die Signale sind so ähnlich ... Was könnte dazu führen, dass es servo.write()
nicht funktioniert?
Mein Code ist so einfach wie möglich:
#include <Servo.h>
Servo serv1;
void setup() {
serv1.attach(3); // Pin 3
}
void loop() {
serv1.write(90); // No response
delay(3000);
serv1.writeMicroseconds(1472); // Works
delay(3000);
serv1.write(0); // No response
delay(3000);
serv1.writeMicroseconds(1800); // Works
delay(3000);
}
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
write
? Es gibt wirklich keinen Grund, warum das Servo nicht funktioniert, also würde ich Ihre Signale in Frage stellen.Antworten:
Zunächst eine kurze Seite. Sie scheinen ein leichtes Missverständnis darüber zu haben, wie Servos funktionieren. Servos werden nicht von PWM gesteuert und sie wissen oder kümmern sich nicht darum, dass Sie Impulse mit 49 Hz senden. Sie wissen nicht, dass der Puls ein Prozentsatz einer beliebigen Periode ist. Dem Servo ist es egal, wie lange die Zeit zwischen den Impulsen dauert. Ich sage das, weil Sie sich ungewöhnlich auf Dinge konzentrieren, die eigentlich keine Rolle spielen.
Servos wissen oder kümmern sich nicht einmal wirklich darum, dass die Spannung zu einem bestimmten Zeitpunkt hoch oder niedrig ist. Sie kümmern sich nur um eines: die Zeit zwischen steigender und fallender Flanke.
Das Servo wird gesteuert, indem eine ansteigende Spannungsflanke erfasst und die Zeit bis zu einer abfallenden Flanke gemessen wird. Gültige Zeiten liegen normalerweise zwischen 1,0 und 2,0 ms, können jedoch von Servo zu Servo variieren.
Sie können es mit 1 Hz, 10 Hz, 50 Hz, 100 Hz steuern. Die meisten reagieren auf noch höhere Pulsraten, aber auch dies ist variabel. Ich versuche zu sagen, dass die Frequenz, das Tastverhältnis und die Dauer zwischen den Impulsen für Ihr Problem nicht weniger relevant sein können, dh, das Servo reagiert nicht, wenn Sie es erwarten.
Das einzige, was relevant ist, sind Kanten Ihres Pulses, denen Sie keine Aufmerksamkeit geschenkt haben. Wenn Sie dies herausfinden möchten, schauen Sie sich zunächst die wichtigen Dinge an und erfassen Sie Ihre Pulsflanken aus nächster Nähe. Sie haben in diesen Screenshots nichts Nützliches aufgenommen, weshalb es wahrscheinlich kein Problem oder keinen Unterschied gibt. Es gibt viele Probleme oder Unterschiede, die bei Ihren Messungen niemals sichtbar wären.
Was ich sehen kann, ist, dass die Erfassung der nicht funktionierenden Impulsfolge merklich schmutziger ist, sowohl der Impuls als auch der Boden, als bei allen anderen. Was seltsam ist, da es die gleiche Funktion wie die anderen aufrufen sollte. Warum ist das so viel lauter?
Noch wichtiger ist, dass Sie in der nicht funktionierenden Erfassung die „Herbstzeit“ betrachten. 809µs? Ihr Oszilloskop glaubt, eine Abfallzeit von 0,8 ms zu sehen. Das ist schlecht. Das ist natürlich falsch, aber die Tatsache bleibt, das ist es, was es misst.
Das ist ein klassisches Zeichen für eine schmutzige Kante. Denk darüber nach. Wenn dieser Impuls Ihr High-End-Testgerät, das Ihr Oszilloskop ist, dazu bringt, eine lächerlich lange Flanke oder Abfallzeit zu sehen, oder wenn es so schmutzig ist, dass es die fallende Flanke nicht immer richtig erkennen kann (oder wer weiß), dann Welche Chance hat dieses arme, beschissene kleine 8-Dollar-Servo, eine anständige Fallflanke zu bekommen?
Wenn ein Servo keinen gültigen Impuls erhält (z. B. wenn die fallende Flanke zu lange dauert, zu schmutzig ist oder übersehen wird), innerhalb des akzeptablen Impulsbereichs und von den Servos, die mit den Flanken rechnen, die möglicherweise etwas zu tun haben oder nicht Machen Sie mit dem, was Sie für die Impulsflanken halten, dann reagiert es so, als wäre es ausgeschaltet.
Mit anderen Worten, es bewegt sich nicht nur nicht, sondern widersteht auch nicht der Bewegung seiner Welle. Es wird einfach schlaff sein, genau wie Sie sehen.
Nun stellt sich die Frage ... warum sollte der Aufruf von servo.write die Kantenqualität beeinflussen?
Du hast einen Klon gesagt. Wie dieser?
Insbesondere diese Klone neigen aufgrund der unglaublich schlechten Entkopplung dazu, sich unregelmäßig zu verhalten. An jedem Stromanschluss und so nahe wie möglich am Mega2560 sollten Entkopplungskondensatoren vorhanden sein. Und auf dem eigentlichen Arduino gibt es tatsächlich. Auf diesen Klonen sind sie jedoch viel zu weit entfernt oder fehlen vielleicht, es ist schwer zu sagen. Es ist offensichtlich, dass es sich nicht zuverlässig verhält, das ist das Wichtigste.
Was ist der Unterschied?
Wenn Sie servo.write aufrufen, wird der Stapel höher geschoben als beim Aufrufen von writeMicroseconds. Angesichts des 3-Byte-Stapelzeigers des Mega2560 (17 Bit) muss er eine Reihe kritischer Bits umdrehen, die beim Aufrufen von Schreibsekunden nicht erforderlich sind. Ich weiß, dass dies ein unwahrscheinlicher Unterschied zu sein scheint, aber ich habe meinen fairen Anteil an schlecht entkoppelten Mikrocontrollern erlebt, und insbesondere die Atmosphäre scheint ein merkwürdiges Verhalten zu zeigen, insbesondere wenn Timer verwendet und / oder der Stapel gedrückt oder geknallt wird. Ähnliches passierte für mich, nur der Stack war beschädigt, als ich versuchte, LEDs mit PWM anzusteuern, aber wenn ich alles inline stellte, ohne den Stack zu verschieben, funktionierte es. Eine schlechte Entkopplung war letztendlich das Problem.
Ich würde voll und ganz erwarten, dass eine schlechte Entkopplung aus Gründen, die dem atmega2560 und niemand anderem bekannt sind, sich nachteilig auf die Kantenqualität dieses Impulses auswirkt, jedoch nur, wenn Sie den Stapel unmittelbar zuvor drücken. Dieses Servo ist einfach nicht in der Lage, die Art und Weise zu handhaben, in der diese Kanten besudelt werden, sodass in diesem Fall keine gültigen Impulse angezeigt werden. Andere Servos schaffen es offensichtlich.
Das Entkoppeln von Sachen ist immer so bizarr und hyper-spezifisch. Deshalb ist die Entkopplung so wichtig. Halten Sie die albtraumhafte Hölle voller Probleme. Mangelnde Kapazität kann Sie mit schönen, fetten Keramikkappen und so nah wie möglich am Chip in Schach halten.
quelle
Dies kann mit den Einstellungen des Ausgangspins zusammenhängen, die von der Routine .write () vorgenommen wurden. Bitte versuchen Sie es mit einem 1K-Pulldown-Widerstand, der nicht funktioniert. Entfernen Sie ihn dann und verwenden Sie ihn als Pull-Up-Widerstand. Dies gleicht den Effekt eines internen wöchentlichen Pull-Up / Pull-Down-Widerstands aus, der von der Routine eingestellt werden kann. Wenn Sie das Signal mit Ihrem Zielfernrohr messen, wirkt der Innenwiderstand der Sonde als Pulldown.
Die meisten Servos geben auch die Stromversorgung des internen Motors frei, wenn das Signal nicht für 10 Impulse hintereinander voreingestellt ist. Dies wird verwendet, um Energie zu sparen.
quelle