2017-12-16 28 views
1

Beaglebone Black用のデバイスドライバを書いただけで、ULN2003Aボードを介して接続された28BJY-48ステッピングモータが回転します。すべて正常に動作しますが、モーターは回転しますが、信号を「キャプチャ」するために各ピンがHIGHに切り替わった後にmsleep(1)を使用する必要があることがわかりました。私がループをスリープ時間なしで動かせるようにすれば、モーターは何も起こりません。Beaglebone Blackステッピングモータを非常にゆっくり動かしているGPIOコントロール。どうすればスピードを上げることができますか?

私がやっていることは、モーターの回転をスピードアップすることです。

私のロジックは、信号が速すぎて応答することができないということです。私は、モーターコイルと直列のLEDが点灯するので、信号が送信されていることを知っています。

私はデータシートとElegoo found here for refereneが提供する説明書を読みました。

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

IがのGPIOを制御していた方法によりある:私はコントロールとしてP8の次のGPIOを割り当てた Driver diagram

は、理解を容易にするために、私は配線図を添付しioremap()を使用してください。ここで

は、モータを制御するコードの一部です:

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; 
} 

私はモーターがBeagleboneの5V電源は独立にはまっています。適切な方向への助けや指導をいただければ幸いです。

2つのピンを同時にLOWと2からHIGHに設定する方法はありますか?私のコードは、別の高を設定する前に1つのピンを低く設定します。私は両方を一つのステップで行うことができるかどうかを知りたいと思います。私はそれを理解していないようです。

答えて

0

さらなるレビューと調査の結果、問題は電圧、モータ、またはボードではなく、コード自体にあることがわかりました。

As per this link msleepには、約20msの最小制限があることがわかりました。 20ms以下(私の場合は1ms)は20msで実行されます。したがって、<の20msの遅延を達成する適切な機能は、以下のいずれかになります。

は、1000-2000の範囲を使用すると、より高速な回転で良好な結果が得られました。しかし、モーターを持っている間、私は目に見えないものの、いくつかのステップをスキップすると感じます。私は、これが電圧障害またはモータ制限のいずれかであると信じています。スキップを引き起こす原因を除外するためには、さらに分析する必要があります。

私はまだこの範囲で遊んで、最適な非スキップ範囲の範囲を把握しています。

udelay()でも動作しますが、システムは一部の常設ループでフリーズしているようで、ハードリブートが必要です。回転ループの完了後にシステムがハングする原因を正確に把握するためには、さらに分析が必要です。

関連する問題