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);
// 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.
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.
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));
}
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.