2017-04-06 120 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