Forum: Mikrocontroller und Digitale Elektronik Servos ansteuern


von Adrian Rothenbühler (Gast)


Lesenswert?

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

von Stefan May (Gast)


Lesenswert?

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.

von Adrian Rothenbühler (Gast)


Lesenswert?

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

von Stefan May (Gast)


Lesenswert?

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.

von thkais (Gast)


Lesenswert?

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?

von Stefan May (Gast)


Lesenswert?

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.

von thkais (Gast)


Lesenswert?

Abblockkondensatoren an der Spannungsversorgung des Atmel (100nF)?

von Stefan May (Gast)


Lesenswert?

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.

von thkais (Gast)


Lesenswert?

Ups- wer lesen kann, ist im Vorteil, Sorry.

von ReadyRed (Gast)


Lesenswert?

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

von Stefan May (Gast)


Lesenswert?

Wie hast Du denn die Ports konfiguriert?

mfg, Stefan.

von ReadyRed (Gast)


Angehängte Dateien:

Lesenswert?

>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

von Stefan May (Gast)


Lesenswert?

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.

von ReadyRed (Gast)


Lesenswert?

Naja gut, das hab ich eigentlich als vorrausgesetzt betrachtet ;-).
Ich hab aber für Controller und Servos getrennte Spannungsquellen. Nur
mal so nebenbei.

Ready

von Stefan May (Gast)


Lesenswert?

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.

von ReadyRed (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.