Mehrere Servo-Signale einlesen, ggf. manipulieren, ausgeben

Thema: Mehrere Servo-Signale einlesen, ggf. manipulieren, ausgeben

  1. Bomberpilot:

    Mehrere Servo-Signale einlesen, ggf. manipulieren, ausgeben

    Tag zusammen,

    ich hänge momentan an einem kleinen Problem.
    Ich möchte von einem RC-Empfänger, der mir leider kein Summensignal liefert (zumindest mit dem Oszi keins gefunden (EK2-0424))
    alle 6 Servo-Signale mit einem AVR erfassen.
    Diese sollen dann je nach Verwendungszweck manipuliert werden (Mischer, Teilautomatik, etc.) und dann wieder als 6 Servo-Signale ausgegeben werden.

    Die Ausgabe erfolgt momentan per Timer1 im CTC Mode mit einer Frequenz von 50Hz (20ms Paketlänge des Servo Signals).
    Nur die Eingabe macht mir etwas Probleme. Sobald sich nämlich Einlesen und die Ausgabe Interrupt mäßig in die Quere kommen, führt dies logischerweise zu starkem Jitter auf den Servo Kanälen, da das Timing nicht mehr stimmt.

    Hat jemand von euch eine Idee wie ich das lösen könnte, oder sowas ähnliches schon mal versucht.

    Grüße Basti
     
  2. Avatar von Searcher

    Searcher:
    Hallo,
    6 Servosignale einlesen und ausgeben mit einem AVR wird sehr kritisch. Hier was mit 3 Signalen:
    https://www.roboternetz.de/community...l=1#post592054

    plus thread von vorne

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen
     
  3. Avatar von PICture

    PICture:
    Hallo!

    Zitat Zitat von Bomberpilot Beitrag anzeigen
    Ich möchte von einem RC-Empfänger, der mir leider kein Summensignal liefert (zumindest mit dem Oszi keins gefunden (EK2-0424))alle 6 Servo-Signale mit einem AVR erfassen.
    Per Funk werden die Impulse angeblich in gleicher Reihenfolge seriel nacheinander gesendet und im RC-Empfänger müssten sie schon alle richtig verteilt sein.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
     
  4. Bomberpilot:
    Zitat Zitat von PICture Beitrag anzeigen
    Per Funk werden die Impulse angeblich in gleicher Reihenfolge seriel nacheinander gesendet und im RC-Empfänger müssten sie schon alle richtig verteilt sein.
    Ich hätte villt erwähnen sollen, dass es sich um einen 2,4GHz Empfänger handelt *KopfaufTisch*

    Der Emfänger IC ist ein nRF2401
    https://www.sparkfun.com/datasheets/...2401rev1_1.pdf

    Und danach gehen die Daten digital (meine ich zumindest dem Datenblatt des nRF zu entnehmen) an einen Controller: C8051F330 von Silicon Labs
    https://www.silabs.com/Support%20Doc.../C8051F33x.pdf

    Also meiner Meinung nach keine Stelle, an der ich ein Summensignal hätte.


    @Searcher
    Danke, diesen Thread habe ich bereits gelesen.
    Das es mit 6 Kanälen recht Zeitkritisch wird, habe ich mir fast gedacht.

    Villt bringt es was, die Ausgabe Frequenz auf 25Hz zu reduzieren, dadurch wird ein Servosignal 40ms lang, da dürfte sich doch dann eine genügend Lange Pause ergeben, um mal eben die Eingänge zu sampeln? Oder ist dieser Ansatz totaler Mist?

    Gruß Basti
     
  5. Avatar von PICture

    PICture:
    Sorry, ich habe dein Problem so verstanden, dass du alle Servoimpulse einzeln einlesen möchtest._.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
     
  6. Bomberpilot:
    Zitat Zitat von PICture Beitrag anzeigen
    Sorry, ich habe dein Problem so verstanden, dass du alle Servoimpulse einzeln einlesen möchtest._.
    Da hast du mich schon richtig verstanden, denn mangels Summensignal, in dem alle Servosignale zusammen liegen bleibt mir leider nur die Möglichkeit 6 getrennte Kanäle einzulesen. Aber eben auf 6 einzelnen Controller Pins. Und das wird mit der Ausgabe, zeitlich schon gewaltig eng.
     
  7. Peter(TOO):
    Hallo Basti,
    Zitat Zitat von Bomberpilot Beitrag anzeigen
    Hat jemand von euch eine Idee wie ich das lösen könnte, oder sowas ähnliches schon mal versucht.
    Die Frage ist ob alle Servo-Impulse gleichzeitig ausgegeben werden oder zeitlich versetzt?

    Der Servo-Impuls ist maximal 3ms breit. Ursprünglich wurde im Zeitmultiplex gesendet. So in der Art:
    0ms Kanal1
    5ms Kanal2
    10ms Kanal3
    15ms Kanal4
    20ms Kanal5
    25ms Kanal6
    30ms Kanal7
    40ms Kanal1
    ...

    Zwischen Kanal 7 und 1 fehlt ein Kanal, dadurch kann Kanal1 identifiziert werden.
    Entsprechend waren die Impulse an den Servos auch entsprechend zeitlich versetzt.

    Also miss das mal.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
     
  8. Bomberpilot:
    Hatte ich schon mal gemessen, und auch versucht mit Diodenmatrix wieder ne Art Summensignal aus den Kanälen zu generieren.

    Die Kanäle kommen zeitlich versetzt, aber direkt nacheinander, ohne Pause!
    Wenn Kanal 1 wieder auf LOW zieht geht exakt im selben Moment Kanal 2 schon auf HIGH. Hinter der Diodenmatrix hatte ich dann ein langes Signal.

    Gruß Basti
     
  9. Avatar von oberallgeier

    oberallgeier:
    ... RC-Empfänger, der ... kein Summensignal liefert ... 6 Servo-Signale ... erfassen ... manipuliert ... als 6 Servo-Signale ausgegeben ...
    Hi Basti,

    So etwas hab ich noch nie versucht. Aber wenn ich das so überlege: der Stress entsteht beim Auslesen, weil Du da im worst case alle Signale gleichzeitig oder so bekommst. Und gleichzeitig einlesen geht ja nu nich - oder doch ?? *ggg*

    Hintergrund: ich habe bei (wenigen) Servos die Auflösung gemessen, die liegt bestenfalls um die 4 .. 5 µs, Ähnliches steht in Herstellerangaben.

    Also schlage ich vor:
    - Ein controller, der die Eingangssignale an EINEM Port hat, z.B. Mega328 - Port B (am D hängt der Quarz :-/ )
    - 20 MHz Takt - das kann der 328er, meine jedenfalls laufen so primstens.
    - Eine schnelle Timerroutine, vielleicht 10 µs, die NUR den Port einliest, das ist EIN CPU-Takt, dazu noch ne Zeitmarke hochtickert und abspeichert. Damit wirst Du mit Overhead von den 200 verfügbaren Takten höchstens 50 für die ISR brauchen (nur meine Schätzung). Leider ist das nur die halbe theoretische Auflösung des Servos - aber schneller gibts dann sicher Zeitstress für den "Rest".
    - Du erhältst also ALLE Servosignale die innerhalb einer Zeitspanne von 10µs umschlagen.
    - Ausserhalb dieser ISR wird der jeweilige Portumschlag gesucht und mit Zeitmarke abgespeichert.
    - Nu kannst Du auswerten - und hast dazu reichlich Zeit. Wieviel? Mal sehen:
    - 6 Servosignale belegen maximal 6 x 2 ms, also 12 ms - von den standardmässigen 20. Servopuls setzen und löschen braucht höchstens die Hälfte für "alles" - siehe im Link und ähnlichen Threads ne wirtschaftliche Servoansteuerung. Und da denke ich eben bleibt genug Zeit für Deine Signalmanipulation (nicht geschätzt - nur erhofft).
    - Sinn dürfte es machen die ISR´s zur Servo-Ansteuerung als nested Interrupts laufen zu lassen, damit Du Deine Einleseroutine nie ausbremst !!!

    Funktion, Machbarkeit und Richtigkeit wird von mir nicht gewährleistet.
    Geändert von oberallgeier (17.12.2014 um 16:40 Uhr) Grund: Hinweis auf nested Interrupts bei "Ausgabe"
    Ciao sagt der JoeamBerg
     
  10. Peter(TOO):
    Hallo,
    Zitat Zitat von Bomberpilot Beitrag anzeigen
    Die Kanäle kommen zeitlich versetzt, aber direkt nacheinander, ohne Pause!
    Wenn Kanal 1 wieder auf LOW zieht geht exakt im selben Moment Kanal 2 schon auf HIGH. Hinter der Diodenmatrix hatte ich dann ein langes Signal.
    Wirklich gleichzeitig? Oder sind da nicht ein paar CPU-Takte als Lücke vorhanden.


    Dann halt mit 2 Matrixen:
    Matrix1: Kanal 1,3 und 5
    Matrix2: Kanal 2,4 und 6

    Dann bräuchte man nur noch 2 Timer, welche die Impulsbreite messen können!

    Dazu kenne ich aber die AVR zu wenig, müsste ich erst mal im Datenblatt nachsehen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?