Ik vond in dat topic deze posting van jou.
Jou code switched van bijvoorbeeld 19 cycles naar 10 cycles per pulse in de laatste stap voordat het "vaste snelheid" stuk begint.
Als je het in mm/sec van het aangedreven ding uitdrukt dan is dat van bijvoorbeeld 10.5 naar 20mm/sec in 1 stap.
De mechanica dicteert echter dat je bijvoorbeeld wel instantaan van 0 naar 1mm/sec kan gaan, maar niet van 19 naar 20, omdat dan al een deel van het beschikbare koppel gebruikt moet worden om de beweging in stand te houden.
De meeste stepper-sturing-libraries doen welliswaar een lineaire accelleratie die daar geen rekening mee houdt, maar jou code doet het kwa versnellingen verkeerdom.
Wat ik doe, is ik werk in "nanosteps". Pas als die zeg 2^13 bereiken doe ik een een microstap (i.e. pulse naar de motor).
Door nu de snelheid te maximeren op zeg 2^13 per tijdstap, en een versnelling van zeg 100 of 200 per tijdstap te doen, dan kan je dus iedere tijdstap (timer ISR)
c code:
snelheid = snelheid + accelleratie;
nanopos = nanopos + snelheid;
while (nanopos > 8192) {
send_pulse (1);
nanopos -= 8192;
}
while (nanopos < -8192) {
send_pulse (0);
nanopos += 8192;
}
waarbij send_pulse dus de DIR pin op de waarde in het argument zet en dan een pulsje geeft.
De wiskunde is eenvoudig: Tijdens een accelleratie-fase is de afgelegde afstand 1/2 a * t2. Tijdens het decelereren ook. Samen a * t2. Tijdens het "constante snelheid" bewegen is de beweging v * t.
De complexiteit zit hem er in dat die twee keer "t" discreet moet zijn. Als je het uitrekent kom je met t = remaining_constant_speed_distance / vmax; bijvoorbeeld op 400.5 uit. Tja. Dan kom je dus "vmax/2" te ver of niet ver genoeg. Daarvoor corrigeren is TRICKY. Er is een artikel over geschreven door een stelletje studenten uit eindhoven. Ik heb geprobeerd hun code te implementeren, maar dat wilde maar niet. Uiteindelijk maar gewoon zelf gedaan.
Maar "goed in de richting" is vaak al goed genoeg. Dan is het eenvoudig.