Hallo,
habe 2 Probleme mit meinem Bipolaren Schrittmotor.
Den C-Code habe ich bereits geschrieben, dieser Funktioniert auch. Mein
erstes Problem ist die Drehzahl die ist zu langsam, habe schon einiges
Probiert leider bekomme ich den Schrittmotor nicht schneller. Mit dem
Arduino hab ich das schon hinbekommen, da ich aber an das AVR-Studio
gebunden möchte ich nun die gleiche Drehzahl erreichen. Nach dem
Datenblatt kann der Motor max. 2500 1/min.
Mein zweites Problem ist das der Motor laut Datenblatt 200 Schritte für
eine Umdrehung brauch, jedoch muss ich in der schleife nur 50
Wiederholungen Programmieren damit der Motor eine Umdrehung macht.
Hier mal den C-Code
1
{
2
intwert=0;
3
4
5
//TWI Portexpander
6
voidEXT_INIT_PCA9555(void);
7
EXT_PCA9555_CONF_PORTA(ADR0_PCA9555,PORT_OUT);
8
EXT_PCA9555_CONF_PORTB(ADR0_PCA9555,PORT_OUT);
9
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,0x00);
10
EXT_PCA9555_WRITE_PORTA(ADR0_PCA9555,0x00);
11
12
while(wert<=1000)
13
{
14
15
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(1<<4)|(0<<5)|(0<<6)|(1<<7));//B aus und D und A ein
16
_delay_ms(15);
17
18
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(0<<4)|(1<<5)|(0<<6)|(1<<7));//D aus und C ein
19
_delay_ms(15);
20
21
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(0<<4)|(1<<5)|(1<<6|(0<<7)));//A aus und B ein
22
_delay_ms(15);
23
24
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(1<<4)|(0<<5)|(1<<6)|(0<<7));//C aus und D ein
25
_delay_ms(15);
26
27
28
wert=wert+1;
29
_delay_ms(100)
30
31
32
}
33
}
Der Motor wird über ein L293D angetrieben, dieser wird mit 12V gespeist.
Für eine Hilfreiche Antwort bin ich Sehr Dankbar.
Steffen S. schrieb:> Mein zweites Problem ist das der Motor laut Datenblatt 200 Schritte für> eine Umdrehung brauch, jedoch muss ich in der schleife nur 50> Wiederholungen Programmieren
das hast du doch so programmiert:
1 Schleifendurchlauf macht 4 Schritte
Ob dus glaubst oder nicht, ich hab den Code selbst geschrieben. Der Code
hat sich geänder weil ich zuerst den "ersten" Code gepostet hatte dies
aber nicht der Aktuelle Code ist, der aktuelle Code ist wie man sieht
mit eine PortExpander Programmiert. Da ist mir auch bewust das der Code
öfters wir 50 mal durchlaufen wird. Das Problem ist aber nachwievor das
wenn Ich in die Wiederholung auf 50 Programmiere der Motor 1 Umdrehung
macht.
Dein Code ist ein Paradebeispiel dafür, wie man es nicht machen soll.
_delay_ms(15); bedeutet beim Umschalten: Du machst es von Hand - der
Computer kann es viel schneller. Wenn überhaupt, schon die
Umschaltsequenz benötigt ein paar Taktzyklen, Verzögerungen im Bereich
von µs.
_delay_ms(100) wozu?
Wenn ich mal die Ausgabezeiten vernachlässige (µs), so kommst Du bei der
Sequenz auf (4*15ms + 100ms) also einen Schritt pro 160ms.
Wenn ich mal unterstelle (darüber hast Du Dich ja ausgeschwiegen), das
Du einen Motor mit 200 Schritten (oft verwendet) pro Umdrehung hast, so
kommst Du nach meiner Rechnung auf ca. 0,03 U/s. Nicht unbedingt ein
Wert, bei dem einem schwindelig wird.
Du siehst also: Kopieren geht nicht immer über Studieren!
Natürlich kommst Du durch das herabsetzen der Verzögerungen auf bessere
Werte, da Du aber offensichtlich nicht weist, was Du tust, wirst Du
damit nicht glücklich werden.
Erkundige Dich mal was Anfahrrampen Bremsrampen und ähnliches bedeuten.
Übrigens: Der L293D gehört ins Museum und ins Lötauge. Heizt aber prima.
Steffen S. schrieb:> möchte ich nun die gleiche Drehzahl erreichen. Nach dem> Datenblatt kann der Motor max. 2500 1/min.
Um die angegegeben Leistungen aus einem Stepper rauszuholen musst Du es
im Chopperbetrieb betreiben. Das kann der L293D nicht.
Steffen S. schrieb:> Mein zweites Problem ist das der Motor laut Datenblatt 200 Schritte für> eine Umdrehung brauch, jedoch muss ich in der schleife nur 50> Wiederholungen Programmieren damit der Motor eine Umdrehung macht.
50 x 4 sind wieviel????
Schau mal in Deine Schleife... Verstehst Du was Du da programmiert hast?
Amateur schrieb:> so kommst Du bei der> Sequenz auf (4*15ms + 100ms) also einen Schritt pro 160ms.
???
Ein Schleifendurchlauf ist doch nicht ein Schritt!!
Habe mich ein wenig vertan
Übrigens: Der L293D gehört ins Museum und nicht ins Lötauge.
-----
Selbst wenn ein Schleifendurchlauf zwei Schritte oder sogar vier wären,
bei dann 0,1 U/s wird Dir wohl immer noch nicht schwindelig.
Es ist ja auch eine der leichtesten Übungen die Anzahl an Schritten pro
Sekunde zu errechnen, um auf 2500 U/Min. zu kommen.
steffen_s61 schrieb:> Das Problem ist aber nachwievor das> wenn Ich in die Wiederholung auf 50 Programmiere der Motor 1 Umdrehung> macht.
Das ist doch kein 'Problem'.
Das ist genau das was du programmiert hast!
Jede Ausgabe an den Portexpander veranlasst den Motor einen Schritt zu
machen.
Das hier
1
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(1<<4)|(0<<5)|(0<<6)|(1<<7));//B aus und D und A ein
2
_delay_ms(15);
3
4
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(0<<4)|(1<<5)|(0<<6)|(1<<7));//D aus und C ein
5
_delay_ms(15);
6
7
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(0<<4)|(1<<5)|(1<<6|(0<<7)));//A aus und B ein
8
_delay_ms(15);
9
10
EXT_PCA9555_WRITE_PORTB(ADR0_PCA9555,(1<<4)|(0<<5)|(1<<6)|(0<<7));//C aus und D ein
11
_delay_ms(15);
sind 4 Schritte und nicht 1!
Wenn du mir nicht glaubst (oder dem Rest hier), dann mach halt mal ein
_delay_ms(1000) zwischen die 4 Ausgaben und beobachte den Motor: Macht
er jede einzelne Sekunde einen Schritt oder macht er alle 4 Sekunden
einen Schritt (weil sich 4 Stück delay_ms(1000) in einem
Schleifendurchlauf nun mal zu 4 Sekunden aufaddieren)?