- 12V Akku mit 280 Ah bauen         
Seite 7 von 8 ErsteErste ... 5678 LetzteLetzte
Ergebnis 61 bis 70 von 75

Thema: Mehrere RC Signale einlesen und mehrere Servos ausgeben

  1. #61
    Unregistriert
    Gast
    Anzeige

    Praxistest und DIY Projekte
    Hallo Searcher,

    danke für die Infos über asm. Du kein Ding is heute eh schon spät und vorallem Sonntag
    Interessant ist, dass ich den RC_Signal 1 eigentlich sehr gute Werte zwischen 2201 und 3812 bekomme.
    RC_Signal 2 kommt ziemlicher Quark an.

    1647 Impulslaenge_2
    1649 Impulslaenge_2
    1649 Impulslaenge_2
    1846 Impulslaenge_2
    2924 Impulslaenge_2
    6182 Impulslaenge_2
    7473 Impulslaenge_2
    8853 Impulslaenge_2
    10579 Impulslaenge_2
    38714 Impulslaenge_2
    40492 Impulslaenge_2
    16675 Impulslaenge_2
    1035 Impulslaenge_2
    1649 Impulslaenge_2
    1649 Impulslaenge_2
    2256 Impulslaenge_2
    2972 Impulslaenge_2
    3574 Impulslaenge_2
    3987 Impulslaenge_2

    irgendwie stimmt da etwas nicht.

    VG

  2. #62
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Fortsetzung:

    Servoausgabe:
    Die Servoimpulse für alle Servos werden nacheinander ausgegeben und der Timer0 mit seinem Overflow Interrupt
    zum Abmessen der Zeiten verwendet.

    Die Servoimpulslänge für jeden Kanal wird vom Hauptprogramm in den Variablen "Servoausgabe_1" bis "Servoausgabe_4" als Vorladewert (Servoausgabe_1 = 256 - Berechnung_1a) abgelegt.

    Tritt die ISR "Servoausgabe" zum erstenmal auf, wird Kanal 1 bearbeitet.
    Die ISR wird durch den Timer0 Overflow Interrupt aufgerufen.
    Der Vorladewert für den ersten Kanal wird geholt und der Timer0 damit geladen und der Portpin für Servo auf high gesetzt - Pulsbeginn. (Durch Abfrage des Zustandes des Portpins wird auf Puls beginnen oder Puls beendene entschieden)
    Nach Erreichen des nächsten Overflowinterrupts, die Zeit wird ja durch den Vorladewert bestimmt, wird das Servosignal nach low gesetzt - Pulsende.
    Dann wird die Kanalnummer noch erhöht und gleich der nächste Kanal bearbeitet mit Vorladewert holen und Pin für Pulsbegin auf high. Ablauf wie für Kanal 1.
    So werden 4 Ausgabekanäle ausgegeben und dann eine Ausgabepause gemacht um die ca. 50Hz für Servopulsfrequenz zu erreichen.
    Die "Pausenanfang" und "Pausenende" Instruktionen am Ende der ISR machen die ca. 20ms Folgen für die Servopulse. Wurden alle 4 Kanäle abgearbeitet/ausgegeben (ca 2ms * 4 = 8ms), wird eine Pause von 12ms auch durch temporäre Veränderung des Prescalers gemacht, damit weniger Interrupts auftreten und dadurch die Messung der Eingänge nicht so sehr gestört werden kann. Die 50Hz Ausgabe zu den einzelnen Servos ist etwas abhängig von den Pulslängen. Da die Genauigkeit von 50Hz aber nicht so kritisch sind, haben wir die damals vernachlässigt.

    Gruß
    Searcher

    PS
    irgendwie stimmt da etwas nicht.
    Bild hier  Bild hier   Sonst würde etwas nicht stimmen. Bild hier  
    Viel Erfolg beim testen. Bis dann.
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #63
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2015
    Beiträge
    10
    Hallo Searcher,

    also nach langem hin und her, habe ich jetzt zumindest erreicht, dass der Servo verfährt und auf die Eingangssignale des Empfängers hört.
    Ich habe die Codezeile: "Shift Berechnung_1 , Right , 3" und "Shift Berechung_1, Right, 4" umgeändert. Hierdurch wird das Eingangssignal des Empfängers von Neutral 2950 auf min 137 und max 236 umgerechnet; damit funktioniert es
    Das Servo reagiert jetzt eigentlich richtig, nur verfährt es in einem sehr kleinen Bereich, ziwschen den Werten "Signal Servoausgabe 2" (= MinPosition) und "Signalausgabe 60" (= MaxPosition Servo, sogar der harte Endanschlag des Servos). Den Prescaler des Timers0 auf 8 zu reduzieren, brachte nur einen Geschwindigkeitszuwachs aber keine Veränderung der Neutralposition und des Arbeitsbereichs des Servo.

    Interessant ist auch, dass das Eingangssignal des Empfängers immer kurzzeitig auf 24000 springt, wodurch die Berechnungen immer um 1 springen und damit das Servo langsam in die Minposition (Servoausgabe_1= 2) verfährt und dort verharrt. Ist aber wohl nur ein Filterproblem, welches sich sicherlich einfach lösen lässt.

    Ich sehen im Moment keine Lösung für den geringen Verfahrbereich. Kann das am Timing für den Servo (asm Schnittstelle) liegen? Prescaler und Pausenzeiten vielleicht?
    Wenn ich an der Fernsteuerung den Arbeitsbereich erweitere, oder den Nullpunkt verschiebe, erreiche ich nichts. Da die Variable Servoausgabe_1 ja begrenzt ist.

    Servoausgabe = 256 - Berechnung_1a

    Vielleicht hast du noch eine Idee. Dacht mir vielleicht dass es schon an der Demo Version von Bascom liegt, diese gibt ja maximal 4KB große Dateien frei, die *.bin Datei hat aber nur 3,44KB, sollte also i.O. sein.

    VG
    Tom

    Anbei nochmal der gesamte Code
    Angehängte Dateien Angehängte Dateien

  4. #64
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Tony DesWegeles Beitrag anzeigen
    Ich habe die Codezeile: "Shift Berechnung_1 , Right , 3" und "Shift Berechung_1, Right, 4" umgeändert. Hierdurch wird das Eingangssignal des Empfängers von Neutral 2950 auf min 137 und max 236 umgerechnet; damit funktioniert es
    Hab ich gesehen und darf aber nicht sein Die Division hab ich wieder rückgängig gemacht. Siehe weiter unten - Es gab Problem mit dem Takt von 16MHz.

    Interessant ist auch, dass das Eingangssignal des Empfängers immer kurzzeitig auf 24000 springt, wodurch die Berechnungen immer um 1 springen und damit das Servo langsam in die Minposition (Servoausgabe_1= 2) verfährt und dort verharrt. Ist aber wohl nur ein Filterproblem, welches sich sicherlich einfach lösen lässt.
    Man müßte genau wissen, was der Empfänger wirklich schickt. Servosignale sollen nur zwischen 1000µs und 2000µs lang sein. Ich gehe immer von 500µs bis 2500µs aus.
    Ich sehen im Moment keine Lösung für den geringen Verfahrbereich. Kann das am Timing für den Servo (asm Schnittstelle) liegen? Prescaler und Pausenzeiten vielleicht?
    Wenn ich an der Fernsteuerung den Arbeitsbereich erweitere, oder den Nullpunkt verschiebe, erreiche ich nichts. Da die Variable Servoausgabe_1 ja begrenzt ist.
    Servoausgabe = 256 - Berechnung_1a
    Vielleicht hast du noch eine Idee.
    Den Takt in Ordnung bringen und schauen ob das Durchschleifen paßt. Siehe unten.
    Dacht mir vielleicht dass es schon an der Demo Version von Bascom liegt, diese gibt ja maximal 4KB große Dateien frei, die *.bin Datei hat aber nur 3,44KB, sollte also i.O. sein.
    Ich nutze auch die Demoversion 2.0.7.5. Ist in Ordung und kann die Programmgröße noch händeln.

    Hier fängt "unten" an:
    Ich habe das Programm zum Durchschleifen von 3 Eingängen auf 3 Ausgänge verändert und mit einem Mega88A mal getestet.
    Das veränderte Programm "BaggerDurchschleif_V23_ATmel_V3_mega328.bas", lauffähig auf 16MHz ATMega328p ist im Anhang.

    Soweit ich noch alles zusammenbekomme gibt es folgende Veränderungen:

    1. Änderung bei der Clockdevision. Zweites CMD muß "Clkpr = &B0000_0001" sein, sonst wird das nix. (Bisher gab es dadurch bei 16MHz schon ein Problem weil es nicht gewirkt hat) $crystal ist noch auf 16000000. Dadurch, daß nach dem Heruntersetzen des Taktes der µC ja nur mit 8MHz läuft, wäre es vielleicht richtiger auch den $crystal Wert auf 8000000 zu setzten. Sollte aber im gegenwärtigen Programm keine Auswirkung haben, da keine WAIT Anweisungen oder so vorhanden sind. Es gibt allerdings deine PRINT Anweisung. Wenn der µC dann tatsächlich mit 8MHz läuft und $crystal noch auf 16000000 steht, geht die Ausgabe über UART dann wahrscheinlich nicht mehr.

    2. Die RC_Min und RC_max Werte angepaßt um Ausgabepulsbereich zu erweitern.

    3. Auskommentierung von allen Pulsveränderungen bis auf den Jitterausgleich. Das Durchschleifen getestet mit 3 Eingängen und 3 Ausgängen so gut es ich es mit einem Simulator durch einen Attiny44 auf die Schnelle hinbekommen habe. Läuft!

    Die Zeilen mit den Auskommentierungszeichen sind an den hash Zeichen (##########..) erkennbar. Die Zeilen einfach wieder rausnehmen.

    4. Anmerkung: Gemessen wird im Programm mit einer Auflösung von 1µs. Die Ausgabepulse werden mit einer Auflösung von 8µs ausgegeben. Divisionen durch 16 auf 8 rückgängig gemacht. (Jitterausgleich - funktioniert/wirkt laut R2D2, ich konnte das noch nicht testen - Jitter ist eventuell Ursache nur für Servozittern - zuletzt dran drehen, wenn sonst keine Ursache auszumachen ist)

    5. An Zeilen mit "srch" im Kommentar hab ich auch noch gewerkelt.

    6. Programm enthält noch auskommentierte Zeilen für meinen ATMega88A.

    7. Die ASM Teile und Portanpassungen von Dir wurden nicht verändert.

    So, und nun darfst Du Dich wieder auslassen.

    Gruß
    Searcher
    Angehängte Dateien Angehängte Dateien
    Geändert von Searcher (07.04.2015 um 18:41 Uhr) Grund: Erläuterungen zum Systemtakt (CLKPR) hinzugefügt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #65
    Unregistriert
    Gast
    Hallo Searcher,

    so endlich Wochenende und wieder mehr Zeit für das Projekt.
    Also ich habe deinen Code getestet und wirklich vielen Dank funktioniert sehr sehr gut.

    Ich habe dann noch die andere Teile wieder aktiviert |) und die gleichen Phänomene waren wieder da.

    If Tifr1.ocf1a = 1 And Berechnung_1 < 182 Then
    Set Tifr1.ocf1a 'Interruptflag löschen
    Servospeed = Berechnung_1 - Rc_min
    Servospeed = Servospeed * 500 'eine Einheit in Servospeed macht 1µs Wartezeit
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit 1000µs damit bei kleinen Werten kein kompletter timer rundlauf bis zum nächsten
    'comparematch abgewartet werden muß. Länger sollte auch eine Runde in der Hauptschleife nicht dauern.
    Ocr1a = Tcnt1 + Servospeed 'Setzen von OCR1A damit nach Servospeed ein Compare Match auftritt
    Decr Berechnung_1a
    End If

    Das Servo fährt in die Mittelstellung, wenn ich nun den Hebel auslenke fährt das Servo in die richtige Richtung aber die Geschwindigkeit bleibt in der jeder Situation die Selbe.
    Wenn ich die Fernsteuerung loslasse, fährt der Servo langsam in eine Endposition, da wieder das Eingangssignal kurzzeitig auf über 40000 geht.
    Meine Vermutung ist jetzt, dass der Teil Tifr1.ocf1a dafür verantwortlich sein muss, da hier anscheinend der Interrupt gelöscht wird, was vermutlich das Phönomen auslöst.
    Ganz habe ich diesen Codeteil auch nicht verstanden, den der Befehl "Decr" sagt nicht über die Geschwindigkeit aus und ist doch vom Takt der Berechnung abhängig.
    Wenn jetzt von 187 rückwärts gezählt wird, dann doch genau in dem Takt wie die Berechnung läuft, oder täusche ich mich da jetzt gewaltig?

    Vg
    Tom

  6. #66
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Tom,
    ehrlich gesagt bereitet es mir Mühe das Verhalten bei Dir theoretisch nachzuvollziehen.

    1. Die folgenden 4 Zeilen mußten auch noch raus. Hast Du aber vermutlich gemacht.
    Code:
    Servoausgabe_1 = 256 - Berechnung_1                         'srch Baggerarmservo 1,
    Servoausgabe_2 = 256 - Berechnung_2                         'srch Baggerarmservo 2
    Servoausgabe_3 = 256 - Berechnung_3                         'srch Fahrservo oder ESC 1
    'Servoausgabe_4 = 256 - Berechnung_4                         'srch Fahrservo oder ESC 2

    Zitat Zitat von Unregistriert Beitrag anzeigen
    Ganz habe ich diesen Codeteil auch nicht verstanden, den der Befehl "Decr" sagt nicht über die Geschwindigkeit aus und ist doch vom Takt der Berechnung abhängig.
    Wenn jetzt von 187 rückwärts gezählt wird, dann doch genau in dem Takt wie die Berechnung läuft, oder täusche ich mich da jetzt gewaltig?
    2. Ich versuche das mal zu erklären. Wie gesagt, ich habe keine Testumgebung mit Servos dazu. Getestet hat das R2D2 Bastler.

    "If Berechnung_3 < 187 Then 'falls der Betriebswahlkanal unter Mittelstellung ist, ist Fahrbetrieb"

    Welcher Betrieb ist bei Dir eingestellt? Im Baggerbetrieb ...

    Code:
    '--------------------------------------------------
    'BAGGERETRIEB
    '--------------------------------------------------
    If Tifr1.ocf1a = 1 And Berechnung_1 < 182 Then
        Set Tifr1.ocf1a                                         'Interruptflag löschen
        Servospeed = Berechnung_1 - Rc_min
        Servospeed = Servospeed * 500                           'eine Einheit in Servospeed macht 1µs Wartezeit
        If Servospeed < 1000 Then Servospeed = 1000             'Sicherheitszeit 1000µs damit bei kleinen Werten kein kompletter timer rundlauf bis zum nächsten
                                                                'comparematch abgewartet werden muß. Länger sollte auch eine Runde in der Hauptschleife nicht dauern.
        Ocr1b = Tcnt1 + Servospeed                              'Setzen von OCR1A damit nach Servospeed ein Compare Match auftritt
        Decr Berechnung_1a
    End If
    Im Else Zweig (Baggerbetrieb) kommt erst das Interruptflaglöschen zum Tragen.

    Der Timer1 läuft mit einer Auflösung von 1µs (1Mhz Takt)
    In Berechnung_1 steht die Sollpulslänge, eingelesen vom Input, von dem 1. Servo in 8µs Einheiten.
    Steht da zB 150 drin, bedeutet das, daß Servopulslänge für Servo1 soll 150*8µs = 1200µs werden
    Servo1 soll also nach Position 1200 gebracht werden.
    Servo1 steht aber auf Position, die in Berechnung_1a drinsteht.
    Es wird Berechnung_1a decrementiert, da Berechnung_1 < 182 ist.
    Würde Berechnung_1 zwischen 182 und 193 liegen (Fernsteuer vermutlich in neutral? ), würde nichts passieren.
    Die Abfrage wird für Servo1 immer dann ausgeführt, wenn der Comparematch1A auftritt.
    Die Abfrage wird für Servo2 immer dann ausgeführt, wenn der Comparematch1B auftritt.
    Servospeed = Berechnung_1 - Rc_min (Servospeed = 150 - 122 = 28 )
    Servospeed = Servospeed * 500 (Servospeed = 28 * 500 = 14000)
    Ocr1b = Tcnt1 + Servospeed (Ocr1b = Tcnt1 + 14000) Hier werden 14000µs bis zum nächsten Auftreten des Comparematches eingstellt.
    (Fehler? müßte Ocr1a = Tcnt1 + Servospeed sein, es sind also 14000µs (14ms), bis der Servo wieder ein 8µs Schritt durch decr Berechnung_1a macht)

    Da keine Interruptserviceroutine für die Compare-Matches benutzt wird, die die Interruptflags automatisch löschen würde, müssen die Flags mit "Set Tifr1.ocf1a" bzw Set "Tifr1.ocf1b" "von Hand" gelöscht werden.

    Die zusätzliche Verwendung des Timer1 als Zeitgeber durch Abfragen der Comparematchinterruptflags wurden gemacht um die Hauptschleife möglichst wenig aufzuhalten. Kann mich noch erinnern, daß ein Durchlauf sehr sehr weit unter den 1000µs war. Dein "Print" könnte da jetzt was ändern!

    Der Timer1 wird hier also nur als Zeitgeber für langsames Verfahren der Servos benutzt, da diese sonst so schnell es ihnen möglich ist ihre Sollposition anfahren würden. Sieht beim Baggerarm dann wohl nicht so gut aus. Ich weiß leider auch nicht - sieht mir nicht so aus - daß da eine Rampe (langsames Anfahren und schneller werden bzw umgekehrt geht) - weiß auch nicht wie die Fernsteuerung geht ... ???

    Im o.g. Teil müßtest Du mal OCR1B gegen OCR1A tauschen - scheint mir ein Fehler zu sein. k.A. ob das Absicht ist.

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

  7. #67
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2015
    Beiträge
    10
    Hallo Searcher,

    also gestern habe ich dann noch die Lösung gefunden und hab dann heute deine Vermutung gelesen.
    Jup es war der "Print" Befehl der alles aufgehalten hat.

    Danke trotzdem für die Erklärung der Funktionen Tifr1.ocf1b. Ich war dann heute gleich so beflügelt vom Erfolg, dass ich das Ganze noch um einen weiteren Servo erweitert habe.
    Ich habe einfach den letzten PIN-Change Interrupt ausgewählt PCINT2 und damit funktioniert es auch ganz gut.
    Nur leider ist es so, dass der CompareMatch im Timer1 (hoffe liege da richtig) nur Compare Match A und B kann und C nicht möglich ist.
    Daher meine Frage ob ich jetzt, damit alle drei Servos gleichzeitig verfahren werden können ich einen dritten Timer (Timer 2) aufmachen muss??

    Anbei nochmal der Code erweitert um den dritten Servo. Ich habe den Compare Match einfach kopiert, was ich wohl nicht machen darf?
    Den dritten Servo habe ich so gelegt, das PCMSK0, PCMSK1 und PCMSK2 auf unterschiedlichen Pins liegen und sich nicht stören sollten.
    Der Servo 4 ist über den Befehl Berechnung_4 = 255 ausgehebelt, somit kommt der nicht in die Quere.

    Wie gesagt es funktionieren alle drei sehr gut, 1 und 2 lassen sich gleichzeitig bewegen, also ruckelfrei, nur 3 fährt nur wenn 1 oder 2 stehen.

    If Tifr1.ocf1a = 1 And Berechnung_3 < 182 Then
    Set Tifr1.ocf1a
    Servospeed = Berechnung_3 - Rc_min
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr1a = Tcnt1 + Servospeed
    Decr Berechnung_3a
    End If

    If Tifr1.ocf1a = 1 And Berechnung_3 > 193 Then
    Set Tifr1.ocf1a
    Servospeed = Rc_max - Berechnung_3
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr1a = Tcnt1 + Servospeed
    Incr Berechnung_3a
    End If

    Meine Überlegung war jetzt einen weiteren Timer 2 aufzumachen um hier die beiden weiteren Compare Matches A und B verwenden zu können?
    Würde das so funktionieren, oder gibt es hier einen eleganteren Weg?

    VG
    Tom
    Angehängte Dateien Angehängte Dateien

  8. #68
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Tony DesWegeles Beitrag anzeigen
    Ich war dann heute gleich so beflügelt vom Erfolg, dass ich das Ganze noch um einen weiteren Servo erweitert habe. Ich habe einfach den letzten PIN-Change Interrupt ausgewählt PCINT2 und damit funktioniert es auch ganz gut.
    Hört sich ja prima an, gratuliere. (Ab jetzt dran denken, da kann was nicht stimmen )

    Nur leider ist es so, dass der CompareMatch im Timer1 (hoffe liege da richtig) nur Compare Match A und B kann und C nicht möglich ist.
    Was sagt das Datenblatt? Comparematch C gibt es hier nicht! Timer1 ist jetzt auch reichlich ausgenutzt und man muß anfangen aufzupassen, damit er nicht überlastet wird und unrund läuft

    Daher meine Frage ob ich jetzt, damit alle drei Servos gleichzeitig verfahren werden können ich einen dritten Timer (Timer 2) aufmachen muss??
    Ja, gute Idee. Vorher war das ja nicht möglich, da der ATTiny84, für den das Programm ja ursprünglich war, nur zwei Timer hat.

    Anbei nochmal der Code erweitert um den dritten Servo. Ich habe den Compare Match einfach kopiert, was ich wohl nicht machen darf?
    Na ja, die Comparematches sind den Servos zugeordnet und müssen für jedes Servo unabhängig sein. Die Abhängigkeit hast du ja bemerkt, indem Servo3 nur läuft wenn die anderen stehen. Dann wird das Interruptflag nicht gelöscht und steht noch für Servo3, das damit dann arbeiten kann.

    Den dritten Servo habe ich so gelegt, das PCMSK0, PCMSK1 und PCMSK2 auf unterschiedlichen Pins liegen und sich nicht stören sollten.
    Das sollte OK sein. Werd später nochmal in Dein Programm schauen.

    Wie gesagt es funktionieren alle drei sehr gut, 1 und 2 lassen sich gleichzeitig bewegen, also ruckelfrei, nur 3 fährt nur wenn 1 oder 2 stehen.

    If Tifr1.ocf1a = 1 And Berechnung_3 < 182 Then
    Set Tifr1.ocf1a
    Servospeed = Berechnung_3 - Rc_min
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr1a = Tcnt1 + Servospeed
    Decr Berechnung_3a
    End If

    If Tifr1.ocf1a = 1 And Berechnung_3 > 193 Then
    Set Tifr1.ocf1a
    Servospeed = Rc_max - Berechnung_3
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr1a = Tcnt1 + Servospeed
    Incr Berechnung_3a
    End If

    Meine Überlegung war jetzt einen weiteren Timer 2 aufzumachen um hier die beiden weiteren Compare Matches A und B verwenden zu können?
    Würde das so funktionieren, oder gibt es hier einen eleganteren Weg?
    Ja, ich denke, das es mit Timer2 funktionieren sollte. Weiß jetzt nicht, ob es was besseres geben würde. Eigentlich gibt es ja immer zig Möglichkeite. Timer2 läßt sich aber am einfachsten in das bestehende Programm einfügen. Ein CONFIG TIMER2 Kommando. Ausrechnen wie die Zeiten nach dem set tifr2.ocf2a sein müssen und analog zu den bestehenden Codezeilen anpassen.

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

  9. #69
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2015
    Beiträge
    10
    Hallo Searcher,

    ich hab jetzt den Timer 2 eingefügt:
    onfig Timer1 = Timer , Prescale = 8 'Timer für Einlesen RC Signale
    Start Timer1

    Config Timer2 = Timer , Prescale = 8 'Timer für Einlesen RC Signale
    Start Timer2

    Config Timer0 = Timer , Prescale = 64 'Timer für Servoausgabe, Wert 125 entspricht 1ms, Wert 250 entspricht 2ms
    Enable Timer0
    On Timer0 Servoausgabe Nosave

    und den unteren Teil habe ich folgendermaßen geändert

    If Tifr2.ocf2a = 1 And Berechnung_3 < 182 Then
    Set Tifr2.ocf2a
    Servospeed = Berechnung_3 - Rc_min
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr2a = Tcnt2 + Servospeed
    Decr Berechnung_3a
    End If

    If Tifr2.ocf2a = 1 And Berechnung_3 > 193 Then
    Set Tifr2.ocf2a
    Servospeed = Rc_max - Berechnung_3
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr2a = Tcnt2 + Servospeed
    Incr Berechnung_3a
    End If

    Das Ergebnis dieser Änderung ist, dass das dritte Servo deutlich zu schnell fährt. Aber ich kann alle drei Servos gleichzeitig betätigen.
    Vermutlich fehlt es jetzt nur am Timing. Ich habe in der Doku versucht zu verstehen, wie der Timer 2 funktioniert. Den Prescaler habe ich gleich gelassen wie bei Timer1.

    Anbei noch mal der geänderte Code.

    VG
    Thomas
    Angehängte Dateien Angehängte Dateien

  10. #70
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Tony DesWegeles Beitrag anzeigen
    Config Timer2 = Timer , Prescale = 8 'Timer für Einlesen RC Signale
    Start Timer2

    If Tifr2.ocf2a = 1 And Berechnung_3 < 182 Then
    Set Tifr2.ocf2a
    Servospeed = Berechnung_3 - Rc_min
    Servospeed = Servospeed * 500
    If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
    Ocr2a = Tcnt2 + Servospeed
    Decr Berechnung_3a
    End If

    Das Ergebnis dieser Änderung ist, dass das dritte Servo deutlich zu schnell fährt. Aber ich kann alle drei Servos gleichzeitig betätigen.
    Es geht schon mal was. Aber ganz so einfach ist es doch nicht. Der Timer2 ist ein 8-Bit Timer und das OCR2A Register hat auch nur 8 Bit. Wenn man da 14000, wie im obigen Beispiel bei Timer1, aufaddiert, läuft der nicht nur einmal über, was er machen darf/soll, sondern gleich mehrfach und ist so nicht mehr einfach handhabbar.

    Man muß also drauf achten, daß der Wert Servospeed für Servo3 einen Wert von 255 nicht übersteigt bzw die Zeit nicht kürzer als die Sicherheitszeit von 1000µs = 1ms wird.

    Wenn man den Timer2 mit Prescaler 1024 betreibt, braucht er für einen kompletten Durchlauf:
    8000000Hz/1024 = 7812,5Hz 1/7812,5Hz = 0,000128s 8Bit Timer = 256 Werte -> 0,000128s * 256 = 0,032768s
    Die längste Zeit, die zwischen zwei 8µs Bewegungen (Decr Berechnung_3a) von Servo3 liegt, können ungefähr 0,032768s sein.
    Die kürzeste Zeit soll eben die Sicherheitszeit sein, die dann 1000µs / 128µs = 8 Einheiten lang ist:
    If Servospeed < 8 Then Servospeed = 8 'Sicherheitszeit

    Berechnung_3 liegt ja irgendwo zwischen 182 und RC_Min (120)
    Servospeed = Berechnung_3 - Rc_min (zwischen 0 und 62)
    Damit man jetzt in etwa auf gleiche Verzögerung wie bei Timer1 kommt, wird mit 4 multipliziert.
    Servospeed = Servospeed * 4 (zwischen 0 und 248 (0 * 4 bzw 62 * 4))

    Könnte dann so aussehen ...
    Code:
    Config Timer2 = Timer , Prescale = 1024
    
    If Tifr2.ocf2a = 1 And Berechnung_3 < 182 Then
      Set Tifr2.ocf2a
      Servospeed = Berechnung_3 - Rc_min
      Servospeed = Servospeed * 4
      If Servospeed < 8 Then Servospeed = 8 'Sicherheitszeit
      Ocr2a = Tcnt2 + Servospeed
      Decr Berechnung_3a
    End If
    
    'Für INCR Berechnung_3a analog ...
    Die Steuerung bzw Langsamfahrt für Servo3 wird aber viel rauher sein ??? Bin gespannt ...

    Start Timer ist nicht notwendig. Spart Code und Timer werden durch Angabe von Prescaler im CONFIG TIMER Kommando gestartet.

    Keine Gewähr, ich könnte mich sicherlich irgendwo verrechnet haben Die Richtung sollte aber stimmen. Die Verzögerung der Servofahrt hat R2D2 Bastler, soweit ich mich erinnern kann, ausprobiert.

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

Seite 7 von 8 ErsteErste ... 5678 LetzteLetzte

Ähnliche Themen

  1. Mehrere analoge Werte über ein ADC einlesen möglich?
    Von HeXPloreR im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 07.08.2012, 18:18
  2. Schaltkreis für mehrere Servos
    Von Sebbokalypse im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 12.11.2009, 19:46
  3. Mehrere Signale umschalten
    Von flexxo im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 25.02.2007, 14:56
  4. Antworten: 9
    Letzter Beitrag: 02.04.2006, 18:53
  5. Mehrere Signale über einen Interrupt erkennen
    Von Minifriese im Forum Elektronik
    Antworten: 22
    Letzter Beitrag: 04.06.2004, 09:31

Berechtigungen

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

12V Akku bauen