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
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?
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.