Forum: Mikrocontroller und Digitale Elektronik Schrittmotor Ansteuerung mit L293D


von Steffen S. (steffen_s61)


Lesenswert?

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
  int wert=0;
3
  
4
  
5
  //TWI Portexpander
6
  void EXT_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.

: Bearbeitet durch User
von Walter S. (avatar)


Lesenswert?

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

von Steffen S. (steffen_s61)


Lesenswert?

Wenn ich das richtig Programmiert habe sind die 4 Zeilen, die in der 
Schleife sind, ein Schritt.

: Bearbeitet durch User
von Walter S. (avatar)


Lesenswert?

PS: ich denke du hast gar nichts programmiert sondern den Code irgendwo 
her kopiert, die Schleife wird nicht nur 50x wiederholt

von Walter S. (avatar)


Lesenswert?

PPS: wieso ändert sich dein Code laufend?

von steffen_s61 (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von Bülent C. (mirki)


Lesenswert?

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?

von Bülent C. (mirki)


Lesenswert?

Amateur schrieb:
> so kommst Du bei der
> Sequenz auf (4*15ms + 100ms) also einen Schritt pro 160ms.

???
Ein Schleifendurchlauf ist doch nicht ein Schritt!!

von Amateur (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)?

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.