Hallo zusammen
ich hab 6 Jahren nicht mehr mit Programmieren gemacht und nun hat es mich wieder gepacktund ich bin grad am Überlegen, wie ich mein Programm eigentlich aufsetze. Bin natürlich so gar nicht mehr drin im Programmieren und so wirklich aus dem Anfängerstadium raus war ich noch nie.
Wohl mit Interrupts, ich hab mir gestern auch endlich mal das Arduino Due gegönnt für genug Interrupteingänge.
Und zwar hab ich zwei digitale Sensoren, die von tief auf hoch gehen und wieder zurück und einen digitalen Encoder mit A, B und Z-Spur und ich möchte nun wissen, wie für wie viele Encoderpulse das Signal nun hoch war. Die beiden Sensoren sind versetzt auf hoch, Sensor 2 ist immwe apäter.
Der Zeitraum, in dem die beiden Signale für 1-3 ms auf hoch beträgt im schnellsten Fall 20 ms (es kann aber auch alles sehr viel langsamer gemacht werden). In der Zeit werden 214 Encoderencremente durchfahren empfangen (wenn ich alle steigenden und sinkenden Flanken der A & B Spur zähle vermehrt sich das auf 4*214 = 856, oder?)
Aber nun die Frage wie man sowas gescheid und nicht zu rechenintensiv aufbaut.
Ich hab bisher erst sequentiell progrmmiert und muss mich zuerst noch in das Arbeiten mit Interrupts eindenken.
Meine Anfänger-Überlegungen zum Aufsetzen des Programms sind folgende:
- Interrupt 1: A-Spur des Encoders, zählt eine Variable "Encoderpulse" hoch, wenn eine sinkende oder fallende Flanke detektiert wird
- Interrupt 2: B-Spur des Encoders: zählt die gleiche Variable "Encoderpulse" hoch, wenn eine sinkende oder fallende Flanke detektiert wird
(Drehrichtung muss ich nicht detektieren, die ist immer gleich)
- Interrupt 3: Sensor 1 steigende Flanke: Nullen der Variable Encoderpulse
- Interrupt 4: Sensor 1 sinkende Flanke: Schreiben der Anzahl Encoderpulse in eine Variable "Anzahl_Pulse_1"
- Interrupt 5: Sensor 2 steigende Flanke: Nullen der Variable Encoderpulse
- Interrupt 6: Sensor 3 sinkende Flanke: Schreiben der Anzahl Encoderpulse in eine Variable "Anzahl_Pulse_2"
- (Interrupt 7: Z-Spur des Encoders: Nullen einer Mitlaufenden Variabeln?)
Würdet ihr das auch so aufsetzen oder ganz anders?
Kurz nach Interrupt 6 (oder seinem Fehlen) möchte ich die Anzahl_Pulse 1 und 2 Auswerten.
Wie mache ich es am besten, dass ich sicherstellen kann, dass ich eine Auswertung zum richtigen Zeitpunkt stattfindet (also zeitlich nach Interrupt 6 und vor Interrupt 3 des nächsten Zyklus? - auch dann wenn Interrupt 6 mal fehlen sollte, da es nichts zu messen gab).
Die für mich naheliegendste Lösung mit dem Zeitzähler fällt weg, da das ganze mit ganz unterschiedlichen Geschwindigkeiten läuft und ich nicht weiss, zu welchem Zeitpunkt die Messungen soweit sind.
Ein weiterer Interrupt auf der Z-Spur des Encoders hätte sich angeboten, nur kommt die nur alle 7 Messzyklen vorbei (gut rein theoretisch kann ich eine Übersetzung zum Encoder bauen, dass das Z-Signal einmal pro Messzyklus kommt, aber wenns auch ohne geht...)
Würdest ihr eine eine weitere Interruptzählvarianble im ISR 1 definieren, die nur einmal pro Messzyklus (oder sogar einmal pro 7 Messzyklen) genullt wird?
Und sobald die z.B. bei 857 ankommt, die Auswertung starten? Und wenn ja wie? Frage ich da z.B. im ISR 1 jedes mal ab, ob die Variable nun diesen Wert hat und rufe die Auswertefunktion aus, oder wie?
Und wie stelle ich sicher, dass ich jeweils die Anzahl_Pulse_1, die ich auswerte aus dem jeweils aktuellen Messzyklus kommen?
Fehlende Messungen würde ich wohl abfangen, in dem ich Anfangswerte von 0 setze nach dem Auswerten.
Und was passiert eigentlich, wenn ich z.B. in dieser Auswertefunktion bin und Interrupts vorkommen?
(Encoderinterrupts werden ja sicher kommen). Das wechselt einfach kurz in den entsprechenden Interrupt und wieder zurück oder grosse Nebenwirkungen? Zeitverluste?
Ich weiss, dass ich mit fast 20 ms bis der nächste Zyklus bereit ist ausgewertet zu werden, genug Zeit habe um die Anzahl Pulse mit dem zulässigen Bereich abzugleichen und davon abhängig Ausgänge zu setzen. Aber es fällt mir einfach noch schwer zu glauben, dass 20 ms viiiiel Zeit sind.
Meine bisherigen Roboter waren seeeeehr viel gemächlicher. Da lief manchmal für viele Minuten nichts.
Danke schonmal fürs Mitdenken, Überlegungsfehler finden, Verbesserungsvorschläge und Tipps oder auch nur schon für eine Bestätigen, dass es so klappen könnte.
Fühl mich grad echt unsicher nach so vielen Jahren ohne Programmieren und Interrupts hab ich eben sogar noch gar nie versucht.
Liebe Grüsse
Getorix
Lesezeichen