- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 11

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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.

  2. #2
    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.

  3. #3
    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

  4. #4
    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.

  5. #5
    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.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    Ja, du hast es. Die Werte sind vorberechnet, ebenso die Übergangszeiten. Im Idealfall sind die Übergangszeiten schon in Schleifendurchläufe umgerechnet.

Ähnliche Themen

  1. ADC-Auflösung ATmega8
    Von Tido im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 24.08.2008, 13:39
  2. Auflösung berechnen
    Von Tido im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 23.01.2008, 09: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, 08: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, 12:16
  5. Kleinste Auflösung bei Servos?
    Von Roberto im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 13.11.2004, 18:55

Berechtigungen

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

LiFePO4 Speicher Test