- fchao-Sinus-Wechselrichter AliExpress    Werbung      
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 60

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    68
    Beiträge
    2.435
    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?

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    68
    Beiträge
    2.435
    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?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    @oberallgeier
    Ich führe mir das nach dem Abendessen nochmal genauer zu gemüte und denk drüber nach, klingt aber nach einen Sinnvollen Ansatz

    @Peter
    Ich vermute wirklich gleichzeitig, das Analog Oszi sieht nicht das kleinste Zucken.
    Aber - Man ohhh Man, wieso bin ich da nicht selber drauf gekommen - 2 Matrixen...
    dann wären es wirklich erst mal nur 2 Kanäle zum auswerten, deren Signale sich ja auch NIE "über"schneiden sondern nur aneinander anschließen.

    Gruß Basti

    EDIT:
    @Oberallgeier
    Die Idee an sich ist nicht schlecht - Bauchschmerzen macht mir die Tatsache, das mir dann alle 10uS ein Interrupt geworfen wird, wovon so ca 99,9% sinnlos passieren, da sich die Zustände in einem Zyklus ja nur 12 mal ändern.

    @Peter
    Aber da kommt mir mit der 2 Matrix Methode eine geniale und einfache Idee.

    Beide Signale kommen an Interrupt Eingänge.
    Ein Timer läuft einfach vor sich hin. Bei Überlauf wird KEIN Interrupt geworfen. Bzw ein Überlauf könnte auf Signalverlust hinweisen (Fail-Safe Funktion)

    -INT0 is aktiv und wartet auf High Flanke
    -INT1 is deaktiviert
    -Kommt nun ein Signal an INT0 wird der Timer auf 0 gesetzt INT0 deaktiviert und INT1 aktiviert
    -Bekommt dann INT1 sein Signal wird der Timerwert gespeichert (=Länge Kanal 1), der Timer auf 0 gesetzt, ein Kanal Zähler erhöht und INT1 deaktiviert + INT0 wieder aktiviert.
    -Kommt nun wieder auf INT0 ein Signal wieder Wert speichern, Timer Reset, Kanal Zähler erhöhen, INTs tauschen usw...

    -Wenn dann der Kanalzähler auf 6 steht, wird der Interrupt nicht getauscht sondern der aktuelle auf Fallende Flanke umkonfiguriert, gibt ja keine weitere High Flanke mehr in diesem Zyklus.
    -Wenn diese LOW Flanke dann kommt, wieder Wert speichern, und alles auf Anfang:
    INT0 aktiv
    INT1 deaktiv
    Kanal Zähler 1

    Ping Pong Prinzip Quasi...

    müsste doch klappen oder nicht?

    Vorteil:
    Es wird wirklich nur ein Interrupt geschmissen wenn auch wirklich was passiert.

    Gruß Basti
    Geändert von Bomberpilot (17.12.2014 um 17:35 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    68
    Beiträge
    2.435
    Hallo Basti,
    Zitat Zitat von Bomberpilot Beitrag anzeigen
    @Peter
    Ich vermute wirklich gleichzeitig, das Analog Oszi sieht nicht das kleinste Zucken.
    Welche Bandbreite hat der?
    Die Pulse müssten in der Grössenordnung <1µs liegen, das sollte ein 20MHz-Ozi noch anzeigen können.
    Wenn du 2 Kanäle hast, kannst du doch mal 2 benachbarte Kanäle anzeigen lassen und die Differenz der Flanken messen.
    Möglicherweise war deine Diodenmatrix nur zu langsam.

    Zitat Zitat von Bomberpilot Beitrag anzeigen
    Aber da kommt mir mit der 2 Matrix Methode eine geniale und einfache Idee.

    Beide Signale kommen an Interrupt Eingänge.
    Ein Timer läuft einfach vor sich hin. Bei Überlauf wird KEIN Interrupt geworfen. Bzw ein Überlauf könnte auf Signalverlust hinweisen (Fail-Safe Funktion)

    -INT0 is aktiv und wartet auf High Flanke
    -INT1 is deaktiviert
    -Kommt nun ein Signal an INT0 wird der Timer auf 0 gesetzt INT0 deaktiviert und INT1 aktiviert
    -Bekommt dann INT1 sein Signal wird der Timerwert gespeichert (=Länge Kanal 1), der Timer auf 0 gesetzt, ein Kanal Zähler erhöht und INT1 deaktiviert + INT0 wieder aktiviert.
    -Kommt nun wieder auf INT0 ein Signal wieder Wert speichern, Timer Reset, Kanal Zähler erhöhen, INTs tauschen usw...

    -Wenn dann der Kanalzähler auf 6 steht, wird der Interrupt nicht getauscht sondern der aktuelle auf Fallende Flanke umkonfiguriert, gibt ja keine weitere High Flanke mehr in diesem Zyklus.
    -Wenn diese LOW Flanke dann kommt, wieder Wert speichern, und alles auf Anfang:
    INT0 aktiv
    INT1 deaktiv
    Kanal Zähler 1
    Noch genauer wird das Ganze, wenn du anstatt des INTx den Capture-Eingang des Timers nimmst. Bild  
    Der einzige Nachteil ist, dass du dann die Differenz zum letzten Zählerstand berechnen musst und beim Überlauf musst du aufpassen mit der Rechnung.
    Der Jitter liegt dann aber bei +/-1 Zählerauflösung, egal wie lange es dauert bis der Interrupt abgearbeitet wird.
    Mit 1MHz-Timertakt hast du schon eine Auflösung von +/- 2µs.

    Der Capture-Eingang müsste auch mit den µs-Signalen zurecht kommen, dann müsstest du nicht mal die Flanke umschalten.

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

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das zusammenschalten in 2 Gruppe ist eine gute Idee. Die meisten der kleineren AVRs haben zwar nur eine Input-capture Einheit (an Timer 1), können aber dafür sowohl den ICP Pin als auch den analogen Komparator als als Eingang nutzen. Die Input Capture Einheit erlaubt eine genaue Zeitmessung ohne von Interrupts gestört zu werden.

    Wenn man es geschickt macht, kann man den Timer 1 trotzdem noch für die Erzeugung der Ausgangssignale nutzen - die output Compare Einheiten bleiben erhalten. Man muss nur den Timer durchlaufen lassen und die passenden Zeiten für die Interrupts programmieren.

    Um die Ausgabe nicht zu stören wäre ein freigeben von Interrupts angesagt und ggf. auch die Benutzung von etwa ASM, denn Bascom erzeugt recht viel Overhead beim Interrupt.

    Wenn sicher ist, dass die Eingangsignal ungestört sind, könnte man die auch per PinChange Interrupt erfassen, und auch da ein Unterbrechen der Interrupts erlauben.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    Zitat Zitat von Besserwessi Beitrag anzeigen
    Wenn man es geschickt macht, kann man den Timer 1 trotzdem noch für die Erzeugung der Ausgangssignale nutzen - die output Compare Einheiten bleiben erhalten. Man muss nur den Timer durchlaufen lassen und die passenden Zeiten für die Interrupts programmieren.
    Mehr dazu bitte Bild  

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    68
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von Besserwessi Beitrag anzeigen
    Wenn sicher ist, dass die Eingangsignal ungestört sind, könnte man die auch per PinChange Interrupt erfassen, und auch da ein Unterbrechen der Interrupts erlauben.
    Die Zeiterfassung mit Interrupt hat immer das Problem mit Jitter. Kommt natürlich auf die nötige Genauigkeit an, ob das stört.

    Die kürzeste Ansprechzeit, hängt schon vom gerade bearbeiten CPU-Befehl ab. Dieser wird bei den meisten CPUs erst mal zu Ende abgearbeitet. Komplexe Befehle wie MUL und DIV können da schon einige Takte benötigen.

    Dann kommt der Interrupt-Controller ins Spiel. Der setzt Prioritäten und dann können andere Interrupts zuerst bedient werden.
    Normalerweise sind Interrupts während der Ausführung einer ISR gesperrt. Je nach Laufzeit der ISR gibt dies weitere Verzögerungen.

    Der Rest ist dann Glückssache, was in der Praxis wie oft zusammenfällt!

    Ich hatte da. vor langer Zeit, auch mal ein Interrupt-Problem:
    Ein 6502 mit 1MHz Takt.
    Für 1µs war da der Interrupt enabled, wo das nicht sein sollte.
    Bei manchen Geräten führte dies nur so 1x in der Woche zu einem Absturz, bei anderen schon nach einigen Minuten.
    Selbst auf den Zufall ist nicht verlass Bild  
    Ob da eine Quantenverschränkung mitgespielt hat??

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

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.746
    ... 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

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Mehrere RC Signale einlesen und mehrere Servos ausgeben
    Von R2D2 Bastler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 74
    Letzter Beitrag: 10.01.2022, 08:35
  2. RC-Signal einlesen verändern und wieder ausgeben.
    Von DanielSan im Forum Arduino -Plattform
    Antworten: 1
    Letzter Beitrag: 21.03.2013, 11:58
  3. Atmel128 Spannungen einlesen und Ausgeben (Display3000)
    Von Gantenbein im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 31.08.2007, 21:41
  4. Mehrere Signale umschalten
    Von flexxo im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 25.02.2007, 13:56
  5. Servoimpulse einlesen und ausgeben
    Von moelski im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.08.2006, 07:24

Berechtigungen

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

    Werbung      Labornetzteil AliExpress