- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: 9 Servos, Auflösung 1µs --> Wie löse ich das?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.10.2011
    Beiträge
    44

    9 Servos, Auflösung 1µs --> Wie löse ich das?

    Anzeige

    Praxistest und DIY Projekte
    Hi Zusammen,

    möchte mich mal kurz vorstellen, ich habe erst vor kurzem begonnen mit mit Mikrocontrollern und den Möglichkeiten zu beschäftigen, habe viel gelesen, noch mehr gelesen und bin gerade dabei auf einem Breadboard meine ersten "Hallo Welt" Programme zu testen. Also Led leuchten, blinken und so weiter.

    In weiterer Folge möchte ich mal 9 Servos ansteuern können mit einer Auflösung von 1µs bei mind. 50Hz und maximal 330Hz. Nur frage ich mich wie ich das anstellen soll denn mit Soft-PWM wird das wohl nicht so leicht zu lösen sein. Bei einem Prozessor mit 16Mhz ist eine µs gerade mal 16 Taktlängen lang. Neben den 9 Servosausgängen brauche ich noch zumindest einen Eingang am µC.

    Habt ihr eine Idee wie ich das lösen könnte? Oder welche Bauteile es vielleicht gibt die solchen Aufgaben gewachsen sind?

    Danke Euch und liebe Grüße
    PuraVida

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Ich habe es zwar noch nicht verwendet, aber das Pololu Mini Maestro scheint für solche Aufgaben wie geschaffen zu sein. Damit sollte man dem µC auf jeden Fall einiges an Arbeit abnehmen können. Bei einer reinen µC-Lösung müsste man viel mit Timern arbeiten. Ich hatte mir auch schon gedacht, dass es theoretisch funktionieren könnte, wenn man einen Ausgang mittels Timer für die Pulsweite High stellt und für den Rest der Periode wieder Low. Während dieser restlichen Zeit könnte man dann die Pulsweiten für die anderen Servos setzen, sodass jeder nacheinander seinen Puls bekommt. Ist aber wie gesagt nur so eine Idee von mir, sowas würde ich zumindest ausprobieren. Bei 20ms Periodenlänge könnte man also 10 Servos ansteuern, der Timer lässt sich eigentlich auch auf µs genau einstellen.
    Musst du halt wissen, ob du die einfache Lösung oder die Bastellösung bevorzugst. Bei Letzterer lernt man aber denk ich mal mehr.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.10.2011
    Beiträge
    44
    Hi Geistesblitz!

    Danke für den Tipp mit dem Pololu Board. Das löst ja super genau auf.

    Da ich aber eine eigene Anwendung basteln will und auch noch ein User-Interface mit vier Tasten brauche sowie eine 5 stellige LED Anzeige würde ich das gerne selbst basteln damit ich das genau auf meine Bedürfnisse zuschneidern kann.

    Was die wohl für einen Controller für ihr Board verwenden? Vielleicht wäre ja der was für mich...??

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Naja, das Pololu-Board lässt sich auch über UART per µC ansprechen. Allerdings muss ich mich damit auch selbst erst noch auseinandersetzen. Bei sowas ist es halt sinnvoll, die Aufgaben aufzuteilen. Es ist einfach besser, wenn der µC zum Rechnen den "Kopf frei hat" und die Generierung der Servosignale vom Pololu übernommen wird. Ansonsten würde ich die Variante probieren, die ich oben vorgestellt hab. Ich werd das auf jeden Fall auch noch mal probieren, wenn ich mein µC-Board wieder zum laufen bekomm. Wahrscheinlich haben die anderen hier auch noch ein paar Vorschläge, ich bin ja selbst uch noch nicht so erfahren in der Materie.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    Was bedeutet: [zitat]bei mind. 50Hz und maximal 330Hz[/zitat]

    Meinst du damit die Refreshrate?

    Ich sag mal, 32 Servos mit 1us Auflösung ist kein Problem. Ich mach das so, dass ich mir ne Wertetabelle vorberechne und die dann einfach auf die Ports haue. Die Tabelle muss nur neu berechnet werden, wenn sich ein Servo bewegen soll.
    Problem: Der uC ist bei jedem Refhresh-Vorgang (bei mir alle 10ms) für maximal 1ms blockiert.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    18.10.2011
    Beiträge
    44
    Hi lokirobotics!

    Ja, ich meine die Refreshrate.

    Mein Servosignal soll von 750µs bis 2250 µs in 1µs Schritten einstellbar sein. Bei Analogservos alle 20ms (50Hz) und bei DigitalServos alle 3ms (330Hz) wiederholt sich das Signal - der Refresh sozusagen.

    Was ich vorhabe soll in etwa so funktionieren: Es bilden immer drei Servos eine Gruppe. Der Benutzer stellt für jeden Servo eine Start und eine Stoppposition ein. Dann stellt er ein mit welcher Geschwindigkeit der Servo von der Start zur Stoppposition fährt. Und außerdem noch, wie lange der 2. Servo wartet nachdem der erste seine Position angefahren ist. All diese Infos sollen in den EEProm.


    Wie wirfst Du das Signal auf die Ports? Und wieso ist dann der µC blockiert?

    LG

    Dann kommt ein Startsignal und der 1. (u. ev. 3.) Servo fährt langsam in seine Endposition, es vergeht eine Pause, und der 2. Servo fährt in seine Endposition.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    *kopfklatsch* Klar, alle 20ms sind 50Hz. Ok.

    Bei jedem Refresh wird eine Routine angestoßen, die den Inhalt der Servotabelle einfach auf die Ports schmeißt. In der Tabelle sind die Übergangszeiten (sprich von der aktuellen Zeile zur nächsten), sowie die Pin Signale kodiert. Wie du selber sagst, ist die kürzeste Zeit 0,75ms, die Längste 2,25ms. Das ist eine Differenz von 1,5ms. Bei den von dir vorgegebenen Zeitintervallen wäre die maximale Abarbeitungszeit der Tabelle 1,5ms. (Eintrag eins ausgeben, 1,5ms warten, Eintrag zwei Ausgeben, return).

    Das ganze andere Zeug (wie schnell bewegen, von wo bis wo) übernehmen dann andere Routinen. Das könnte man jetzt wieder mit einer Tabelle oder Liste lösen (Servoposition zur Zeit t).
    Jetzt kann man entweder die ganze Servotabelle vorberechnen, oder man macht es Schrittweise (Animationstabelle mit n Schritten und Servotabelle jeweils neu berechnen).

    Ich fahre meine Servos mit 100Hz, die Positionsvorgaben für Animationen kommen von extern über UART, läuft alles super. 330Hz sollten auch drin sein.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.10.2011
    Beiträge
    44
    Zitat Zitat von lokirobotics Beitrag anzeigen

    Bei jedem Refresh wird eine Routine angestoßen, die den Inhalt der Servotabelle einfach auf die Ports schmeißt. In der Tabelle sind die Übergangszeiten (sprich von der aktuellen Zeile zur nächsten), sowie die Pin Signale kodiert. Wie du selber sagst, ist die kürzeste Zeit 0,75ms, die Längste 2,25ms. Das ist eine Differenz von 1,5ms. Bei den von dir vorgegebenen Zeitintervallen wäre die maximale Abarbeitungszeit der Tabelle 1,5ms. (Eintrag eins ausgeben, 1,5ms warten, Eintrag zwei Ausgeben, return).
    Die Idee klingt gut. Der µC hätte ja nicht viel zu tun sonst, da stört es nicht weiter wenn mal 1,5ms nix passiert denke ich mir.

    Was mir noch gar nicht klar ist, wie Du die Zeit mißt wenn Du jetzt, sagen wir Servo 1 ein Positionssignal von 1500µs schicken willst? Zählst Du da einen Timer mit?

    Kann ich mir das so Vorstellen: Die Routine wird aufgerufen und alle Pins wo Servos drauf hängen gehen auf High. Dann läuft ein Zähler im Hintergrund mit. Sagen wir erster Servo 1000µs zweiter Servo 1500 µs. Sobald der Timer auf dem Wert ist der 1000µs entspricht wird der erste Pin auf Low geschaltet. Und wenn der Zählerwert den 1500µs entspricht wird der nächste Pin auf Low gesetzt. So ungefähr?

    Wie frägst Du das ab? Mit if? Case? Bekommst Du da keine Zeitprobleme beim Zählerstandvergleich? Wie gesagt dauert 1µs ja gerade mal 16 Takte bei 16Mhz Taktung.

    Du hast ja nicht zufällig ein C-Codeschnippsel für mich von der Routine?

    LG

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    Vergleichen muss ich nichts mehr. Die Werte werden, wie gesagt vorberechnet. Das ist dann eine Byte Liste. Die Bytes muss ich dann nur noch Maskieren (welche Servos sollen aktiv sein) und in die Portregister kopieren. Das schafft man in 16 Takten.
    Wie ich das Warten umgesetzt habe, kann ich dir aus'm Kopf nicht sagen. Kann sein, dass es eine einfache NOP Schleife ist. Das schau ich zu Hause noch mal nach.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    18.10.2011
    Beiträge
    44
    Ich glaube, wir reden ein bisl aneinander vorbei. Oder ich kann Dir nicht folgen. *gg*

    Bei mir starten drei bis sechs Servos gleichzeitig. Die fahren aber nicht alle den gleichen Endpunkt an sondern jeder einen individuell eingestellten. Das sind die Werte die Du in der Tabelle hast, oder? Ich muß also 6 Ports mal auf High setzen und dann zu unterschiedlichen Zeitpunkten wieder auf Low. Wenn ich Pech habe dann ist das (Hausnummer) 1500, 1501, 1502, 1503,1504, 1506 µs, etc. Ins Portregister schreiben ist klar, sollte sowas wie einen Takt dauern. Aber wie stelle ich fest wann 1500µs vergangen sind um wieder das Portregister zu beschreiben? Und wie, wann 1501µs vergangen sind? Hmm.. mit einer NOP schleife die vorher schon die differenzen kennt und die Servos nach Werten sortiert...

    Wäre cool wenn DU nachschauen könntest wie Du das genau gelöst hast. Mir fehlt noch irgendwie der Plan... Naja, Newbie halt.

    Aber ich war schon extrem stolz auf meine blinkende LED, ist ja immerhin alles neu für mich.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. ADC-Auflösung ATmega8
    Von Tido im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 24.08.2008, 14:39
  2. Auflösung berechnen
    Von Tido im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 23.01.2008, 10:15
  3. 32-Bit-Timer mit 1mS Auflösung
    Von ACDC im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 13.11.2006, 09:09
  4. mit KTY Auflösung von mehr als 1°C
    Von ba4_philipp im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 22.05.2006, 13:16
  5. Kleinste Auflösung bei Servos?
    Von Roberto im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 13.11.2004, 19:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen