Mehrere Stepper mit unterschiedl. Geschwindigkeiten gleichzeitig ansteuern?
hallo, ich möchte mind. 3 und mehr schrittmotoren mit maximaler geschwindigkeit über einen arduino uno ansteuern. nun ist mir aber aufgefallen, da ich ja jedem schrittmotor individuell die stepps diktieren muss, dass es praktisch nicht möglich ist dies zu machen da bei jedem individuellen stepps "diktieren" rechenzeit verloren geht.
ich habe 8 nema 17 (3,4v,1.7a) stepper die jeweils über einen a4988 angesteuert werden.
mit folgendem code habe ich die kleinste delay von 34 microsek. ermittelt. weiter runter geht nicht außer mit beschleunigung.
nun habe ich mir eine kleine "lib" geschrieben und jeder stepper lässt sich nun als ein objekt anlegen. jeder stepper hat eine run() methode die folgendes macht:
tja, nun legte ich mir 4 stepper objekte an, setzte die delay auf 34 usec. und rief in der loop() hintereinander jeweils die run() methode der stepper auf. ergebnis ist: um mehr stepper ich hinzufüge um langsamer werden sie (iwie logisch wegen der steigenden anzahl auszuführenden befehlen). 34usec. war die kleinste zeit die damals bei einem stepper ging. allerdings wird diese zeit jetzt niemals bei 4 und mehr steppern eingehalten.
nun meine frage. wie kann man mehrere stepper, die getrennt angesteuert werden können müssen (geschwindigkeit etc) gleichzeitig betreiben? ist das überhaupt ohne geschwindigkeitsverlust möglich bei einem einzigen arduino uno?
p.s.
meine erste idee wäre gewesen, jedem stepper einen arduino nano zu spendieren .. klingt für mich aber kosten anfällig und verrückt xd
die zweite idee wäre, herauszufinden wie die pololu-boars funktionieren. doch nach ersten kurzrecherchen scheinen dort alle a4988 "gestapelt" zu sein und mit einem schlag "angesteppt" zu werden. dadurch könnte ich aber die steppers nicht mit unterschiedlichen geschwindigkeiten gleichzeitig ansteuern ...wenn ich das richtig sehe.
habe gerade noch etwas getestet:
das braucht angeblich 4 usek.! o_o je mehr man danach micros() hinzufügt um länger dauert es^^ scheint als würde micros() 2-4 usek benötigen. das ist dann doch erheblich wenn man bei 120000 steps jedesmal 2-4 usek verliert.
heißt ich muss bei "nextupdate = micros() + stepdelay_usec;" mehr oder weniger schon 2-4usek wieder abziehen...
...ok mit einer korrektur von -2usek delay pro hinzugefügten stepper bleiben sie lautstärkemäßig (nicht u/min gemessen) nun pi*daumen auf der selben geschwindigkeit. das ging mit 4 steppern gut. bei 10 steppern brauchte allerdings schon alleine der aufrufe aller steppers nacheinander lange, dass die delay jedes einzelnen überschritten wurde. bin mal gespannt für lösungsvorschläge hier kommen
ich habe 8 nema 17 (3,4v,1.7a) stepper die jeweils über einen a4988 angesteuert werden.
mit folgendem code habe ich die kleinste delay von 34 microsek. ermittelt. weiter runter geht nicht außer mit beschleunigung.
code: [select]
loop(){
digitalwritefast(steppin, high);
//delaymicroseconds(1); //worked without max speed
digitalwritefast(steppin, low);
delaymicroseconds(34);
}
nun habe ich mir eine kleine "lib" geschrieben und jeder stepper lässt sich nun als ein objekt anlegen. jeder stepper hat eine run() methode die folgendes macht:
code: [select]
void cstepper_a4988::run() {
if (isrunning && stepstogo > 0) { //first compare bool before slow unsigned long
if (micros() >= nextupdate) {
nextupdate = micros() + stepdelay_usec;
digitalwritefast(steppin, high);
//delaymicroseconds(1); //seems not needed
digitalwritefast(steppin, low);
stepstogo--;
}
}
else if (isrunning && stepstogo == 0) {//calc final unsinged long currentpos after stepstogo finish (or in ext. getter methods)
stop(); //calcs currentpos
}
}
tja, nun legte ich mir 4 stepper objekte an, setzte die delay auf 34 usec. und rief in der loop() hintereinander jeweils die run() methode der stepper auf. ergebnis ist: um mehr stepper ich hinzufüge um langsamer werden sie (iwie logisch wegen der steigenden anzahl auszuführenden befehlen). 34usec. war die kleinste zeit die damals bei einem stepper ging. allerdings wird diese zeit jetzt niemals bei 4 und mehr steppern eingehalten.
nun meine frage. wie kann man mehrere stepper, die getrennt angesteuert werden können müssen (geschwindigkeit etc) gleichzeitig betreiben? ist das überhaupt ohne geschwindigkeitsverlust möglich bei einem einzigen arduino uno?
p.s.
meine erste idee wäre gewesen, jedem stepper einen arduino nano zu spendieren .. klingt für mich aber kosten anfällig und verrückt xd
die zweite idee wäre, herauszufinden wie die pololu-boars funktionieren. doch nach ersten kurzrecherchen scheinen dort alle a4988 "gestapelt" zu sein und mit einem schlag "angesteppt" zu werden. dadurch könnte ich aber die steppers nicht mit unterschiedlichen geschwindigkeiten gleichzeitig ansteuern ...wenn ich das richtig sehe.
habe gerade noch etwas getestet:
code: [select]
unsigned long start;
void loop() {
start = micros();
//micros()
serial.println(micros() - start);
}
das braucht angeblich 4 usek.! o_o je mehr man danach micros() hinzufügt um länger dauert es^^ scheint als würde micros() 2-4 usek benötigen. das ist dann doch erheblich wenn man bei 120000 steps jedesmal 2-4 usek verliert.
heißt ich muss bei "nextupdate = micros() + stepdelay_usec;" mehr oder weniger schon 2-4usek wieder abziehen...
...ok mit einer korrektur von -2usek delay pro hinzugefügten stepper bleiben sie lautstärkemäßig (nicht u/min gemessen) nun pi*daumen auf der selben geschwindigkeit. das ging mit 4 steppern gut. bei 10 steppern brauchte allerdings schon alleine der aufrufe aller steppers nacheinander lange, dass die delay jedes einzelnen überschritten wurde. bin mal gespannt für lösungsvorschläge hier kommen

nun meine frage. wie kann man mehrere stepper, die getrennt angesteuert werden können müssen (geschwindigkeit etc) gleichzeitig betreiben? ist das überhaupt ohne geschwindigkeitsverlust möglich bei einem einzigen arduino uno?das einzige, mir spontan einfällt: erledige die stepperei in einer isr (interrupt service routine). in der routine musst du halt die abfrage der stepper-objekte erledigen und jeweils einen schritt machen (oder eben nicht).
ob das in der von dir gewünschten geschwindigkeit geht, weiß ich nicht. ich würde das halt einfach probieren.
gruß
gregor
nachtrag:
meine erfahrungen mit steppern sind ziemlich bescheiden. ich habe zwar schon ein bisschen damit gespielt, aber geschwindigkeit angeht, habe ich keine (also wirklich null) ahnung. die von dir genannten 34 mikrosekunden entsprechen ungefähr 30 khz. bei 200 schritten pro umdrehung wären das 150 umdrehungen in der sekunde. können stepper tatsächlich schnell sein?
Arduino Forum > International > Deutsch (Moderator: uwefed) > Mehrere Stepper mit unterschiedl. Geschwindigkeiten gleichzeitig ansteuern?
arduino
Comments
Post a Comment