Forum: Mikrocontroller und Digitale Elektronik Schrittmotor Schritte zählen


von Matthias K. (gidarrnmatze)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe hier folgendes Problem bei dem ich einfach keine Lösung finde.
Bei der Schrittmotorsteuerung soll ein L297 verwendet werden.

Die Clock bekomme ich aus dem Timer Overflow mit:
PORTB ^= (1<<PB0);
Also bei jedem Overflow ändert sich der Zustand.

Wenn ich Taster 0 betätige soll sich Pin1 an Port B auf 1 setzen -> 
ENABLE.
Der Motor dreht sich. Andernfalls geht er auf Null. Der Motor bleibt 
stehen.

Das klappt schon alles super.
jetzt möchte ich allerdings vorgeben das der Motor sich z.B.
100 Schritte bewegen soll.

Überlegung war eine For Schleife in der ISR,
aber das scheint nicht zu funktionieren, da der Overflow ja ständig 
läuft.
Ich komm nicht drauf wie ich realisieren soll das sich pro Clock Signal 
ein Schritt gezählt wird. Bin ich hier auf dem Holzweg?

Wäre cool wenn Ihr mir helfen könnt :-)
mfg
Matthias

von quadral (Gast)


Lesenswert?

Hi.

Deklarier doch einfach einen globale Variable.

uint8_t CountVar = Anzahl Schritte;

int main(void){...}

In der ISR zählst Du die dann runter:

if(CountVar>0){PORTB ^= (1<<PB0); CountVar--;}

Fährt der Moter den überhaupt pro Clock einen Schritt?

von Matthias K. (gidarrnmatze)


Lesenswert?

Hi,

ja also er fährt bei jeder positiven Flanke am L297 einen Schritt 
weiter!

Aber das hab ich auch schon probiert.
allerdings funktioniert es nicht ganz,
Da ja ständig das Clock Signal anliegt zählt er auch runter, auch wenn 
der Motor aus ist.(ENABLE am L297 auf 0 ist).

Die ISR wird ja ständig aufgerufen , also bei jedem Overflow, oder?

Grüße

von spess53 (Gast)


Lesenswert?

Hi

Warum schaltest du den Enable-Eingang vom L297. Damit wird der Motor 
stromlos und hat auch kein Haltemoment mehr. Außerdem müsste das mit dem 
Takt synchronisiert werden. Sonst handelst du dir Schrittfehler ein.

Schalte mit dem Taster den Timer. Der zählt die Schritte und schaltet 
sich dann wieder ab.

MfG Spess

von Matthias K. (gidarrnmatze)


Lesenswert?

Hi,

Vielen Dank für Eure Ratschläge.
ich habs etz so gemacht wie quadral vorgeschlagen hat:

if(Schritte>0){PORTB ^= (1<<PB0); Schritte--;}

ich hab die Variable als
"volantile uint8_t Schritte = 0" deklariert.

wenn der Motor dann laufen soll geb ich ihm einfach z.B.
Schritte = 100;

das klappt prima!

MfG

von Erklärbär (Gast)


Lesenswert?

Hi.

Ahh. Jetzt isses mir klar. Offensichtlich ist das volatile doch nötig, 
da die ISR ja durch den Timer Overflow aufgerufen wird. Damit liegt die 
Dekrementierung der Variablen "Schritte" oder "CountVar" außerhalb der 
direkten Zuständigkeit des Programmablaufs. Dafür entschuldige ich mich. 
Ich befasse mich erst seit kurzem mit den AVR's und habe noch nicht so 
viel Erfahrung.

Danke für dein positives Feedback. Die Idee war ja dann doch nicht so 
verkehrt :-)

Wenn der Motor nur bei jeder positiven Flanke fährt, musst du das 
doppelte an Schritten angeben, da die Dekrementierung auch bei fallender 
Flanke erfolgt. Um das zu verhindern, kannst du auch eine Abfrage nach 
dem Zustand des Pins in die ISR basteln...

lg
quadral

von Jan (Gast)


Lesenswert?

Hi !

Kannst du bitte dein Quellcode hochladen? Ich habe nämlich das gleiche 
Problem. Ich muss auch Tackte bei einem Schrittmotor zählen. Ich bin 
aber noch mit dem C-Programierung nicht so weit. Es wäre sehr neet von 
dir.

MFG

Jan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.