Dat ziet er wel heel anders uit. Nu zie je toch beter war er gebeurt. 
Ik vind stepping() wel een beetje vreemd:
- Die doet telkens 6400 stappen. Dat zou ik als parameter meegeven.
- Geen delay na stap LOW? Dan word die meteen weer hoog voor de volgende stap.
- Een delay van 20 microseconden lijkt me wel erg kort. Misschien moet je ook versnellen aan het begin en vertragen aan het eind van de sequence.
De stappenmotoren komen soms niet op gang als de frequentie te hoog is. Maar dat vind ik nu nog niet zo'n groot probleem.
Ik wil het zo opzetten dat de stapper voor het winden continue doorloopt en dat de stapper voor de draadgeleider tegelijk z'n stapjes doet.
Dus bij een draaddikte van 100 µm is dat voor de geleider een halve omwenteling, Daar zit een 1:5 vertraging op op een M6 as. Die is 1mm per hele omwenteling van 360 graden van die as.
Van de 6mm as is 360 graden rotatie 1mm verplaatsing, dus is 36 graden rotatie van de M6 as 0.1 mm aka 100 µm. 5x36= 180 graden van de stapper is dus 100 µm. dat is bij 1/32 3200 stapjes. Of als de DRV8825 op 200 stappen staat 100 stappen.
1/1 200 = 100
1/2 400 = 200
1/4 800 = 400
1/8 1600 = 800
1/16 3200 = 1600
1/32 6400 = 3200
stappen voor 100 µm verplaatsing.
Bij een 1/1 is 1 stap van de stapper 2 µm verplaatsing als ik het goed begrijp.
De verplaatsing van de draadgeleider moet bepaald worden door de diameter van de wikkeldraad. Dus bij een 500 µm draad moet die 500 µm per 360 graden van de wikkelmotor opschuiven.
Tot nu toe doet hij 1 omwenteling van de windingstapper, die stopt waarna de draadgeleider het vereiste aantal µm opschuift en dan stopt. Waarna de windingstapper weer 1 wikkeling doet. enz.
Ik ben aan het uitzoeken of ik de stapper van de draadgeleider het vereiste aantal stappen kan laten maken door de enable gedurende dat aantal stappen hoog te maken. En daarna weer laag.
Of ik moet via een AND in de software de geleiderstapper een eigen stap pin geven en daarmee sturen. De enable werkt echter ook als een soort AND.
Het lastige voor mij is echter om de twee for loops 'simultaan' te laten lopen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Als je een stepper motor driver gebruikt zoals de A4988, dan moet de step input hoog zijn gedurende minimaal 1 microseconde. In de praktijk is "digitalWrite" langzamer dan een microseconde, dus
digitalWrite (step, HIGH);
digitalWrite (step, LOW);
werkt. Maar toch zou ik om toekomstbestendig te zijn:
digitalWrite (step, HIGH);
delay_us (1);
digitalWrite (step, LOW);
doen. Dat geeft ook aan dat je begrepen hebt dat ie 1 microseconde hoog moet zijn. (Ik geloof dat ik een keer getest heb dat in de handleiding (datasheet) staat: 1 microseconde, maar dat ie ook al reageert op een VEEL kortere puls. )
Ik zou daarachter dan de "tijd tussen twee pulsen" aan delay zetten.
dus:
void pulse (int pin) {
digitalWrite (pin, HIGH);
delay_us (1);
digitalWrite (pin, LOW);
}
void stepping (int pin, int steps) {
for (int s=0;s<steps;s++) {
pulse (pin);
delay_us (100); // aanpassen
}
}
Ik heb het puls geven naar een aparte functie gehaald. Ik heb de "standaard loop" gebruikt met for (x=0;x<eind;x++) Dat is standaard zoals een lus geschreven wordt, door de s++ elders te plaatsen doorbreek je de standaard manier van schrijven die helpt dat iedereen herkent wat je aan het doen bent.
Ik geef OOK de pin door aan de stepping functie. Dan kan je straks ook met een andere stepper gaan steppen.
Het lastige voor mij is echter om de twee for loops 'simultaan' te laten lopen.
Dat kan wel, bijv met freertos. Maar dat is weer een heel nieuwe puzzel.
In dit geval is het makkelijker om de 2 for-loops om te bouwen naar een enkele for loop. En dan binnen de loop beide motoren af en toe een puls geven.
Als je wilt kan ik wel een opzet maken, al kan ik het hier niet testen bij gebrek aan hardware.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Twee threads die alletwee een stepper aansturen is denk ik geen goed plan. De kans dat je "even" een hikje hebt omdat de andere thread bezig is, die is heel groot. En als je dat soort hikjes hebt, dan krijg je dat je motor even stilstaat en vervolgens vanuit stilstand moet accellereren naar de snelheid die je had.
In het hart wordt het:
update_motor (struct motor *m)
{
//m->v += m->a;
m->fpos += m->v;
if (m-> fpos > FPART) {
pulse (m->pin, m->dirpin, 1);
m->pos ++;
}
if (m-> fpos < 0) {
pulse (m->pin, m->dirpin, 0);
m->pos --;
}
}
Daar moet dan nog omheen dat je de pins initialiseert, en in de gaten houdt wanneer je wil stoppen, dat soort dingen. Ik heb de verwerking van de "versnelling" nog uitgecommentarieerd omdat we dat nog niet echt besproken hadden, behalve dan dat het eigenlijk zou moeten. En dat kan met deze opzet redelijk makkelijk.
Anderzijds, er IS een stepper library die dit soort dignen zou moeten kunnen.
Enable kun je niet gebruiken om de stap te sturen. Daarmee schakel je de chip volledig uit, zowel de uitgangen als ook de mirco-stepper.
Dus ik zou beide Enables aan 1 pin hangen, en de 2 Steps apart aansturen.
Ik heb de update in een nieuw draadje gezet: https://www.circuitsonline.net/forum/view/169595
het probleem met de steppers is min of meer opgelost met:
// regelt het aansturen van de stappenmotoren.
void stepping() {
// Initialisatie van de teller voor het aantal
// stappen van de draadverplaatsings motor.
int deelfactor = 0; // verdeelt de draadpulsen gelijkmatig over draadsteps.
int d = 0; // bruto draadsteps draadteller;
// De steps teller voor 1 360 graden rotatie
// van de windingmotor.
for (int s = 1; s < Steps + 1; s++) {
deelfactor = s % (Steps / draadsteps);
windingpuls();
// Als de trekkracht op de draad te hoog wordt dan
// noodstop om dat probleem op te losen.
if (draadtensiesensor > 60) {
Serial.print("STOP! Draad tensie te hoog: ");
Serial.println(draadtensiesensor);
while (okknop == HIGH);
}
// Als teller d kleiner is dan het aantal
// draadsteps en deelfactor is nul, tel er 1 bij op
// en geef de draadmotor 1 stap.
if (d < draadsteps && deelfactor == 0) {
d++;
if (d > draadsteps) {
d = 0;
}
draadpuls();
}
// Vertraging om de frequentie van de stepperpulsen
// te regelen.
delayMicroseconds(microsec);
// Meet hoeveel draad er is gebruikt.
draadmeter();
}
}