Es geht nicht um Vorteile. Es geht eigentlich nicht anders. Beispiel Stepper: wenn du ihn mit 1kHz (1ms) taktest, musst du dich (oder eher der µC) alle Millisekunde um ihn kümmern. Kein anderer Programmteil darf dich länger als eine knappe Millisekunde davon ablenken. In der AccelStepper wird das so gemacht und in der Beschreibung heisst das dann so:
Und hier nachmal etwas zu "called frequently":The run() function must be called frequently until the motor is in the desired position, after which time run() will do nothing.
4000 Schritte heißt 250µs pro Schritt. Wenn der Stepper so schnell laufen soll, darf in loop() nichts gemacht werden, was länger als diese 250µs dauert. Mit Sicherheit darf also kein "dummer" US-Sensor ausgelesen oder ein delay() verwendet werden. Aber auch jede andere Funktion Funktion ist problematisch. Und weil ich gerade die AccelStepper Doku offen habe:The fastest motor speed that can be reliably supported is about 4000 steps per second at a clock frequency of 16 MHz on Arduino such as Uno etc.
Hier wird darauf hingewiesen, daß schon das Berechnen der Quadratwurzel zeitlich ein Problem ist. Das wird man zwar nicht oft machen, so daß es einem menschlichen Beobachter nicht auffällt, für die Stepper stellt aber schon die einmalige Benutzung ein Problem dar. Es gibt natürlich handgefeilte Systeme, die mit diesen Bedingungen leben können wie 3D Drucker oder CNC-Systeme mit grbl. Da kann man dann nachträglich kaum noch etwas hinzufügen.Calling setAcceleration() is expensive, since it requires a square root to be calculated.
Nun kann man natürlich sagen, für deinen Outdoor muß alles nicht so schnell gehen. Das ist sicher richtig, verschleiert aber das grundsätzliche Problem. Wenn jetzt zu den Steppern, US-Sensoren noch weitere wie Lidar und GPS etc. hinzukommen und weitere Aufgaben wie die Kommunikation mit z.B. einer Fernbedienung, Telemetrie usw. zu erledigen sind, ist es wieder da.
Die Lösung, die üblich ist und für die Unterstützung in die µC eingebaut sind heißt Interrupt. Alle anderen Konzepte, wie z.B. bei den Transputern haben sich nicht durchgesetzt. Die "alten" Prozessoren wie Z80 oder 8088 brauchten noch einen externen Baustein zur Unterstützung, den fand man auf fast jedem Prozessorboard.
Die Idee finde ich gut. Nur kann ich mit Codebeispielen schlecht dienen. Ich habe keine AVR und keine Arduinos sonder PIC, vorzugsweise PIC24 und programmiere die in C. Das Konzept "Interrupt" ist zwar auf allen gleich, aber in C kommt es nicht vor. Um es trotzdem aus C nutzen zu können, hat da jeder Compiler seine Sonderlocken gestrikt. Die erledigen zwar alle das Gleiche, aber mit unterschiedlichen Formulierungen. So kann ich also keine fehlerfreien Beispiele für einen Arduino liefern, da ich sie nicht testen kann. Das betrifft aber eigentlich nur zwei-drei Zeilen am Anfang des Handlers. Im übrigen kann ich aber meinen Beitrag zum Einsatz von Interrupten liefern. Es ist am Ende nicht wirklich kompliziert.
MfG Klebwax
Lesezeichen