2017-04-06 155 views
0

我正在使用由drv8825驅動器驅動的幾個步進電機進行學校項目(實際上,它將是高架行駛起重機) ,與一個Arduino UNO。首先,我們沒有大量的錢花。 現在,問題在於:我們將通過MPU6050 acc + gyro使用PID控制來控制電機的速度(在運動期間負載應儘可能牢固),以及只有兩種方式來改變步進馬達的速度是:直流電機步進電機的速度控制步進電機(電機:NEMA 17;驅動器:drv8825)[頻率調節]

1)通過一個延遲的方法,例如:

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

} 

使用這種方法,所述的Arduino將忙於所有的時間,所以我會不能連續檢查傳感器的值,以達到正確的速度。正因爲如此,我不能使用這種方法。 2)通過外部調節drv8825的時鐘頻率,例如使用「電壓 - 頻率轉換器」(可變電壓可以通過「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