- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: Servoansteuerung Beispielprogramm "umbauen" auf Standard Receiver

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    Hallo wkrug,

    ich habe jetzt INT0 und INT1 laut Deinen Angaben dazu benutzt um mir beide Empfängerkanäle anzeigen zu lassen. Das funktioniert prima. Jetzt hast du geschrieben :

    Da der TCNT1 Wert durch diese Art der Impulsauswertung nicht beeinflusst wird, kannst Du den Timer auch noch für andere Zwecke verwenden, so lange das TCNT1 Register nicht manuell beschrieben wird.
    Es ist dabei sogar eine Servoimpuls Ausgabe von bis zu 16Kanälen zusätzlich mit den beiden OCR1x Interrupts auf diesem Timer1 zusätzlich möglich - Aber das war ja nicht die Frage.
    Jetzt interessiert mich natürlich auch die Ausgabe von den Servoimpulsen. Ich habe insgesamt 3 Servoausgänge die ich gerne auch über diesen Timer nutzen möchte. Könntest Du mir kurz erklären, wie Du dieses Problem gelöst hast ?

    Danke und Gruß Kay
    ...::: AVRFreak :::...

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    19.07.2011
    Beiträge
    66
    Hallo,
    ich habe den Empfänger bisher mit PULSEIN ausgewertet und bin ganz zufrieden.

    Für Servos kann man Pulseout nehmen - aber das soll nur eine geringe Auflösung haben...(habs nicht getestet)

    gruß, stfan

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Könntest Du mir kurz erklären, wie Du dieses Problem gelöst hast ?
    Das hab ich mit OCR1A und B gemacht.
    Ich beschreibe das mal für 8 Kanäle und OCR1A - Mit OCR1B funktioniert das genauso.
    Zuerst definierst Du eine Zählvariable und ein Array in dem die gewünschten Servoimpuls ausgabelängen abgelegt sind.
    Und zwar eine Array mit 9! Werten, da Du ja auch nocn ne Pause zwischen den Impulsen machst.
    Der Comparematch Interrupt 1A wird aktiviert.
    In diesem Comparematch Interrupt wird der erste Ausgang auf 1 gelegt und der OCR1A mit der TCNT1 + Impulslänge1 ( Impulslänge1 entspricht dem ersten Wert im Array ) vorbelegt.
    Das wars dann eigentlich schon.
    Tritt der Interrupt dann wieder auf wird Ausgang 1 abgeschaltet und Ausgang 2 aktiviert. TCNT1 + Impulslänge2 in das OCR1A Register und so fort.
    Sind nun alle Kanäle übertragen, werden alle Ausgänge abgeschaltet und die Interframe Pause von mindestens 4ms eingefügt.
    Die Zählvariable dient dabei zur indizierung des Arrays ( OCR1A=TCNT1 + ARRAY[Zählvariable]; ) und auch gleichzeitig als Switch Variable, welcher Ausgang gerade dran ist.
    Die Beschränkung auf 8 Kanäle kommt daher, das ein "normales" Servo einen Refreshzyklus von 20ms hat. Also bei 2ms maximal Pulslänge bleiben Dir 4ms für den Interframe ( Pause ). Wenn du mit längeren Refreshzeiten leben kannst gehen da noch mehr Kanäle.
    Da das Ganze Spielchen im Interrupt läuft brauchst Du eigentlich nur das Array mit neuen Werten zu versorgen und das Ganze läuft praktisch im Hintergrund ab.

    Das Gleiche kann man dann noch mal für den OCR1B machen und somit 8 weitere Kanäle ansteuern.

    Bastel aber nicht zu viel Zeug in diese Impulsauswerte und Senderoutinen mit rein, sonst gibts Jitterprobleme, weil dein Controller ja nicht unbeschränkt schnell arbeiten kann und sich dann die Interrupts überlappen können, was dann zu besagten Problemen führt.

    Wenn Du ganz auf Nummer sicher gehen willst, solltest Du die Interrupts bei Schreiben auf das Array unterbinden. Da es sich dabei ja um 2Byte Werte handelt, könnte theoretisch ein Interrupt zwischen dem Ersten und dem zweiten Byte auftreten und dabei eine Störung in der Impulslänge hervorrufen.
    Bei mir hat das aber noch nie Probleme gemacht!

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    @stfan:

    ich habe den Empfänger bisher mit PULSEIN ausgewertet und bin ganz zufrieden.

    Für Servos kann man Pulseout nehmen - aber das soll nur eine geringe Auflösung haben...(habs nicht getestet)
    Pulsein und Pulseout habe ich vorher verwendet. Wenn ich aber 3 Empfängerkanäle auswerten will, verlieren die Servo´s ihre Stellkraft, weil Pulsein zuviel Zeit in Anspruch nimmt und die Refreshrate von 20ms nicht mehr gehalten werden kann. Die Auflösung von Pulseout ist auch im µS Bereich, also auf jedenfall eine hohe Auflösung.

    @wkrug:

    Und wieder bringst Du mich zum krübeln. Ich werde das testen und berichten. Vielen Dank

    Gruß Kay
    ...::: AVRFreak :::...

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    @BlaueLed
    Ich muss Dir jetzt auch mal ein Lob aussprechen.
    Du bist wohl Einer der wenigen Bascom Anhänger, der sich auch in der Tiefe, mit der Hardware der AVR Controller befasst und versucht eigene Lösungen umzusetzen.
    Und nicht nur die vorgegebenen Lösungen von Bascom verwendet.
    Ich komm aus der Assembler Ecke und hab dann nach 2 Wochen Bascom zu C gewechselt, weil mir Bascom zu sehr abstrahiert war.
    Assembler ist leider für längere Projekte zu komplex. Als Inline Assembler für zeitkritische Sachen nehm ichs immer noch gerne her.
    Beim RC-Lineforum : http://www.rclineforum.de/forum/boar...inst/?1920527e gibts ein relativ gutes Tutorial, gerade mit der ganzen Impulsauswerte und Senderoutine.
    Die Leute da nutzen aber größtenteils auch die Bascom internen Routinen.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    Ich muss Dir jetzt auch mal ein Lob aussprechen.
    Danke. Ich verwende auch die Bascom internen Routinen, wenn es nichts zeitkritisches ist. Aber beim einlesen von 3 Kanälen und "gleichzeitiges" ausgeben dieser auf die Servo´s kommt Bascom halt schnell an seine Grenzen. Es geht zwar, aber nur mit Verlust der Kraft an den Servo´s. Wenn ich jetzt mal Zeit habe, werde ich Deinen Vorschlag zwecks Timer benutzen ausprobieren.

    Gruß Kay
    ...::: AVRFreak :::...

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    Hi,

    Ich habe mir mal den atXmega32 angesehen. Der hat 5x 16bit timer und pro timer 3x single slope (fast pwm mode 14 bei den atmega ). Damit kann ich die servoansteuerung komplett per hardware machen und brauche mich um keine interrult prioritäten zu kümmern. Ich werde mir mal einen zum testen bestellen.

    Kayle
    ...::: AVRFreak :::...

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  2. Roboterhand: "kontinuierlich" Servoansteuerung
    Von ExXeQtor im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 26.10.2010, 18:53
  3. Antworten: 45
    Letzter Beitrag: 24.11.2008, 12:35
  4. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  5. Gibt es einen "Standard" Leitungstreiber?
    Von Jodel im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 28.11.2006, 13:43

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress