Gast
#701521
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.