usw., wenn Position == 0 dann mache nichts, verstehe ich das richtig, oder soll da noch was passieren? Sonst lass die gleich weg und frag nur > 0 ab.
Ist das nicht nur halb durchdacht?
Wenn ich die Situation == 0 nicht abfrage und bei TRUE nicht aus der Abfrage aussteige, so wird dann auch aus == 0 zur nächsten Position gefahren, was ja eigentlich unnötig ist.
Zuerst mal ist ein == bei solchen Sachen sehr gefährlich da da immer eine gewisse Ungenauigkeit drin ist wegen dem ungeraden Verhältnis zu Schritten und Winkelauflösung bzw der geringeren Schrittauflösung gegenüber der Positionsauflösung. Du mußt eine gewisse "Unschärfe" zulassen.
Warum ist das == sehr gefährlich?
In dem extrem unwahrscheinlichen Fall, dass der Sollwert und der Istwert genau == sind, soll nix passieren. Das ist doch nicht falsch oder gefährlich?! Und genauso funktioniert es.
Bei allen anderen Werten wird die Differenz zur nächsten möglichen Position berechnet und dann dort hingefahren. Und genauso funktioniert es.
Ich hatte noch zwei kleine Rechenfehler drin, aber nun geht's mit der etwas umständlichen if..then..else Verschachtelung.
Hier der funktionierende Sketch, der noch mit einer Menge Debug Ausgaben versehen ist, aber das macht es leichter zu verstehen:
#define Microstepping 4 // Stepperdriver is set to 1/n microsteps (here 1/4)
#define StepperStepsPerRevolution 200 //one revolution of the stepper is 200 steps
int StepsPerRevolution = (StepperStepsPerRevolution * Microstepping); // results in 800 steps per one revolution of the stepper
#include <AccelStepper.h>
#include <AS5600.h>
int n;
int Pos[4] = {115, 1110, 2172, 3236}; // Der Winkelsensor hat Werte für 0-360° Sensorradposition von 0-4095. Diese vier Werte in dem Array markieren im Wertebereich 0-4095 die Positionen der vier Mulden im Sensorrad
//int Pos[4] = {0, 1024, 2048, 3072}; // Testdaten Absolutpositionen
int RelativeStep[4];
#define STEPpin 14
#define DIRpin 12
unsigned long previousMillis = 0;
unsigned long stepperMillis = 0;
const long interval = 10;
AS5600 encoder;
int output;
AccelStepper stepper(AccelStepper::DRIVER, STEPpin, DIRpin);
void setup()
{
Wire.setClock(400000L); //setzt die I²C Taktfrequenz auf 400kHz
Serial.begin(9600);
stepper.setMaxSpeed(500); // 10000 ist wunderbar
stepper.setAcceleration(100000); // 100000 ist schön schnell, 200 ist schön langsam
RelativeStep[0] = (map(Pos[1], 0, 4095, 0, StepsPerRevolution)) - (map(Pos[0], 0, 4095, 0, StepsPerRevolution));
RelativeStep[1] = (map(Pos[2], 0, 4095, 0, StepsPerRevolution)) - (map(Pos[1], 0, 4095, 0, StepsPerRevolution));
RelativeStep[2] = (map(Pos[3], 0, 4095, 0, StepsPerRevolution)) - (map(Pos[2], 0, 4095, 0, StepsPerRevolution));
RelativeStep[3] = StepsPerRevolution - (map(Pos[3], 0, 4095, 0, StepsPerRevolution));
delay(100);
Serial.println("");
Serial.println("Start");
Serial.print("Ist-Position: ");
Serial.println(encoder.getPosition());
if (Pos[0] - encoder.getPosition() == 0) {
Serial.println("Steht bereits auf Startposition");
}
else if (Pos[0] - encoder.getPosition() > 0) {
Serial.print("Pos0 ist am naechsten: ");
Serial.println(Pos[0]);
Serial.print("fahre weiter steps: ");
Serial.println(Pos[0] - encoder.getPosition());
stepper.runToNewPosition(map(Pos[0] - encoder.getPosition(), 0, 4095, 0, StepsPerRevolution));
}
else if (Pos[1] - encoder.getPosition() == 0) {
Serial.println("Steht bereits auf Startposition");
}
else if (Pos[1] - encoder.getPosition() > 0) {
Serial.print("Pos1 ist am naechsten: ");
Serial.println(Pos[1]);
Serial.print("fahre weiter steps: ");
Serial.println(Pos[1] - encoder.getPosition());
stepper.runToNewPosition(map(Pos[1] - encoder.getPosition(), 0, 4095, 0, StepsPerRevolution));
}
else if (Pos[2] - encoder.getPosition() == 0) {
Serial.println("Steht bereits auf Startposition");
}
else if (Pos[2] - encoder.getPosition() > 0) {
Serial.print("Pos2 ist am naechsten: ");
Serial.println(Pos[2]);
Serial.print("fahre weiter steps: ");
Serial.println(Pos[2] - encoder.getPosition());
stepper.runToNewPosition(map(Pos[2] - encoder.getPosition(), 0, 4095, 0, StepsPerRevolution));
}
else if (Pos[3] - encoder.getPosition() == 0) {
Serial.println("Steht bereits auf Startposition");
}
else if (Pos[3] - encoder.getPosition() > 0) {
Serial.print("Pos3 ist am naechsten: ");
Serial.println(Pos[3]);
Serial.print("fahre weiter steps: ");
Serial.println(Pos[3] - encoder.getPosition());
stepper.runToNewPosition(map(Pos[3] - encoder.getPosition(), 0, 4095, 0, StepsPerRevolution));
}
else {
Serial.print("Pos0 ist am naechsten: ");
Serial.println(Pos[0]);
Serial.print("fahre weiter steps: ");
Serial.println(4095 - encoder.getPosition() + Pos[0]);
stepper.runToNewPosition(map(4095 - encoder.getPosition() + Pos[0], 0, 4095, 0, StepsPerRevolution));
}
Serial.print("Ist-Position: ");
Serial.println(encoder.getPosition());
}
void loop() {
}