- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 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
    67
    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
    67
    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
    67
    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.
    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
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    Jo is ein 20MHz, sogar noch n gutes altes Hameg 203-6 aber wie gesagt, hab schon versucht mit 2 Kanälen zu messen, da sieht man absolut keine Pause zwischen den Pulsen.

    Das mit dem Capture Eingang werde ich prüfen. Der AVR hat aber wahrscheinlich nur einen? In meinem Fall Mega32, aber nur zum testen. Wenn der nur einen hat, fällt das fast wieder flach, wenn Ausgabe vom Empfänger so wie im nächsten Absatz beschrieben.

    Aber wenn die die Ausgabe ähnlich wie ich machen, gibt es keine Pause.
    Ich mache es mit nem Timer im CTC Mode und schiebe einfach ein Bit durch den Port.
    Immer wenn die erforderliche Zeit für einen Kanal verstrichen ist, wirds weiter geschoben. Danach wird dann noch so lange "leer" gewartet, bis die 20ms voll sind. Also eigentlich die beste und Ressourcen schonendste Methode, da nur ein Interrupt geworfen wird, wenn auch nötig.

    Gruß Basti

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

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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    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
    Ob da eine Quantenverschränkung mitgespielt hat??

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

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.237
    Auch die größeren AVR Controller haben nicht genug einzelne Interrupt Eingänge um 6 bzw. 7 Servosignale einlesen zu können.
    Ich würde mir mal die Pinchange Interups zu Gemüte führen, die fast alle neueren AVR Controller haben.
    Man muss dann nur in der Software rauskriegen welcher Eingang den Interupt mit welcher Flanke ausgelöst hat.
    Die Zeitmessung könnte dann über das auslesen des TCNT Registers eines 16Bit Timers stattfinden.
    Dazu vom TCNT Wert der fallenden Flanke den abgespeicherten TCNT Wert der steigenden Flanke bei jedem Kanal abziehen.
    Dieser 16Bit Timer kann dann auch gleich die Impulsgenerierung für das Summensignal übernehmen.
    Ein Problem könnte noch sein, das auf die Fallende Flanke sofort eine steigende des nächsten Kanals folgt.
    Wie sich das auswirkt wird man wohl nur experimentell rauskriegen.

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress