0

我正在做一个学校项目,使用一些由 drv8825 驱动器驱动的步进电机(实际上,它将是一台桥式起重机)和一个 Arduino UNO。首先,我们没有一大笔钱可以花。现在,问题是这样的:我们将使用 PID 控制,通过 MPU6050 acc+gyro 来控制电机的速度(负载应该在运动过程中尽可能牢固),并且唯一的改变步进电机速度的两种方法是:

1)通过延迟方法,例如:

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

}

使用这种方法,Arduino会一直忙,所以我将无法连续检查传感器的值,以达到正确的速度。因此,我不能使用这种方法。

2)通过外部调节drv8825的时钟频率,例如使用“电压频率转换器”(可变电压可以由“Arduino PWM”+“低通滤波器”给出)或使用“非稳态多谐振荡器” (“非稳态振荡器”)用“数字电位器”改变频率。我已经尝试过“电压频率转换器”的方法,但由于电路的噪音它没有工作。

我希望你能帮助我找出在程序期间连续改变步进电机速度的更好方法(以及找到更好的方法来制作可变频率,如第 2 点所示)。

4

2 回答 2

1

您正在使用相同的时间(500us),因此下面的代码可能适合您(使用 arduinomillis()函数):

   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而无需像您的代码那样从属您的微控制器。

于 2017-04-06T15:24:06.230 回答
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;
}

您将受益于完全免费的循环功能。你想做的每件事都有空间和时间,它只会因为给时钟周期而短暂中断。

于 2017-04-06T11:48:10.060 回答