Ich habe ein kleines Projekt mit einem Arduino Uno gemacht. Es handelte sich um Interrupts, da ich Encoder verwende, um zu messen, wie weit sich das Differentialradsystem vorwärts bewegt. Mein Roboter bewegt sich nur vorwärts. Ich verwende also nur einen einzigen Kanal von jedem Encoder. Hier sind meine beiden Interrupt-Routinen:
ISR (INT0_vect) {encoderRPos = encoderRPos + 1; } ISR (INT1_vect) {encoderLPos = encoderLPos + 1;}
Die Variablen encoderRPos
und encoderLPos
sind vom Typ flüchtig int
. Ich verstehe, dass die Variablen, die sich in einer Interruptroutine ändern, vom Typ flüchtig sein müssen. Dies dient dazu, andere Teile des Codes, die diese Variablen verwenden, zu warnen, dass sie sich jederzeit ändern können.
Aber was in meinem Code passiert ist, war etwas seltsam und ich konnte es nicht erklären. So berechne ich die vom linken Rad zurückgelegte Strecke:
#define distancePerCount 0.056196868 float SR = distancePerCount * (encoderRPos - encoderRPosPrev); float SL = distancePerCount * (encoderLPos - encoderLPosPrev); encoderRPosPrev = encoderRPos; encoderLPosPrev = encoderLPos;
Wenn ich jedoch Folgendes auf meinen seriellen Monitor drucke, stelle ich eine Anomalie fest:
Wenn Sie sich die dritte Spalte (SL) ansehen, ist ihr Wert nur für einige Zeit zu hoch. Das stört alle meine Berechnungen.
Der einzige Hinweis, den ich erhalten kann, wenn ich den Wert von SL (3682), der immer eine Konstante ist, nehme und (encodeLPos - encoderLPosPrev)
zurückrechne Ich erhalte 65519.66, was nahe am Maximalwert von unsigned int
liegt. Was bedeutet, dass (encoderLPos - encoderLPosPrev)
einen Überlauf verursacht, während beide Werte, deren Differenz angenommen wird, nur etwa 5000 betragen!
Und ich habe es geschafft, ihn zu lösen. Es war ein Glücksfall. So habe ich den Code geändert:
static int encoderRPosPrev = 0; statisch int encoderLPosPrev = 0; int diffL = (encoderLPos - encoderLPosPrev);
int diffR = (encoderRPos - encoderRPosPrev); float SR = distancePerCount * diffR; float SL = distancePerCount * diffL; encoderRPosPrev = encoderRPos; encoderLPosPrev = encoderLPos;
Ich kann nicht verstehen, was passiert ist. Gibt es etwas über flüchtige Variablen, über das ich hätte Bescheid wissen müssen?
Update: Hier ist der gesamte Code, wenn Sie jemals einen Blick darauf werfen möchten. Und es funktioniert sehr gut, nachdem es auf das geändert wurde, was in der akzeptierten Antwort vorgeschlagen wurde.