- LiFePO4 Speicher Test         
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
    Zitat Zitat von wkrug Beitrag anzeigen
    Eine der wichtigsten Erkenntnisse von C ist, das der Compiler von oben nach unten arbeitet.
    Hat mich 8 Std gekostet bis ich das im Zusammenhang mit den Header Dateien komplett verstanden habe. Jetzt ist es Logisch und ich finde die Herangehensweise, jede C Datei als "eigenständig" kompilierbares Programm zu generieren auch nicht mal schlecht.

    Zitat Zitat von wkrug Beitrag anzeigen
    Deshalb steht da auch die main Routine ganz unten.
    Wenn ich das Richtig verstanden habe ist es egal, wo die main() steht, solange ich oben bzw. in der Header Datei die Funktionen als Prototyp definiert habe, oder nicht?

    Zitat Zitat von wkrug Beitrag anzeigen
    Was mich persönlich bei C auch etwas nervt ist, das man für "Sonderfunktionen" immer erst die entsprechenden Includes im Programm machen muss.
    Also für Mathematische Funktionen, String Verarbeitung usw. müssen immer die entsprechenden Includes eingefügt werden.
    Genau das schätze ich an C Kein byte zu viel Schrott im Code, sondern nur was auch Sinn macht.

    BTT:
    Also die Eingänge laufen jetzt, Jitter werde ich mir mal ansehen, denke aber das ein gleitender Mittelwert über 3 Werte da schon einiges rausholen kann.
    Die Frage ist, was ich nun mit den Ausgängen mache. Timer1 ist ja nun blockiert :-/

    Gruß Basti

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.261
    Die Frage ist, was ich nun mit den Ausgängen mache. Timer1 ist ja nun blockiert :-/
    Wenn Du den Timer nicht im CTC ( Clear Timer at Comparematch ) Mode laufen lässt, kannst Du problemlos auch die Impulsgenerierung darüber machen.
    Du gibst den Comparematch Interrupt frei und stellst Ihn auf das nächste Ereignis ein.
    Wie weit Du bei der Impulsgenerierung schon bist, kannst Du mit einer Zählvariable abspeichern.
    Guck mal den Code ein paar Post's weiter vorne von mir an und zwar den Abschnitt
    Code:
    // Timer 1 output compare A interrupt service routine 
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)........
    Der Code ist für CodeVision, sollte aber auch mit ein paar Änderungen auf AVR GCC laufen.
    Elementar ist, das das TCNT1 Register nicht manipuliert werden darf, also keine Werte reinschreiben und kein CTC.
    Dann kannst Du, wenn Du lustig bist, sogar noch den Comparematch B für die Generierung einer weiteren Impulskette benutzen.
    Wenn Du die Variablen unsigned machst, sind auch Timer Überläufe kein Problem.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    Zitat Zitat von wkrug Beitrag anzeigen
    Dann kannst Du, wenn Du lustig bist, sogar noch den Comparematch B für die Generierung einer weiteren Impulskette benutzen..
    Danke, schau ich mir nochmal genauer an. Aber ich brauch keine Impulskette sondern wieder die 8 einzelnen Servo Signale sollen ja dann direkt die Servos dran.

    EDIT:
    Ich versteh das jetzt so:

    Also der Timer läuft einfach vor sich hin, kein Eingriff durch mich.
    Ich speicher die zeit beim beginn des Puls und beim Ende. Differenz ist dann die Dauer (aktuell Messe ich ja immer von 0 ab).
    Durch unsigned ist der Überlauf irrelevant.

    Wenn ich den Timer jetzt mit den ~4ms Überlauf so lasse, könnte ich bei jedem Überlauf einfach den Wert des nächsten Kanals in das Compare Register schreiben und den Ausgang high setzen. Und durch den Compare INT dann wieder auf LOW. Beim nächsten Timerüberlauf das gleich für den nächsten Kanal.

    Dann komme ich bei 6 Kanälen mit 4ms Paketdauer auf 24ms Dauer eines Signals für einen einzelnen Servo, statt der 20ms, denke das ist noch im vertretbaren Rahmen?

    Nur wie mache ich dann die Synchronistation auf CH1?
    Geändert von Bomberpilot (27.12.2014 um 09:48 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.261
    Also der Timer läuft einfach vor sich hin, kein Eingriff durch mich.
    Ich speicher die zeit beim beginn des Puls und beim Ende. Differenz ist dann die Dauer (aktuell Messe ich ja immer von 0 ab).
    Durch unsigned ist der Überlauf irrelevant.
    Genau richtig!

    Beim nächsten Timerüberlauf das gleich für den nächsten Kanal.
    Lass doch den Timer Überlauf Interrupt komplett weg und füg die Pausen zwischen den Pulsen auch bei der Comparematchroutine mit ein.
    Dadurch bleibt die Pausezeit auch variabel.
    Du musst nur darauf achten, das das Comparematchregister einen höheren Wert hat als das TCNT1 Register, sonst wird da kein Interrupt mehr ausgelöst.
    Eine Pause von 50µs reicht da völlig aus. Die CodeZeilen für das Setzen des TCC1Ax Register müssen abgearbeitet sein, bevor der TCNT1 diesen Zählerstand erreicht - Simulieren.

    Für die Mehrfachkanalausgabe auf verschiedenen Ports geht das im Prinzip genauso, weil wer sagt, das in einem Comparematchinterrupt nur ein Port verändert werden darf.

    Ich mach das so, das nach dem ersten Impuls der erste Port nach 0 gesetzt dann gleich der 2te gesetzt wird usw. bis alle Kanäle - Ausgänge durch sind.
    Dann fügst Du eine Pause ein, damit die Wiederholrate nicht zu groß wird und fängst dann wieder von vorne an.

    Für die Sync mit dem Empfänger gibt's im Prinzip mehrere Möglichkeiten.
    Einmal kannst Du für Kanal 1 einen eigenen Interrupt verwenden, dann ist Kanal 1 klar definiert.
    Zum anderen kannst Du die Pausen zwischen 2 Impulsketten auswerten, die ja mindestens 4ms betragen muß.
    Zum dritten kannst Du auch die Idee mit den Pin Change Interrupts realisieren, dann sind die Kanäle ohnehin klar erkennbar.
    Geändert von wkrug (27.12.2014 um 11:36 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.713
    ... bei 6 Kanälen mit 4ms Paketdauer auf 24ms Dauer eines Signals für einen einzelnen Servo, statt der 20ms ... im vertretbaren Rahmen? ...
    Die Antwort heißt eigentlich "im Prinzip könnte es gehen" - aber bei mir gehts wirklich gut! Und ich hatte anfangs deutliche Zweifel: bei meinem Archie (z.B. Video vom Kopf) verbrauche ich für die von mir gewünschte hohe Auflösung (Puls wird auf 0,4µs-Scheiben aufgeteilt - aber der Servo reagiert eher erst nach zwei, drei, vier µs) bei den im Kopf verbauten zehn Servoansteuerungen 25,60 ms für eine Servoperiode. Läuft aber ziemlich ansprechend finde ich.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.716
    Blog-Einträge
    133
    Hallo,
    @Bomberpilot: Ich bin mir nicht im Klaren, was für Signale bei Dir ankommen und wie Du sie weiterschicken möchtest.

    Ist es richtig, daß es 6 Servosignale (jedes zwischen 1ms und 2ms high) auf 6 verschiedenen Leitungen sind.

    Wenn das erste Signal low geht, geht direkt ohne Pause das zweite Signal auf high. Geht das auf low, sofort das dritte auf high usw.

    Da alle Signale verschiedene Längen haben können, ist die Schlußpause bis zum 20ms Raster, bis das erste Signal wieder high wird, unbestimmt lang und ist abhängig von den high Zeiten aller 6 Signale. (20ms minus Gesamthighzeit = Lowschlußpause)

    Du hast jetzt das erste, dritte, fünfte Signal per Dioden zusammengeführt und auf INT0 Pin vom µC gelegt. Das Gleiche mit dem zweiten, vierten und sechsten Signal auf INT1.

    Nun möchtest Du die Signale messen, modifizieren und in einem 4ms Raster ausgeben.

    Erstes Signal ab Zeitpunkt 0 ausgeben, zB 1,5ms lang high, dann low und bis 4ms warten, dann zweites Signal auf high, zB 1,2ms high, dann low, wieder bis Zeitpunkt 8ms warten, nächstes high usw.

    Die Ausgabe der Signale sollen alle auf dem gleichen µC Pin passieren.

    Großes Fragezeichen

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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    Zitat Zitat von Searcher Beitrag anzeigen
    Ist es richtig, daß es 6 Servosignale (jedes zwischen 1ms und 2ms high) auf 6 verschiedenen Leitungen sind.

    Wenn das erste Signal low geht, geht direkt ohne Pause das zweite Signal auf high. Geht das auf low, sofort das dritte auf high usw.

    Da alle Signale verschiedene Längen haben können, ist die Schlußpause bis zum 20ms Raster, bis das erste Signal wieder high wird, unbestimmt lang und ist abhängig von den high Zeiten aller 6 Signale. (20ms minus Gesamthighzeit = Lowschlußpause)

    Du hast jetzt das erste, dritte, fünfte Signal per Dioden zusammengeführt und auf INT0 Pin vom µC gelegt. Das Gleiche mit dem zweiten, vierten und sechsten Signal auf INT1.
    Bis hierhin absolut korrekt...

    Zitat Zitat von Searcher Beitrag anzeigen
    Nun möchtest Du die Signale messen, modifizieren und in einem 4ms Raster ausgeben.

    Erstes Signal ab Zeitpunkt 0 ausgeben, zB 1,5ms lang high, dann low und bis 4ms warten, dann zweites Signal auf high, zB 1,2ms high, dann low, wieder bis Zeitpunkt 8ms warten, nächstes high usw.

    Die Ausgabe der Signale sollen alle auf dem gleichen µC Pin passieren.
    Will die 6 Signale wieder getrennt voneinander ausgeben. Die sollen dann quasi direkt zu den einzelnen Servos.

    Die Ausgabe wird jetzt etwas anders realisiert.
    Die mache ich jetzt im Prinzip etwa so wie sie auch mein Empfänger macht.
    Schiebe einfach ein Bit durchs Port und warte per Compare Register immer so lange wie es an sein muss. (Dadruch ensteht der direkte Wechsel - ein Pin geht LOW, anderer gleichzeitig HIGH)
    Danach warte ich dann noch so lange bis 20ms voll sind.

    Das ganze mit Timer1 und Prescaler 1 (Eingabe UND Ausgabe) also mehr Auflösung wird sich nicht rausholen lassen.
    (Aktuell läuft Timer0 nur mit um die lange Pause zum synchronisieren zu erkennen. Der wird bei jedem INT resetet, läuft er nach 4ms über, gabs zu lange kein Signal mehr, also wird alles auf Anfang gestellt)

    Aktuell bin ich soweit, das nun beides funktioniert. Jitter scheint extrem gering zu sein, kann gerade nicht genau messen. Probiere ich aber noch.
    Muss noch optimieren. Aber ich reiche natürlich alles an Infos nach

    Gruß Basti

    EDIT:
    Wie am besten mit Analog Oszi den Jitter messen?
    Bekomm die Flanke leider nur bis 200uS/Div. ins Bild. Dort kann man auf jeden Fall einen Jitter < 10uS erahnen.
    Vermutlich noch kleiner, aber das hat dann mit messen weis Gott nix mehr zu tun.
    Geändert von Bomberpilot (28.12.2014 um 00:22 Uhr)

  8. #8
    Aktuell bin ich soweit, das nun beides funktioniert. Jitter scheint extrem gering zu sein, kann gerade nicht genau messen. Probiere ich aber noch.
    Muss noch optimieren. Aber ich reiche natürlich alles an Infos nach
    Ja, Ich freue mich auf diese Informationen. Das klingt sehr gut, das beides funktioniert.

    Gruß
    Enre



    iphone 6 tasche
    Geändert von bigbenball (31.12.2014 um 01:59 Uhr)

Ä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