直流电动机的速度控制步进电机(电机:NEMA 17;驱动器:drv8825)[频率调节]

时间:2017-04-06 10:58:38

标签: arduino driver frequency pwm motordriver

我正在使用由drv8825驱动程序驱动的几个步进电机(实际上,它将是一台桥式起重机)与Arduino UNO进行学校项目。首先,我们还没有花很多钱。 现在,问题在于:我们将使用PID控制,通过MPU6050 acc +陀螺仪,控制电机的速度(负载应该在运动过程中尽可能坚固),并且是唯一的改变步进电机速度的两种方法是:

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

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

}

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

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

我希望您能帮助我找出在程序中不断改变步进电机速度的更好方法(并找到更好的方法来制作变量)频率,如第2点所示。

2 个答案:

答案 0 :(得分:1)

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

   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内部调用那个函数而不需要你的微控制器像你的代码一样。

答案 1 :(得分: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;
}

您将获得完全免费的循环功能。你想做的每件事都有空间和时间,只有很短的时间才会中断,以便给出时钟周期。