Hallo liebe Leute! Ich habe vor, mit meinem ATmega8515 einen Schrittmotor anzusteuern, allerdings mit einer einfachen Transistorschaltung: ich gehe vom Portbin meines Atmega8515 auf die Basis des Transistors, am Emitter hängt die jeweilige Leitung(1,2,3,4) des Schrittmotors). Ich habe vorher noch nie etwas mit Schrittmotoren gebaut und möchte eine Bestätigung von euch über mein bisheriges Wissen: Schrittmotoren haben eine gewisse Anzahl an internen Spulen. Umso mehr Spulen, desto genauer die "Rasterauflösung" des Schrittmotors. Durch das Nacheinander-Takten der einzelnen Spulen (über die jeweilige Versorgungsleitung), wird der Schrittmotor zum Laufen gebracht. Die Drehzahl des Motors wird durch die Taktfrequenz bestimmt, die Versorgungsspannung der einzelnen Leitungen ist dabei konstant. Ein Richtungswechsel erfolgt durch eine Umkehrung des Taktzykluses. Die benötigte Taktanzahl für eine Umdrehung hängt von der Anzahl der internen Spulen ab (Schrittmotor mit 4 Spulen macht pro Takt 90° Umdrehung). Nun habe ich folgendes vor: Ich möchte nun (wie oben beschrieben) die Basen der einzelnen Transistoren nacheinenader von meinem µC aus ansteuern. NUR: Mein Controller ist mit 8 MHz (int Osc.) getaktet und ich möchte den Motor nicht unbedingt gleich überdrehen ;-) Wie und Wo kann ich eine gewisse Verzögerung in meinem C-Code einbauen, damit der Controller nicht mit 8 MHz die einzelnen Pins (Basen) taktet? Mein subtiler Code müsste wie folgt aussehen: //---------------------------------------------------- #include <avr/io.h> int main (void) { DDRA = 0xFF; //PortA als Ausgang int i; //Zählervariable definieren for(i=0; i<100; i++) //Sollte 100 Umdrehungen machen { PORTA = 0x01; //schalte die 1. Spule ein... PORTA = 0; //Schalte die 1. Spule aus... delay(int i); //Variable i -> Verzögerung in µs PORTA = 0x02; //schalte die 2. Spule ein... PORTA = 0; //Schalte die 2. Spule aus... delay(int i); PORTA = 0x04; //schalte die 3.Spule ein.... PORTA = 0; //Schalte die 3. Spule aus... delay(int i); PORTA = 0x08; //schalte die 4. Spule ein... PORTA = 0; //Schalte die 4. Spule aus... delay(int i); } } Wie kann ich diese Verzögerung realisieren? Die Verzögerunsfunktion sollte nicht viel Speicherplatz im Programmspeicher meines Controllers benötigen. Vielen Dank für euere Hilfe.
@ JK (Gast) >Ich habe vor, mit meinem ATmega8515 einen Schrittmotor anzusteuern, >allerdings mit einer einfachen Transistorschaltung: ich gehe vom Portbin Warum? Es hat schon seinen Grund, warum es fertige Treiber-ICs gibt. >meines Atmega8515 auf die Basis des Transistors, am Emitter hängt die >jeweilige Leitung(1,2,3,4) des Schrittmotors). Klingt nicht gut. Zeichne mal einen Schaltplan. Vorher solltest du dich aber besser informieren. Bipolare Schrittmotoren Allerdings gibt es noch UNIpolare Schrittmotoren, die kann man mit einfachen Transistoren ansteuern. Such mal im Netz. >Die benötigte Taktanzahl für eine Umdrehung hängt von der Anzahl der >internen Spulen ab (Schrittmotor mit 4 Spulen macht pro Takt 90° >Umdrehung). Nöö, das stimmt nicht. >Wie und Wo kann ich eine gewisse Verzögerung in meinem C-Code einbauen, >damit der Controller nicht mit 8 MHz die einzelnen Pins (Basen) taktet? Wann? nach jedem Schritt. Wie? Mit der _delay_ms() Funktion. Siehe AVR-GCC-Tutorial >Wie kann ich diese Verzögerung realisieren? Die Verzögerunsfunktion >sollte nicht viel Speicherplatz im Programmspeicher meines Controllers >benötigen. Ist den Controller soooooo klein? MFg Falk
Zum Thema "Was für Schrittmotoren gibt es" und (grob) "Wie werden bipolare Schrittmotoren angesteuert" anbei mal ein Auszug aus einer Versuchsanleitung für einen Laborversuch zu dem Thema. Vielleicht kannst Du damit schon mal was anfangen.
ja vielen Dank! Echt nett von dir, dass du mir es geschickt hast. Hat einiges klar werden lassen ;-) gruß
JA es ist wirklich wichtig, dass diese delay_ms() nicht zu groß ist, denn ich habe auch vor, einen Schrittmotor mit einem ATTiny zu machen. Gibt es da nicht diese Compiler-Optimierung? Was bedeuten diese kryptischen "0c",....? ansonsten...welche Möglichkeit gäbe es für die Delay-FUnktion noch als Alternative? Danke!
hmm...stimmt, muss ich mal sehen ob das überhaupt notwendig ist, denn auch die kleinen AVRs haben doch beachtlichen speicher. Ich bin auf folgende Idee gekommen, es müsste doch einen Unterschied machen das Programm so zu schreiben: //--------------------------------------------- ... int MacheVerzoegerung(void) { _delay_ms(5); } int main (void) { DDRA = 0xFF; PORTA = 0x01; MacheVerzoegerung(); .... //______________________________________________ als wenn ich jedesmal die Funktion delay einfüge oder? Weil so ist es ja im prinzip immer nur ein Sprung auf EINE funktion und nicht auf mehrere, oder denke ich da falsch? danke
Das spart nur den Parameter-Ladebefehl, also nicht sehr viel. Dafür kostet die Ausführung ein paar Takte mehr.
weißt du zufällig, wie man die Speicherbelegung im AVR studio anzeigen lassen kann?? ----------------------------------- 0.3 % program memory oder so ähnlich.
@ JK (Gast) >Ich bin auf folgende Idee gekommen, es müsste doch einen Unterschied >machen das Programm so zu schreiben: Eher so.
1 | void MacheVerzoegerung(uint16_t delay) |
2 | {
|
3 | for (; delay>0; delay--) _delay_ms(1); |
4 | }
|
5 | |
6 | |
7 | int main (void) |
8 | {
|
9 | DDRA = 0xFF; |
10 | |
11 | PORTA = 0x01; |
12 | |
13 | MacheVerzoegerung(20000); // 20 Sekunden |
14 | }
|
>weißt du zufällig, wie man die Speicherbelegung im AVR studio anzeigen >lassen kann?? Macht AVR-Studio nach jedem Compilerlauf automatisch. MFG Falk
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.