AccelStepper nicht das wahre ?

Hallo liebe Freunde des Arduino´s

Ich habe bis jetzt meine Schrittmotoren immer mit tone; gefahren was auch ganz gut funktioniert hat ( außer das Problem das ich kein GND auf den tone Ausgang bekommen habe um den Motor zum stehen und halten zu bekommen).
Aber da ich für mein Projekt zwei Motoren gleichzeitig fahren will brauch jetzt ein ein neuen Sketch. ( tone; kann gleichzeitig nur auf einem Pin rausgegeben werden ).
Auf der suchen nach einer praktischen library bin ich auf AccelStepper gestoßen.
Schien mir eigentlich als eine umfangreiche library und durch die Dokumentation auch erlernbare Möglichkeit meine Motoren zu fahren.
Jetzt bin ich aber auf ein paar Haare in der Suppe gestoßen und würde geren wissen ob Fehler von mir dem zu Grunde liegen oder nicht:

Ein paar Daten:
Schrittmotor: Nema 17, 59Ncm , 1,8°Schritte (2x)
Schrittmotortreiber: TB6560 3A Controller (2x)
Arduino board : Nano V3.0
Zielgeschwindigkeit: 2-3U./Sek = 3x200Schrittex16Mikroschritte= 9,6 kHz am Arduino Ausgang

Probleme/Haare:

  • Mit AccelStepper im folgenden Sketch bekomme ich nur ca. 4,5 kHz auf den Ausgang ( durch manuelle Eingabe der Geschwindigkeit bekomme ich noch ein bisschen mehr )
    -Wenn ich ein serial monitor programmiere gibt der Arduino nur noch misst an den Treiber weiter.
    -Wenn ich mir den Ausgang mit dem Oszi ansehen dann sieht es so aus als ob AccelStepper nur wenig verschiedene Geschwindigkeiten kennt und bei Mittelwerten einfach immer zwischen zwei bist drei punkten hin und her schwankt. ( Mein podi habe ich per hard und software geglättet). Das sieht auf dem Oszi nicht nur komisch aus das hört sich auch komisch beim Motor an.
    -All diese Problem habe ich bei tone; auf dem gleichen Pin nicht gehabt.
#include <AccelStepper.h>

AccelStepper stepper(1,2,3); 

#define ANALOG_IN A0 // kann auch durch int ... ersetzt werden (noch keine veränderung fesgestellt)
void setup()
{  
  stepper.setMaxSpeed(10000);
}
void loop()
{
  int analog_in = analogRead(ANALOG_IN)*10;
 
  stepper.setSpeed(analog_in);
 stepper.runSpeed();;
}

Frage:
-Mache ich da ein Fehler oder ist der AccelStepper doch nicht so ausgereift wie es den Anschein macht. ( Konnte das Programm auch nicht direkt von der Arduinoseite bekommen was auch seine Gründe haben kann )
-Gibt es eine bessere library um 2 Frequenzen im 5-10kHz zu steuern außer mit einem „delay without delay“ Sketch der mir noch als Notlösung vorschwebt( noch nicht getestet ).

AccelStepper stepper(1,2,3); Drei Anschlüsse kenne ich nicht. Pin1 wird beim UNO auch für USB verwendet. stepper() verwendet 2,3,4,5 als Standard.

AccelStepper stepper(1,2,3);
// Unser Schrittmotor wird "stepper" genannt.
//Die erste Zahl steht für die Ansteuerung des Motors über einen Treiber mit takt-regelung
//Die zweite Zahl ist die Pin Nummer für den "Schritt-Takt"
// und die dritte Zahl die Pin Nummer für die Drehrichtung.

Ein Easydriver oder DRV8825 also: stepper(DRIVER,2,3), wobei DRIVER=1 ist. Dann scheidet das aus :smiley:

agmue:
Ein Easydriver oder DRV8825 also: stepper(DRIVER,2,3), wobei DRIVER=1 ist. Dann scheidet das aus :smiley:

Was willst du damit sagen ?
Und kennst du ein ähnliches Problem ?
Würdes du mir raten AccelStepper weiter zu nutzen oder kennst du was besseres ?

Dogger330:
Was willst du damit sagen ?

Ich bin gedanklich in die falsche Richtung gelaufen, mein Beitrag kann leider nicht zur Klärung beitragen :-[

Ich kenne zwei Arten der Ansteuerung eines Schrittmotors:

  • L298: Da macht der Arduiono die Ansteuerung, dahinter kommt eine Verstärkung mittels zweier H-Brücken.
  • Easydriver oder DRV8825: Der Arduino gibt Richtung und Takt vor, die Ansteuerung, Strombegrenzung und Schrittart (Voll-, Halbschritt usw.) macht der Treiber.

Da Du keinen Doku-Link zu TB6560 angeboten hast, habe ich im Internet gesucht und bin auf die falsche Fährte gelangt. “much ado about nothing”

Nun könnte ich meinen Logic-Analyser an meinen UNO hängen, würde dann aber auch nur sehen, was Du siehst. Damit ist Dir dann auch nicht geholfen, da ich das “warum” dann auch nicht erklären könnte.

Mein Tipp: Mache es ohne Bibliothek, das schärft den Blick. Experimentiere möglicherweise mit Schnelle Digital Eingabe/Ausgabe.

Meine vage Spekulation: analogRead braucht unterschiedlich lange zur Konvertierung.

Da ist der Treiber:
http://www.stepmotordriver.com/TB6560-single-Axi-Stepper-Motor-Driver-DC7-32V-3A-CNC-stepper-motor-controller-16.html

Also werde ich es erst mal mit „delay without delay“ versuchen und mich dann wenn nötig in den von dir genanten Beitrag wenden.

Hatte gehofft das bei Arduino eine einfache Funktion gibt eine regelbare Frequenz zu erzeugen.

Jetzt habe ich versucht ein Programm von der Pike auf zu schreiben!
Leider ist da irgendwo „Sand“ im Programm !
Ich hab immer keine Aussetzer b.z.w. frequenzabhängige Störungen.
Ich kann jetzt leider kein Bild zeigen und versuch deswegen das Bild auf
dem Oszi. Zu erklären:
Zwischen den deutlich zu erkennen Flanken blitzen in unregelmäßigen
Abständen ( unter einer Sekunde ) immer wieder keine Schatten der
Flanken auf.
Diese Schatten haben eine nur fast ähnliche Frequenz wie ich vorgebe, so
daß sich die Schatten mit den richtigen Flanken bei bestimmten
Frequenzen überschneiden und nicht mehr relevant sind.
Diese Überschneiden passiert z.b.bei ca. 6kHz, 10kHz, 19kHz.
Habe es mit Timer 0 und Timer 1 probiert
Auch schon mit verschiedenen Prescaler
Fehler treten auch ohne Last am Pin auf
Arduino wird vom USB versorgt !

//long i = 1;

void setup() {
  cli(); // disable interrupts
  
  // reset
  TCCR0A = 0; // set TCCR1A register to 0
  TCCR0B = 0; // set TCCR1B register to 0
  TCNT0  = 0; // reset counter value
  
 // OCR0A = 20; // compare match register

  // set prescaler
  TCCR0B |= (1 << CS11)| (1 << CS10);    
  
  TCCR0A |= (1 << WGM01); // turn on CTC mode
  TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt
  
  sei(); // allow interrupts
  
  
//  Serial.begin(9600); // start serial connection
    pinMode(2, OUTPUT);
}

ISR(TIMER0_COMPA_vect) { // function which will be called when an interrupt occurs at timer 1
 digitalWrite(2, HIGH);
 //delayMicroseconds(5);
  digitalWrite(2, LOW);
 //   Serial.println(i); // send current value of i to the pc
}

void loop() {
//  i++; // increment i
   OCR0A =  analogRead(A0)/8 ;
// Serial.println(analogRead(A0)); 
}

Das Problem liegt vielleicht hier:

OCR0A =  analogRead(A0)/8 ;

Warnung im Datenblatt:

However, changing TOP to a value close to BOTTOM when the counter is running
with none or a low prescaler value must be done with care since the CTC mode does not
have the double buffering feature. If the new value written to OCR0A is lower than the current
value of TCNT0, the counter will miss the compare match.

.. AccelStepper kann nur maximal 4000 steps/sec ausgeben; steht irgendwo in der Beschreibung.
Ich benutze die accel stepper library selbst in einem sketch und bin sehr zufrieden, da die library - wie es der Name schon sagt - eine Beschleunigung / Entschleunigung eingebaut hat; daher wahrscheinlich auch das limit mit den 4000 steps/sec, weil der code durch das Verarbeiten der "acceleration" mehr Zeit braucht.

Musst du unbedingt 16 microsteps nutzen oder reichen nicht weniger microsteps aus - das würde deine "effektive", d.h. in Bewegung umsetzbare puls rate erhöhen?

1/8 oder 1/4 microsteps reichen nach meiner Erfahrung immer aus, wobei es immer auf den Stepper selbst und die Motorspannung ankommt, um z.B. das Zwitschern und Zirpen im Zaum zu halten. Da kann man mit der Stromeinstellung einiges bewirken (aber: max. zulässigen Strom des Motors/Treibers im Auge behalten). Positiver Nebeneffekt: je weniger microsteps, desto stärker das Drehmoment des Steppers.