- LiFePO4 Speicher Test         
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
    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

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

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

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

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

  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

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

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

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.695
    ... Die Zeiterfassung mit Interrupt hat immer das Problem mit Jitter. Kommt natürlich auf die nötige Genauigkeit an, ob das stört ...
    Genau das. In der Zeiterfassung steckt das Problem der Genauigkeit. Daher muss die Abtastung so schnell wie möglich erfolgen, meine skizzierter Vorschlag dazu siehe oben. Die zeitlich gerasterte Erfassung ist mit Verlusten in der Eingangsauflösung verbunden, ist mir klar (und oben angemerkt). Da macht es sicher Sinn, die sechs Eingangskanäle mit einem Logikbaustein zu überwachen (1 || 2 || 3 || 4 || 5 || 6) *) und das Ergebnis auf einen externen Interrupt zu geben (nach /RES die höchste Priorisierung). Getriggert wird hier natürlich auf beide Flanken (und ich weiß leider nicht, wie das mit Logikbausteinen realisiert wird oder ob es überhaupt realisiert werden kann). Die Portkonfiguration (siehe mein Posting oben) aller sechs Eingänge gleichzeitig (Zustand_alle = PINB ... gibts sowas in Bascom?) NUR in der extINT-ISR einlesen und mit Zeitmarke versehen ist dann an ein - oder mehrere gleichzeitige oder fast gleichzeitige - Signalereigniss/e gebunden. Spart unnötige Abfragen und wenn die restlichen ISR mit nested Interrupt gefahren werden wird das Jitterproblem noch geringer.

    Der Signalausgang nach all den Überarbeitungen ist wenig zeitkritisch, da es analoge Servos sind.

    *) Anmerkung: in C ist "||" ein "oder".

    PS: ja ich habe die anders gelagerten Vorschläge auch gelesen ;.-.)
    Geändert von oberallgeier (17.12.2014 um 22:28 Uhr)
    Ciao sagt der JoeamBerg

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
  •  

Solar Speicher und Akkus Tests