Hallo, Hat jemand eine Ahnung wie ich am einfachsten 18 Servos über einen Atmel-Controller ansteure? Welcher Controller ich vewenden will, weiss ich noch nicht, vieleicht kann mir auch dazu jemand ein Tipp geben. Es wäre gut, wenn ich mindestens 9 Servos glechzeitig bedienen kann. Bin für alle möglichen Lösungen froh. Danke im Voraus ADI
Ich kann Dir den SD20 Servo-Controller empfehlen. Habe ich damals bei www.roboter-teile.de gekauft und funktioniert sehr gut. Wird über I2C angesteuert und unterstützt 20 Servos. Ansonsten habe ich noch ein C-Source für 20 Servos, der mit einem Mega8 (PDIP) einen SD20 nachbildet. Sozusagen als Ersatz. Leider habe ich dabei mit einigen Problemen zu kämpfen, weil die Servos fiese Störungen in die PWM-Leitung reinhauen. Ich kann Dir das heute abend posten. mfg, Stefan.
Vielen Dank, der SD20 ist genau dass was ich gesucht habe. Nur dass wir uns richtig verstehen: Ich kann die Servos direkt an den SD20 anschliessen, oder brauche ich noch eine Beschaltung? Was ist die Lösung für dein Problem mit den PWM Leitungen? Wäre froh für deine C-Source. Gruss ADI
siehe hier: http://www.4finger.net/~smay/avr/ PWM wird "von Hand" generiert. Wenn die Servos sich bewegen oder eine starke Belastung auftritt, dann bricht das Logiksignal teilweise ein und lässt die Servos zittern. Ich habe bisher noch keine Lösung für dieses Problem gefunden. Die Servos kannst Du direkt an den SD20 dranklemmen. Du solltest aber für die Servos eine getrennte Spannungsversorgung einplanen. Ansonsten hast Du auch mit solchen Störungen zu kämpfen. Damit es noch einfacher für Dich wird, habe ich auch meinen "ServoTester" online gestellt. Dieser benutzt den SD20. Das macht es etwas einfacher für Dich. :-) mfg, Stefan.
Könnte es sein, daß Du die Servos an der gleichen Spannungsquelle wie den Controller betreibst? Dann wäre es möglich, daß der Einbruch der Steuersignale schlichtweg durch den Reset ausgelöst werden, den der Controller bei Einbruch der Betriebsspannung ausführt. Die PWM-Eingänge von Servos sind üblicherweise nicht so niederohmig, daß sie einen Atmel in die Knie zwingen. Um das zu prüfen, versorge mal Elektronik und Servos mit getrennten Spannungsquellen. Funktionierts dann, könnte ein Puffern des Controllers mit einem großen Elko helfen. Auch die Störungen, die 20 Servo-Motoren erzeugen, können einen Controller ins Schwitzen bringen. Wie sieht die Entstörung der Spannungsversorgung des Controllers bei Dir aus?
Ich habe keine getrennten Spannungsquellen verwendet. Ich vermute aber auch, daß die Störungen daher kommen. Ich habe versucht, das mit einem großen Elko zu puffern. Das hat etwas Besserung gebracht, aber nicht das Problem beseitigt. Nach eniger Zeit ist mir dann der Elko um die Ohren geflogen. Den hatte ich noch aus einem alten Netzteil und er war wohl schon etwas altersschwach. Ich habe das Projekt danach etwas vernachlässigt. Ein Reset wird auf keinen Fall ausgeführt, da dies alle Parameter im Programm zurücksetzt. Wenn Du Dir den Quellcode anschaust, dann ist das sehr leicht zu erkennen. Die Spannungsversorgung erfolgt bei mir durch ein Labornetzteil mit einem ziemlich großen Puffer-Elko. Nahe dem Controller habe ich mit 100nF abgeblockt. Aufgebaut ist das ganze auf einem Steckboard. Mit dem Osziloskop sehen die PWM-Signale damit bei Belastung ungefähr so aus: __ | \_______ | | _________| |_______________________ Auf der Spannungsversorgungsleitung sind keine Störungen zu erkennen. Übrigens scheinen PIC-Controller etwas robuster diesbezüglich zu sein. Mit dem SD20 (ein programmierter PIC 16F872) sind solche Störungen nicht zu beobachten. mfg, Stefan.
Musst Du mal genau lesen. :-)
> Nahe dem Controller habe ich mit 100nF abgeblockt
Das hat aber nichts gebracht. Ich hole das Ding noch mal raus und
versuche es mit einer zweiten Spannungsquelle.
mfg, Stefan.
Ich hab 13 Servos direkt an einem 8535 laufen. Die Ports dafür werden in einem Timer Interupt alle 20 ms angesteuert und entsprechend einem Wert im Ram nach 1-2ms wieder abgeschaltet. Klappt sehr gut. Ready
>Wie hast Du denn die Ports konfiguriert?
Versteh ich jetzt nicht.
In dem Interupt werden erstmal alle Ports, an denen ein Servo sitzt
high gesetzt. Dann mit einer Schleife eine ms warten. - Man kann
während der Zeit auch ins Hauptprogramm zurückspringen, wenn man nur
jedesmal den Interuptzähler umstellt.- Dann die Werte für jedes Servo
in ein eigenes Register schreiben und ein anderes Register hochzählen.
Nach jedem Inc mit den Werten in den Servoregistern vergleichen und bei
Übereinstimmung den entsprechenden Port low setzen. Man muß den Zähler
natürlich noch mit einem anderen Zähler verknüpfen, um auf eine ms zu
kommen.
Diese Routine ist ohne Probleme erweiterbar.
Wenn die Register nicht reichen, ruft man die eben zweimal
hintereinander auf.
Leider ist diese Steuerung für meinen Sechsbeiner noch zu doof.
Der läuft damit zwar, aber das geht tierisch auf die Mechanik.
Für eine vernünftige Gehweise ist es nötig, daß 2 Servos in der
gleichen Zeit verschieden lange Wege machen.
Darum hab ich angefangen, das Programm komplett umzuschreiben.
Dabei wird jetzt der Istwert und der Sollwert für jedes Servo
berücksichtigt, und daraus die Pulslänge berechnet.
Falls es interessiert: www.ginotronik.de
LDI temp, 0xFF ;Port B Ausgang Out DDRB, temp LDI temp, 0xFF ;Port D Ausgang Out DDRD, temp LDI temp, 0xFF ;Port C Ausgang Out DDRC, temp Das hat mich interessiert. :-) Allerdings benutzt Du auch keinen ATmega8. Vielleicht habe ich auch nur eine empfindliche Version von dem Ding erwischt. Hat eigentlich jemand mal meinen Code ausprobiert? mfg, Stefan.
Naja gut, das hab ich eigentlich als vorrausgesetzt betrachtet ;-). Ich hab aber für Controller und Servos getrennte Spannungsquellen. Nur mal so nebenbei. Ready
Vielleicht sind gertennte Spannungsquellen ja die Lösung. Mich hat nur gewurmt, daß ein PIC weniger empfindlich ist, als der AVR. Beim ATmega kannst Du auch noch PullUps auf die Pins schalten. Es hat mich interessiert, ob Du die benutzt, deshalb meine Frage. mfg, Stefan.
Anfangs hatte ich auch alles an einem Akku (6V). Das lief ein paar Minuten ohne Probleme, aber dann kriegte das Ding einen epileptischen Anfall ;). Seit ich die Spannungsversorgung getrennt gemacht hab, ist das kein Thema mehr. Die internen Pullups sind doch nur bei Pin als Eingang brauchbar oder? Ready
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.