Dynamische Schrittmotorsteuerung

Hallo zusammen,

erstmal schon vielen Dank an die ganzen Beiträge im Forum, die mir schon viel weitergeholfen haben.

Zu meinem konkreten Problem habe ich leider bisher nichts gefunden.

Es geht um die Steuerung eines Schrittmotors.

Ich möchte die Geschwindigkeit und die Schrittzahl dynamisch steuern, heißt in die aktuelle Fahrt durch Werte, die von einem I2C Sensor gemessen werden, eingreifen. Im ersten Schritt soll nur die Fahrt unterbrochen werden, sobald dieser Sensor einen gewissen Wert überschreitet, welcher permanent gemessen werden soll, am besten nach jedem Schritt.

Durch diese Messung wird allerdings der Sketch demaßen langsam, dass sich der Motor nur noch extem langsam bewegt.

Gibt es eine library oder am besten ein Beispiel eines Workarounds? Also beispielsweise die Möglichkeit die Ansteuerung des Motors vom übrigen Sketch zu entkoppeln?

Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken. In meinem Beispielsketch soll einfach nur die Verlangsamung duch das Auslesens des Sonsors verdeutlicht werden.

#include <Wire.h>
#include <Adafruit_BMP085.h>

/*************************************************** 
  This is an example for the BMP085 Barometric Pressure & Temp Sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> https://www.adafruit.com/products/391

  These displays use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;
  
void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  if (!bmp.begin()) {
 Serial.println("Could not find a valid BMP085 sensor, check wiring!");
 while (1) {}
  }
}
  
void loop() {

    digitalWrite( 2 , HIGH );
    delay(1);
    digitalWrite( 2 , LOW );
    delay(1);

int a=bmp.readPressure();
}

Setze Deinen Sketch bitte in Code-Tags, nicht in Quote-Tags.

Gruß Tommy

aron91:
Also beispielsweise die Möglichkeit die Ansteuerung des Motors vom übrigen Sketch zu entkoppeln?

Versuche mal die MobaTools, die funktionieren mit Interrupts.

aron91:
Im ersten Schritt soll nur die Fahrt unterbrochen werden, sobald dieser Sensor einen gewissen Wert überschreitet, welcher permanent gemessen werden soll, am besten nach jedem Schritt.

Wenn nach jedem Schritt gemessen werden soll, kann die Schrittfrequenz prinzipbedingt nicht größer sein, als es der Messdauer entspricht. Entkoppelst Du die Schrittmotoransteuerung von der Messung, kann dieses Prinzip nicht mehr aufrechterhalten werden.

    digitalWrite( 2 , HIGH );
    delay(1);
    digitalWrite( 2 , LOW );
    delay(1);

Das da kannst du "im Hintergrund", also nicht blockierend, mit tone() machen.

In dem Fall: tone(2, 500) -> High-Low-Wechel mit 500 HZ an Pin 2

Und zum Stoppen des Motors: noTone(2)

Aber dann macht der Motor eben ggf. mehrere Steps bis eine neue Messung fertig ist, je nach Frequenz und Dauer einer Messung.

Hallo,

Du willst mit dem Motor fahren , und das verändert den Druck ?

Du könntest bei einer grossen Differenz zum Sollwert z.b 10 oder 20 Schritte fahren und dann neu messen, Wenn die Differenz kleiner wird machst die Schrittanzahl kleiner im Extremfall eben 1 . Dann fährst Du bei grossen Differenzen schneller und bei kleinen langsamer.

Heinz