2017-12-16 12 views
1

Ich habe einen Gerätetreiber für den Beaglebone Black geschrieben, der einfach meinen 28BJY-48 Schrittmotor dreht, der durch eine ULN2003A Karte verbunden ist. Alles funktioniert gut, der Motor dreht sich, aber ich habe gefunden, dass msleep(1) notwendig ist, nachdem jeder Pin auf HOCH geschaltet ist, damit der Motor das Signal "einfangen" kann. Wenn ich die Schleife ohne Schlafzeit laufen lasse, passiert nichts mit dem Motor.Beaglebone Black GPIO Steuerung läuft Schrittmotor sehr langsam. Wie kann ich die Geschwindigkeit verbessern?

Was ich versuche zu tun ist die Motordrehzahl zu beschleunigen.

Meine Logik ist, dass das Signal zu schnell ist, damit der Motor reagiert. Ich weiß, dass das Signal gesendet wird, weil die LEDs in Reihe mit den Motorspulen aufleuchten.

Ich habe das Datenblatt und die Anweisungen von Elegoo found here for referene gelesen.

Zum besseren Verständnis habe ich den Schaltplan angehängt: Driver diagram

ich folgende GPIOs von P8 als Kontrollen zugeordnet haben:

GPIO11 - IN1 - BLUE wire (coil 4) 
GPIO12 - IN2 - PINK wire (coil 3) 
GPIO15 - IN3 - YELLOW wire (coil 2) 
GPIO16 - IN4 - ORANGE wire (coil 1) 

Die Art und Weise habe ich die GPIOs bin Steuerung durch ist mit ioremap(). Hier

ist der Teil des Codes, der den Motor steuert:

static ssize_t motor_rotate(int i) { //0 rotates right, 1 rotates left 
    int c = 0; 

    motor_stop(); 

    while(c < 2000) 
    { 
     *gpio_dataout_addr |= PIN11; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN16); 
     *gpio_dataout_addr |= PIN12; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN11); 
     *gpio_dataout_addr |= PIN15; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN12); 
     *gpio_dataout_addr |= PIN16; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN15); 

     c++; 
    } 

    motor_stop(); 

    return 0; 
} 

static ssize_t motor_stop(void){ 
    *gpio_dataout_addr &= (0xFFFFFFFF^(PIN11 | PIN12 | PIN15 | PIN16)); 

    return 0; 
} 

ich meinen Motor auf eine 5V-Stromversorgung unabhängig von der BeagleBone angeschlossen haben. Jede Hilfe oder Hinweise in die richtige Richtung sind willkommen.

Nebenbei, gibt es eine Möglichkeit, gleichzeitig 2 Pins auf LOW und 2 auf HIGH zu setzen? Mein Code setzt einen Pin auf einen niedrigen Wert, bevor ein anderer Wert gesetzt wird. Ich würde gerne wissen, ob ich beides in einem Schritt tun könnte. Ich kann das nicht herausfinden.

Antwort

0

Nach weiterer Überprüfung und Forschung fand ich, dass das Problem nicht mit Spannung, Motor oder Platine, aber mit meinem Code selbst liegt.

As per this link Ich habe festgestellt, dass msleep eine minimale Begrenzung von etwa 20ms hat. Alles unter 20ms (in meinem Fall 1ms) wird bei 20ms laufen. Daher wäre die richtige Funktion, um 20ms Verzögerungen < zu erreichen, eine der folgenden sein:

usleep_range(), mit einer Reichweite von 1000-2000, hat mir ein gutes Ergebnis mit schneller Rotation. Während ich den Motor halte, fühle ich, dass er ein paar Schritte überspringt, obwohl er für das Auge unsichtbar ist. Ich glaube, dass dies entweder ein Spannungsfehler oder eine Motorbegrenzung ist. Eine weitere Analyse wäre erforderlich, um auszuschließen, was das Überspringen verursacht.

Ich spiele immer noch mit dieser Reihe, um herauszufinden, was der optimale Nicht-Überspringbereich ist.

udelay() funktioniert auch, jedoch scheint das System in einer permanenten Schleife einzufrieren und ein harter Neustart ist erforderlich. Eine weitere Analyse ist erforderlich, um herauszufinden, was genau bewirkt, dass das System nach Abschluss der Rotationsschleife hängen bleibt.

Verwandte Themen