Hallo,
@serenifly: habe ich gändert, STEP_DELAY_SHOW ->StepDelayShow = 250;
Mit dem folgenden Code fährt die X-Achse hin und her. Ich höre auch ein ein Klopfen vom Halbsekundenwechsel an der Z-Achse. Sie dreht sich aber pro Halbsekundenwechsel nur um 1 bis zwei Schritte.
@michael_x: Ich möchte erreichen, dass der X-Motor einen vorgegebenen Weg abfährt, parallel dazu der IR-Sensor in einem bestimmten Intervall (Halbsekundenwechsel) die Distanz zu einem Objekt misst und der Z-Motor auf den Wert reagieren kann. Die Reaktion des Z-Motors soll aber den X-Motor möglichst nicht beeinflussen. Geht das überhaupt?
Welchen Wert muß ich denn ändern, dass "DoOtherStuff" so klein ist, das die Funktion in jedem Step ausgeführt werden kann?
#include <Arduino.h>
// Achsen Belegung der Ausgänge
int X_STEP_PIN = 54;
int X_DIR_PIN = 55;
int X_ENABLE_PIN= 38; //Active LOW
int Z_STEP_PIN = 46;
int Z_DIR_PIN = 48;
int Z_ENABLE_PIN= 62; //Active LOW
unsigned long t = 0;
unsigned long StepDelayShow = 250;
unsigned long move_x =1000;
unsigned long move_z =1000;
unsigned long interval;
//sensor
int sensorPin = A12;
int Distance;
int sollAbstand = 94; //Abstand des Sensors zum Objekt; Kameraabstand dann 90mmm zum Objekt
void setup()//#################
{
Serial.begin (9600);
pinMode(X_STEP_PIN, OUTPUT);
pinMode(X_DIR_PIN, OUTPUT);
pinMode(X_ENABLE_PIN,OUTPUT);
pinMode(Z_STEP_PIN, OUTPUT);
pinMode(Z_DIR_PIN, OUTPUT);
pinMode(Z_ENABLE_PIN,OUTPUT);
}
void X_Achse_positv(long stepDelay)//#################
{
digitalWrite(X_ENABLE_PIN, LOW);
digitalWrite(X_DIR_PIN, HIGH);
digitalWrite(X_STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(X_STEP_PIN, LOW);
unsigned long dt = micros() - t;
if(dt < StepDelayShow)
{
delayMicroseconds(StepDelayShow - dt);
}
t = micros();
}
void X_Achse_negativ(long stepDelay)//#################
{
digitalWrite(X_ENABLE_PIN, LOW);
digitalWrite(X_DIR_PIN, LOW);
digitalWrite(X_STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(X_STEP_PIN, LOW);
unsigned long dt = micros() - t;
if(dt < StepDelayShow)
{
delayMicroseconds(StepDelayShow - dt);
}
t = micros();
}
void Z_Achse_positiv (long stepDelay)//#################
{
digitalWrite(Z_ENABLE_PIN, LOW);
digitalWrite(Z_DIR_PIN, HIGH);
digitalWrite(Z_STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(Z_STEP_PIN, LOW);
unsigned long dt = micros() - t;
if(dt < StepDelayShow)
{
delayMicroseconds(StepDelayShow - dt);
}
t = micros();
}
void Z_Achse_negativ (long stepDelay)//#################
{
digitalWrite(Z_ENABLE_PIN, LOW);
digitalWrite(Z_DIR_PIN, LOW);
digitalWrite(Z_STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(Z_STEP_PIN, LOW);
unsigned long dt = micros() - t;
if(dt < StepDelayShow)
{
delayMicroseconds(StepDelayShow - dt);
}
t = micros();
}
boolean HalbsekundenWechsel()//beeinflusst den Abruf von Daten im Seriellen Monitor
{
static unsigned long oldMillis;
if (millis()-oldMillis >= 500)
{
oldMillis += 500;
return true;
}
return false;
}
void loop()//###################
{
if (HalbsekundenWechsel())
{
Distance = analogRead(sensorPin);
Serial.print("Messwert: "); Serial.print(Distance); Serial.print(" ");
int DistanceConverted = (207600 / (Distance-11))/10;
DistanceConverted = constrain(DistanceConverted, 50, 130);
Serial.print("abs. Abstand: "); Serial.print(DistanceConverted); Serial.print("mm ");
Serial.print("rel. Abstand: "); Serial.print(DistanceConverted - sollAbstand); Serial.println(" mm");
if (DistanceConverted == 130)//umgerechneter Messwert ist gleich 130
{ Z_Achse_negativ(0);
interval = move_z;}
else if (DistanceConverted == 50)//umgerechneter Messwert ist gleich 50
{Z_Achse_negativ(0);
interval = move_z;}
else if (DistanceConverted == 90)
{Z_Achse_negativ(0);
interval = move_z;}
else if (DistanceConverted > 91) //umgerechneter Messwert ist größer als 90
{Z_Achse_positiv(100);
interval = move_z;}
else if (DistanceConverted < 91) //umgerechneter Messwert ist kleiner als 90
{Z_Achse_negativ(100);
interval = move_z;}
}
static unsigned long lastMillis = 0;
unsigned long currentMillis = millis();
static byte step = 1;
if(currentMillis - lastMillis >= interval)
{
lastMillis = currentMillis;
if (++step == 3) step =1;
}
switch (step)
{
case 1:
X_Achse_positv(500);
interval = move_x;
break;
case 2:
X_Achse_negativ(500);
interval = move_x;
break;
}
}