Bin momentan mal wieder am Selbstfahrauto dran. Hab nun Servo, Ultraschall und 2 Motoren sauber am Laufen, will nun aber noch die Rückkopplung der Drehzahl für die Regelung. Und da stosse ich auf Timingprobleme. Der Flankenwechsel muss meines erachtens via Interrupt ausgewertet werden.
Kurze Projektbeschreibung
2 Motoren an Hinterachse, Einzelradsteuerung mit Lenkrolle vorne (Dreirad). Motoren haben Lochscheibe mit 20 Felder über Lichtschranke erfasst. Ultraschall erkennt Hinderniss und weicht aus, dazu pendelt der Sensor via Servo radarähnlich nach links und rechts.
Ziel: Zur möglichst schnellen und genauen Drehzahlregelung möchte ich die Zeitabstände jeder Lichtschranke von positiver Flanke zu positiver Flanke ermitteln. Wir reden dabei von 9ms. Reifenumfang 18cm, Speed max 1m/s, ergibt ca 9ms zwischen zwei Schlitzen, bei 20 Schlitzen pro Umdrehung.
Was ich eben noch nicht gemacht habe: Interrupt selbst programmieren. Wo fang ich an, auf was habe ich im Interrupt zugriff? Kann ich in der IDE meine Variablen einfach auch im Interrupt benutzen? Wieviel Zeit verliere ich, wenn ich dabei die micros() einlese und eine Differenz zum vorherigen Wert berechne
Beispielcode für Linke Seite
B_links = micros();
Diff_links = B_links - A_links;
A_links = B_links;
Diff_links_rechts = Diff_links - Diff_rechts
Soweit ich interrupts noch im Kopf habe bei anderen CPU-Typen, blockiert der gerade laufende Interrupt das Ausführen eines weiteren, der wird aber dann im Anschluss ausgeführt. Welche Zeit würde mein Beispielcode wohl so brauchen?
Jede Lichtschranke muss ja ihren eigene Interupt haben, da sie Zeitversetzt laufen. Aus Diff_links_rechts erzeuge ich dann meine Speed-Korrektur im Hauptprogramm.
Brauch kein fertiges Script, nur eine Einstiegshilfe in Interruptprogrammierung. Den Beispielcode auf arduino.cc - language kapier ich zwar soweit, aber was muss ich beachten bei den Variablen. Darf ich irgendwas nicht benutzen (zb micros() im Interrupt). Hat jemand schon Codeteile um Lichtschrankensignale an Radumdrehungen auszuwerten? Blockiert sich da irgendwas während mein Interupt läuft. zB andere Interrupts für die Motoransteuerung oder den Servo.
Danke
chefin