2017-04-06 12 views
0

drv8825ドライバで駆動するいくつかのステッピングモータを使って学校プロジェクトを行っています(実際には天井走行クレーンになります) Arduino UNOと共演しました。まず第一に、我々は莫大な金額を費やすことができませんでした。 問題はこれです:私たちは、モータの速度を制御するMPU6050 acc +ジャイロを通してPID制御を使用するつもりです(負荷は動きの中で可能な限り頑丈であると考えられています)。ステッピングモータの速度を変更する唯一の2つの方法がある:DCモータのスピードコントロールStepper(モーター:NEMA 17、ドライバ:drv8825)[周波数調整]

1)遅延メソッドを介して、例えば:このメソッドを使用して

for (i = 0; i<400; i++) 
{ 
    digitalWrite(StepPinB, LOW); 
    delayMicroseconds(500); 
    digitalWrite(StepPinB, HIGH); 
    delayMicroseconds(500); 

} 

、Arduinoのは、すべての時間忙しくなるので、私は意志正確な速度に達するために、センサの値を連続的にチェックすることができない。このため、私はこの方法を使うことができません。

2) "電圧 - 周波数コンバータ"(可変電圧は "Arduino PWM" + "ローパスフィルタ"で与えられます)を使用するか、周波数を変更するための「デジタルポテンショメータ」を備えた「無安定マルチバイブレータ」(「安定発振器」)。 私はすでに "電圧 - 周波数コンバータ"方式を試しましたが、回路のノイズのために動作しませんでした。

ステッパモーターの速度をプログラム中で連続的に変更するにはどうすればよいかを知るために助けてください(また、ポイント2で示されるように、可変周波数を作る良い方法を見つけることができます) 。

答えて

0

これは具体的な回答ではありません。私の評判は私のコメントを許可しないためです。 しかし別の提案があります: 遅延の代わりにタイマー割り込みについて考えましたか?

#include "TimerOne.h" 

long X{1000000}; 
int volatile altVar{1}; 

void clockSignal(); 

void setup(){ 
    timer.initialize(X); 
    timer.attachInterrupt(clockSignal()); 
} 

void loop(){ 
    readSensor(); 
} 

// Gets called every X cycles; 
void clockSignal(){ 
    if(altVar == 1){ 
    digitalWrite(stepPinB, LOW); 
    }else{ 
    digitalWrite(stepPinB, HIGH); 
    } 
    altVar *= -1; 
} 

完全に無料のループ機能が得られます。あなたがやってみたいことには時間と空間があります。クロックサイクルを与えて間もなく中断します。

+0

これは、割り込みにどのようにアタッチするかではありません。 'clockSignal()'を呼び出して 'void'をつけるだけです。 –

+0

@gre_gorこれは、私が示唆している(やはり、質問の下のコメントであるべきです)、私が見つけることができる最初の例(ドイツ語:http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary)を使用しようとすると起こります。右の実装に自由に編集してください。しかし、とにかく、その背後にあるアイデアは役に立つかもしれません。 –

+0

あなたの答えをありがとう、今私はあなたのコードを私はまだ私のモータを停止せずに私のセンサーをチェックできるかどうかを確認するいくつかの試みを行うつもりです。 – Jacopo

1

あなたが同じ時間(500US)を使用しているので、以下のコードは、あなたが(arduinoのmillis() funcionを使用して)スーツがあります

unsigned long timerBefore = 0; //global variable 
    int inc=0; 
    void Temporize(){ 
     unsigned long timerNow=millis(); 
     if((unsigned long)(timerNow-timerBefore)>=(500){ 
     timerBefore=millis(); 
     inc++; 
     if(inc==1) 
      digitalWrite(StepPinB, LOW); 
     if(inc==2){ 
      digitalWrite(StepPinB, HIGH); 
      inc=0; 
     } 
    } 
} 

、あなたはあなたのようなあなたのマイクロコントローラのスレーブことなく、そのforの内側にその関数を呼び出すことができますコード。

+0

あなたの答えをありがとう、今私はあなたのコードを私はまだ私のモータを停止せずに私のセンサーをチェックできるかどうかを確認するいくつかの試みを行うつもりです。 – Jacopo