Danke.
Ich hab einen eigenen Servocontroller auf Basis eines ATMega32. Die Software läuft aber praktisch auf jedem Controller, der einen Timer mit Compare Match hat.
Der Controller wird einfach mit Positionswerten über die serielle Schnittstelle gefüttert. Für den PC hab ich mir ein Programm geschrieben, mit dem ich Sequenzen erstellen und ablaufen lassen kann.
Der Befehl "set,0,200,1000" z.B. würde Servo1 in einer Sekunde auf Position 200 fahren (0-255 möglich).
@ lokirobotics: Also verändert dein Controller, wie ich in dem Viedeo gesehen habe, die Pulsweite entsprechend der Zeit, die der Servo für das Anfahren der benötigten Position brauchen soll oder? Hast du die Software in C oder mit was anderem geschrieben? Habe mit meinem Programm und der Messkarte (läuft auch mit Digitalservos), das ganze noch mal optimieren können und das zittern vermindern können. Komme aber immernoch nicht ganz an die saubere Bewegung, wie mit einem Servotester z.B. ran.
Der Controller erzeugt nur die Signale für die jeweiligen Servos. Das Programm im PC erstellt eine Tabelle, in der die Servopositionen stehen. Jede Tabellenzeile stellt dabei einen Timeslot von 10ms dar. Der Controller kriegt also alle 10ms die Servopositionen übermittelt, die er dann auch sofort anlegt. Die Servos bewegen sich also immer mit maximaler Geschwindigkeit.
Hier mal ein Ausschnitt aus solch einer Tabelle:
edit: MCU in C, PC Programm in C#Code:0 0 0 0 2 2 0 0 4 4 0 0 6 6 0 0 8 8 0 0 10 10 0 0 12 12 0 0 14 14 0 0 16 16 0 0 18 18 0 0 20 20 0 0 22 22 0 0 24 24 0 0 26 26 0 0 28 28 0 0 30 30 0 0 32 32 0 0 34 34 0 0 36 36 0 0 38 38 0 0 40 40 0 0 42 42 0 0 44 44 0 0 46 46 0 0 48 48 0 0 50 50 0 0 52 52 0 0 54 54 0 0 56 56 0 0 58 58 0 0 60 60 0 0 62 62 0 0 64 64 0 0 66 66 0 0 68 68 0 0 70 70 0 0 72 72 0 0 74 74 0 0 76 76 0 0 78 78 0 0 80 80 0 0 82 82 0 0 84 84 0 0 86 86 0 0 88 88 0 0 90 90 0 0 92 92 0 0 94 94 0 0 96 96 0 0 98 98 0 0 100 100 0 0 102 98 0 0 104 96 0 0 106 94 0 0 108 92 0 0 110 90 0 0 112 88 0 0 114 86 0 0 116 84 0 0 118 82 0 0 120 80 0 0 122 78 0 0 124 76 0 0 126 74 0 0 128 72 0 0 130 70 0 0 132 68 0 0 134 66 0 0 136 64 0 0 138 62 0 0 140 60 0 0 142 58 0 0 144 56 0 0 146 54 0 0 148 52 0 0 150 50 0 0 152 48 0 0 154 46 0 0 156 44 0 0 158 42 0 0 160 40 0 0 162 38 0 0 164 36 0 0 166 34 0 0 168 32 0 0 170 30 0 0 172 28 0 0 174 26 0 0 176 24 0 0 178 22 0 0 180 20 0 0 182 18 0 0 184 16 0 0 186 14 0 0 188 12 0 0 190 10 0 0 192 8 0 0 194 6 0 0 196 4 0 0 198 2 0 0 200 0 0 0
Gute Arbeit, mein Kompliment.Nun ist die Standard-Updateperiode eines Servos 20 ms. Aber wir wissen, dass Servos nicht so pingelig auf diese Zeit achten - aber das Rampenverhältnis muss halt stimmen. Spricht Dein Servo wirklich 100 mal pro Sekunde mit Dir? Dann müsste ja auch Dein Stellungssignal, die Rampe (siehe hier) entsprechend kleiner sein, sprich 0,5 bis 1 ms je Periode.Zitat von lokirobotics
Frage 1: wie lang ist Deine kürzeste Rampe, wie lang Deine längste ?
Frage 2: Verarbeitet Dein Servo wirklich die 100-Hz-Signale? (Wie) Ist das getestet/gesichert?
Ciao sagt der JoeamBerg
Danke.
Zu erstens: Meine Servos halten sich leider gar nicht an die üblichen "Vorgaben".
Wie du siehst, liegt die kürzeste Periode bei 500µS, die längste bei ~2400µS. Bei den Extremwerten kommen die Servos auch nicht ins Zittern, wie das z.B. bei drei oder 4ms Impulsen der Fall wäre.
Zu zweitens: Ob die Servos so schnelle Impulse verarbeiten, weiß ich nicht. Das ist weder getestet, noch irgendwie gesichert. Imho macht es auch keinen Sinn, die Servoposition mit 100Hz zu aktualisieren. Der Controller soll aber auch zur Steuerung von BL-Motor Controllern eingesetzt werden. Da möchte ich dann untersuchen, wie schnell man die Drehzahlen der Motoren ändern kann. Deswegen die 10ms.
...
So, ich habe es gerade mal mit 20ms getestet. Die Servos fahren ruckeliger. Die Servos scheinen die 10ms also zu schlucken.
Noch mehr Kompliment und danke für die Arbeit. Ich verwende ähnliche Servos, die billigen MODELCRAFT ES-05 JR/FUT - aber derzeit praktisch nur in der Hackversion 2. Bei früheren Arbeiten war mir schon aufgefallen, dass die recht tolerant gegenüber der Periodendauer sind. Aber ich habe das weder so genutzt wie Du, noch habe ich das so genau dokumentiert. Ich hatte lediglich die langsame Fahrweise geübt durch ein paar tausend Schritte für die Rampe und langsames Hochtickern der Rampe.
Bitte nicht prügeln, wenn ich jetzt pingelig werde. Du dokumentierst Pulse von 500 µs bis 2400 µs. Jetzt ist die naheliegende und wichtige Frage, wie lang war bei Deinen Tests die Periodendauer [klugsche--sen] die ja der Abstand von Pulsanfang zu Pulsanfang ist [/klugsche--sen]. Vergleiche auch die üblichen Definitionen hier. Jedenfalls danke für die saubere Arbeit.
Na ja, und meine Servos halten sich auch nicht an die üblichen "Vorgaben" die da mal sagten, dass diese Typen gleich/schnell/nachMinuten hinüber seien. Jedenfalls laufen meine gehackten Teilchen seit vielen vielen Betriebsstunden.
Ciao sagt der JoeamBerg
das heist: für den Algorithmus bedeutet das, wenn du schneller mit den Servos fahren möchtest, dann schickst du ihm einfach weniger Werte bzw. größere Abstände oder wie kann ich das verstehen?
Letzteres ist richtig. Der Controller bekommt vom PC alle 10ms die Positionsdaten zugeschickt (solange sich was bewegen soll). Je nach dem, wie schnell sich die Servos bewegen sollen, fallen die Unterschiede zwischen den Werten größer oder kleiner aus.
@ lokirobotics: Kann es dann aber sein das ich Positionsdaten sende, während der Servo noch die letzte Position anfährt? Da bei meiner Steuerung der Servo für jeden Schritt 0,16 sek benötigt, um ihn anzufahren, wenn ich die Zeit z.B: des Datenschreibens mal messe. Ich schreibe ja auch alle 10ms eine Position (der Servo kann bis 5ms Zyklen annehmen laut Hersteller). Oder mache ich da was falsch bzw. habe einen Denkfehler?
Lesezeichen