Schrittmotor Problem

Hallo zusammen,
ich habe einen NEMA23HS4830 und einen TB6600 Treiber dazu, angesteuert über einen Nano(Klon).
Der Motor wird über einen Taster gesteuert, solange gedrückt läuft er (Abfrage über while). Das funktioniert auch gut. Ich möchte nun die Umdrehungen zählen. Sobald ich aber einen Zähler in den Code einbaue, oder mit serial.println etwas ausgeben will bricht die Drehzahl ein. Was kann ich tun, oder ist der Arduino einfach zu schwach. Danke für jede Hilfe!

motor2test.ino (1.89 KB)

Hi

Sagen wir so: Man KANN Das mit einem Arduino hin bekommen. Man kann aber auch 'Der ist zu schwach' sagen und irgendwas mit mehreren hundert MHz nehmen. - das Ding lässt sich dann nicht mehr so einfach programmieren - auch das Ding bekommt man in die Knie, wenn man's drauf anlegt (oder zu bewuem, unwissend passt hier auch, ist, Das richtig zu machen)

In Deinem Sketch gibst Du Texte mit 9600Baud aus - Das sind 1000 Zeichen pro Sekunde. Wenn Du jedes Mal nur println() ausgibst, werden NUR ein (bei Win wohl 2) Zeichen gesendet - und Dein Sketch kann maximal noch mit 1kHz (500Hz) laufen. Wenn Du 1000 Zeichen ausgibst, kommt der Sketch auf eine loop()-Durchlaufzeit von unter einer Sekunde.

Überlege Dir, wann der Motor was machen soll, wie viel Zeit Du dazwischen hast und ob Du überhaupt in der Zeit noch was ausgeben KANNST. Du kannst das Terminal um Welten schneller ansprechen - trotzdem solltest Du Dir klar machen, wo Schluss ist, weil Du einfach keine Zeit über hast.

Auch solltest Du Dir was für die delay() überlegen - auf Wartezeiten weit unter 1ms würde ich mich vorerst nicht versteifen - Da muß ALLES zusammen passen.

MfG

Hallo, danke erstmal. Auf die Ausgabe könnte ich auch verzichten, aber ich brauche die Umdrehungen als Wert. Selbst der simple Zähler lässt aber die Drehzahl einbrechen, je länger der Motor läuft umso langsamer wird er. Auch schon bei 5-10 Umdrehungen. Schade wenn´s da keine Lösung gibt. Gruss

Wie wäre es wenn Du uns den neuen Sketch zeigst? Grüße Uwe

mit 800 schritten statt 1600 klappt´s schon besser, allerdings ist der sketch noch nicht fertig. Eine Ausgabe von u brauche ich doch, allerdings nicht mit serial.print sondern auf ein LCD (16-2), das sollte nicht so viel Ressourcen benötigen. u wird dann später noch benötigt. Gruß

motor2test.ino (1.88 KB)

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Test:

//Schrittmotor
int i = 0;
int u = 0;
int schritte = 800;
int zeit = 250;

int PUL1 = 2; //define PUL1se pin
int DIR1 = 3; //define DIR1ection pin
int ENA1 = 4; //define ENA1ble Pin

int button1 = 5;                             // Variable für Pin 
int button1Status;
int button2 = 6;                             // Variable für Pin 
int button2Status;
int button3 = 7;                             // Variable für Pin 
int button3Status;
int button4 = 8;                             // Variable für Pin 
int button4Status;


void setup() 
{
  //Schrittmotor
  pinMode (PUL1, OUTPUT);
  pinMode (DIR1, OUTPUT);
  pinMode (ENA1, OUTPUT);
  digitalWrite(ENA1, HIGH);                   //Motor ist noch abgeschaltet
  
  //Buttons
  pinMode(button1, INPUT);                   // definiere Pin  als Eingang
  digitalWrite(button1, HIGH);               // aktiviert den Pull- Up- Widerstand
  pinMode(button2, INPUT);                   // definiere Pin  als Eingang
  digitalWrite(button2, HIGH);               // aktiviert den Pull- Up- Widerstand
  pinMode(button3, INPUT);                   // definiere Pin  als Eingang
  digitalWrite(button3, HIGH);               // aktiviert den Pull- Up- Widerstand
  pinMode(button4, INPUT);                   // definiere Pin  als Eingang
  digitalWrite(button4, HIGH);               // aktiviert den Pull- Up- Widerstand

Serial.begin (9600);
}

void loop()

{
  
     
  button1Status = digitalRead(button1);
  while (button1Status==0)

  
 {
        digitalWrite(ENA1, LOW); //Motor einschalten
        digitalWrite(DIR1, HIGH); //Drehrichtung
        digitalWrite(PUL1, HIGH);
        delayMicroseconds(zeit);
        digitalWrite(PUL1, LOW);
        delayMicroseconds(zeit);
        i=i+1;
        button1Status = digitalRead(button1);
        
        
        
  }
  digitalWrite(ENA1, HIGH);
  u=i/schritte;
  Serial.println (u);
  
  
 /* button2Status = digitalRead(button2);
  while (button2Status==0)

  
 {
        if (u!=0)
        
        {digitalWrite(ENA1, LOW); //Motor einschalten
        digitalWrite(DIR1, HIGH); //Drehrichtung
        digitalWrite(PUL1, HIGH);
        delayMicroseconds(zeit);
        digitalWrite(PUL1, LOW);
        delayMicroseconds(zeit);
        u=u-1;
        
        
        
        
        
  }*/
  digitalWrite(ENA1, HIGH);
  
  
  
  
  
  
 }

Hi

Musst Du in jedem Durchlauf Deiner while-Schleife den Enable-Pin zuschalten? Oder die Richtung schalten? Bedenke: Das kostet Alles Zeit, Die Du hier einfachst sparen kannst - in diesem Beispiel kannst Du beide Signale VOR der Schleife setzen und hast dann Innerhalb diese Zeit gespart.

MfG

Selbst der simple Zähler lässt aber die Drehzahl einbrechen, je länger der Motor läuft umso langsamer wird er. Auch schon bei 5-10 Umdrehungen.

void loop()
{     
  button1Status = digitalRead(button1);
  while (button1Status==0) 
 {
        digitalWrite(ENA1, LOW); //Motor einschalten
        digitalWrite(DIR1, HIGH); //Drehrichtung
        digitalWrite(PUL1, HIGH);
        delayMicroseconds(zeit);
        digitalWrite(PUL1, LOW);
        delayMicroseconds(zeit);
        i=i+1;
        button1Status = digitalRead(button1);       
  }
  digitalWrite(ENA1, HIGH);
  u=i/schritte;
  Serial.println (u);
  digitalWrite(ENA1, HIGH);
 }

Da ist nichts wieso die Schleife mit der Zeit langsamer werden sollte. Grüße Uwe