Arduino Mega 2560 Ansteuerung Schrittmotor

Hallo,

ich arbeite momentan an einem Projekt und hatte zuvor nur Grundkenntnisse in C gehabt. Es geht um folgendes:

Mit Hilfe des Arduino Mega 2560 soll ein Schrittmotortreiber ST-5045 so angesteuert werden, dass der Schrittmotor bspw. in die gewünschte Position fährt. Um dies auszutesten, wollte ich zu erst einen Winkel von 45 Grad anfahren, was man ja visuell sich anschauen kann. Allerdings habe ich große Schwierigkeiten, eine Schleife mit Abbruchbedingung einzubauen.
Da es sich um einen Mikrostepper handelt bedeutet das, dass 64 Mikroschritte = 1 normalen Schritt entsprechen. Auch dies ist im Programm fehlerfrei vorhanden, durch vorriges testen in C.

Das Programm, so wie es jetzt ist, läuft nur einen Schritt (durch zu hören am Motor). setzt man jedoch
x<160000, läuft der Motor, aber er hält nicht an. Je kleiner der angegebene Wert, desto ruckartiger läuft es, obowhl ich die An und Auschalt ja festgelegt habe.

Wo mache ich den Fehler?

float x=0;               // Schleifenzähler für Abbruchbeddingung nach Erreichen der Schritte
float Ergebnis;         // benötigte Microschritte für 45 Grad, 1600
float y;


float EingabeGrad(float MS, float GR, float GProS)     // MS=64 Mikroschritte, GR = anzufahrender Winkel,hier 45 Grad, GProS ist Grad pro Schritt
{

 MS = MS / GProS;          // MS = 64, teile druch Einzelschritt 1.8 Grad
 MS = MS*GR;               // MS = 35,56 Schritte pro Grad mal eingegebener Grad
 return MS;
}

void setup() {
  // put your setup code here, to run once:

pinMode(7,OUTPUT);          // anzusprecheder PIN für digitales Signal, Achtung kein PWM Signal!
 
 float G=45;                // 45 Grad
 float proSchr=1.8;         // 1,8 Schritte pro Grad
 float mS=64;               // 64 Microschritte für einen normalen Schritt

 Ergebnis = EingabeGrad(mS,G,proSchr);  // Berechnung hier abspeichern, 1600 Schritte!
 }

void loop() {
  // put your main code here, to run repeatedly:

if(x<Ergebnis)
  {
    
    digitalWrite(7,HIGH);
    delayMicroseconds(100); 
    digitalWrite(7,LOW);
    delayMicroseconds(10);
    
    x++;}                     // Microstepper ST-M5045 arbeitet negiert, deshalb hochzählen, statt herunter
    return 0;                 // Abbruchbedinung 
  
}

Hallo,

der gepostete Code kompiliert so nicht. Ist der unvollständig?
Wenn ich den korrigiere, das return 0 rausnehme und die fehlende Klammer ergänze zählt er x bis 1600.0 und hört auf.
Vielleicht sind die Zeiten zu kurz und der Motor kann dem mechanisch nicht folgen.
Nimm erstmal delay statt microdelay.
Stepperboard ist richtig angeschlossen?

Hallo Doc_Arduino

Ich kann auch interessenhalber das Programm nur auf die Funktionalität testen, quasi ohne die Unterfunktion, die oben eingebaut ist.

In Visual Studio kann man beim Komilieren eines Programms sich das Geschehen anschauen, quasi durch Speicherbelegung und Anzeige. Ist das beim Arduino auch möglich? Eine Anzeige bspw. wie sich ein Schleifenzähler erhöt ist sicherlich auch vorhanden, oder nicht? Das wäre evtl. sehr hilfreich!

besten Dank für deine Nachricht!
:slight_smile:

Hallo,

mir ist meistens die Einfachheit der Arduino IDE lieber. Umfangreiche Debugmöglichkeiten gibt es natürlich nicht wie in Atmel Studio. Debuggen für Arme geht dann nur über den seriellen Monitor. Ich hatte mir nur zusätzlich die Werte von x und Ergebnis ausgeben lassen innerhalb der if ( x < Bedingung.

Du kannst natürlich auch einen eigenen seriellen Monitor bauen und zyklisch ausgeben lassen. So mach ich das jedenfalls bei umfangreicheren Ausgaben. Es kommt dann immer darauf an ob zyklisch ausreichend ist oder doch sofort.

zum Bsp. sowas. Man muss nur in der loop, egal wo, die Funktion “serieller_Monitor()” aufrufen. Darin legste die Variablen fest von denen du die Werte sehen möchtest. Die “Überschriftsfunktion” wird aller paar Zeilen nur eingefügt damit man den Überblick nicht verliert. Kann man auch weglassen. Mit dem kann man sich alle globalen Werte anzeigen lassen.

void serieller_Monitor ()
{
  static unsigned int intervall = 100;            // Ausgabe, Aktualisierung aller 100ms
  static unsigned long last_millis = 0;

  if (millis() - last_millis < intervall) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  last_millis+=intervall; 
  Ueberschriftszeile();
  Serial.print(Ergebnis); Serial.print('\t');
  Serial.print(x); Serial.print('\t');
   
  Serial.println();
}


void Ueberschriftszeile ()
{
  static int counter = 33;

  counter++;
  
  if (counter < 25) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  counter = 0; 
  Serial.print(F("Erg")); Serial.print('\t');
  Serial.print(F("x")); Serial.print('\t');
  
  Serial.println();
}