Schrittmotor Schritte zählen

OP #2170316
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
Angehängte Dateien:
Gast #2170374
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?
OP #2171408
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
Gast #2171416
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
OP #2172637
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
Gast #2172661
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
Gast #2247943
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren