Servo reagiert auf Servotester, nicht auf Mikrocontroller. Signale sehen gleich aus

8

Ich habe ein TowerPro MG90D-Servo ( Hersteller-Link ) ( ServoDatabase-Link ).
Es hat einen Bereich von 180 Grad (nicht kontinuierlich).

TowerPro MG90D

Es reagiert sehr gut auf meinen Servotester:
Servotester

Beachten Sie den folgenden 7% Arbeitszyklus (ca. 90 °) am Tester:

Oszilloskop-Servotester

Oszilloskop-Servotester

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):

Umfang Arduino Servo 90deg

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):

Zielfernrohr Arduino Servo 1450ms

Servo antwortet!

Hier ist servo.writeMicroseconds(1472)(arbeiten), das hat die gleichen Zeitintervalle wie der Prevoius nicht funktioniert servo.write(90)!

Umfang Arduino Servo 1472ms

servo.writeMicroseconds(1550) (Arbeiten):

Zielfernrohr Arduino Servo 1550ms


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);
}

schematisch

simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab

Bort
quelle
Ich habe sowohl ein Benchtop-Linearnetzteil als auch einen Abwärtswandler verwendet, um von 9 V herunterzufahren.
Bort
1
Sind Sie sicher, dass Sie bei Verwendung 3 Sekunden lang eine konstante Welle haben write? Es gibt wirklich keinen Grund, warum das Servo nicht funktioniert, also würde ich Ihre Signale in Frage stellen.
Dmitry Grigoryev
1
@Bort Dann fällt es mir schwer, deiner Geschichte zu glauben.
Dmitry Grigoryev
2
@ BigHomie: Die Signale sind in Bezug auf die Scope-Bilder identisch. Neben dem Signal ist noch etwas los. Schlechter Boden ist eine Sache, die unterschiedliche Reaktionen auf nominell identische Signale hervorrufen kann.
JRE
2
Wenn möglich, erfassen Sie zwei Oszilloskopspuren auf der Servosignalleitung, während das Servo angeschlossen ist . Ein Trace nur mit serv1.write () und ein Trace nur mit serv1.writeMicroseconds (). Poste beide Spuren. Für zusätzlichen Charme werfen Sie eine dritte Spur von Ihrem Tester mit angeschlossenem Servo ein .
Neonzeon

Antworten:

0

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?Geben Sie hier die Bildbeschreibung ein

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.

Metacollin
quelle
0

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.

555
quelle
Ich fürchte, Ihre Antwort ist nicht richtig. servo.write () nimmt einen Winkel als Eingabe, nicht die Zeit. Die Leute sollten die Antworten nicht blind abstimmen.
Bort
Ja, mein Fehler, ich habe den Code nicht gut gelesen. Dies kann mit den Einstellungen des Ausgangspins zusammenhängen, die von der Routine .write () vorgenommen wurden.
555
2
Dies wäre mein erster Gedanke gewesen, die Scope-Spuren scheinen dies jedoch zu widerlegen. Ein fehlender Boden und eine andere Pull-Up / Down-Situation können dazu führen, dass dasselbe Signal gesendet wird, aber nicht dort ankommt (nach der Position der Sonde).
KalleMP
Ich denke @KallieMP ist wahrscheinlich richtig. Pullup / Down-Widerstände könnten die Antwort sein. Sie könnten den Strom begrenzen. Die Impulse können korrekt und dennoch mit nicht genügend Antrieb gebildet werden. Unabhängig von der jeweiligen Funktion von servo.write () müssen die Strompegel genau mit der Ausgabe des Servotesters übereinstimmen, um das gleiche Ergebnis zu erzielen.
SDsolar