Performace-Optimierung bei vielen Tasks

Hallo Zusammen,

ich habe eine Schrittmotorsteuerung aufgebaut und möchte diese nun optimieren bzw. die Reaktionszeit verbessern. Zurzeit benutze ich nur einen Arduino Uno. Dieser muss folgende Aufgaben gleichzeitig bewältigen:
-Inkremental Drehgeber auslesen für eine verlustfreie Schrittzählung wird dieser durch Interrupt ausgelesen)
-Potentiometer auslesen
-Schrittmotor durch die AccelStepper-Lib ansteuern
-LCD-Display ausgeben
-diverse Daten verarbeiten, Filterfunktionen etc.

Dabei soll die Motorsteuerung oberste Priorität bekommen, dh. das auslesen des Poti und das zeitgleiche steuern des Schrittmotors. Das Problem welches ich jetzt festgestellt habe ist, dass solange der Schrittmotor gesteuert wird (runToNewPosition()) anscheinend das Auslesen des Poti blockiert bzw. verlangsamt wird. Warscheinlich arbeitet die AccelStepper-lib hier auch mit einer Interrupt-Funktion. Erst wenn der Schrittmotor seine Endposition erreicht hat, kommen die veralteten Positionsdaten des Poti durch. Die Folge ist, dass der Schrittmotor dann erst die veralteten Positionen anfährt und es zu Verzögerungen kommt.

Für die gesamte Steuerung strebe ich eine gute Dynamik und schnellste Motordrehzahlen an. Mein erster Gedanke war, einen zweiten Arduino einzusetzen. Einer kümmert sich um das Aufnehmen der Messwerte aus Poti und Drehgeber, der andere steuert den Schrittmotor. Jedoch ist mir gerade aufgefallen, dass der Arduino mit der Schrittmotorsteuerung ja vollständig blockiert, also eine Datenannahme via I2C vom anderen Arduino auch blockiert sein müsste.

Eventuell hat ja jemand bereits Erfahrungen gemacht oder hat spontan eine gute Idee.

ItsUnreal:
Eventuell hat ja jemand bereits Erfahrungen gemacht oder hat spontan eine gute Idee.

Auf jeden Fall wäre es gut, wenn Du Deinen Sketch zeigen würdest, denn so kann man eigentlich nur raten und spekulieren.

Wenn er nicht allzu hässlich ist, wird der bestimmt auch gelesen :slight_smile:

Gruß

Gregor

Hi

  • keine Interrupts, Du kannst eh erst in der loop() darauf reagieren - dann kannst Du die Änderungen auch dort erfassen
  • möglichst kurze/schnelle Einzelschritte, Nachtwächter und 'Blink without dealay' in Deiner IDE studieren

MfG

Auf jeden Fall wäre es gut, wenn Du Deinen Sketch zeigen würdest, denn so kann man eigentlich nur raten und spekulieren.

Wenn er nicht allzu hässlich ist, wird der bestimmt auch gelesen :slight_smile:

Auf jeden Fall wäre es besser, wenn du erst Combie's Tip beherzigt, und --falls dann immer noch Blockaden zu sehen sind-- du eine Demoversion des Problems baust, statt von Prioritäten zu philosophieren.
Verwende run() statt runToNewPosition() und alles ist gut :wink:

michael_x:
Auf jeden Fall wäre es besser, ...

Ich bin irritiert. Du zitierst mich, meinst mit Deiner Antwort aber ItsUnreal ... stimmt das so?

Gruß

Gregor

Ich habe mich schon auf deinen Wunsch nach nicht funktionierenden Sketchen bezogen, habe aber eine andere Meinung dazu und in erster Linie ItsUnreal angesprochen.
Das ist so richtig. Verwirren wollte ich dich nicht, sorry. :wink: