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

Arduino 直流步进电机的速度控制(电机:NEMA 17;驱动器:drv8825)[频率调节],arduino,driver,frequency,pwm,motordriver,Arduino,Driver,Frequency,Pwm,Motordriver,我正在做一个学校项目,使用一些由drv8825驱动器驱动的步进电机。实际上,这将是一个桥式起重机,带有Arduino UNO。首先,我们没有很多钱可以花。 现在,问题是:我们将使用PID控制,通过MPU6050 acc+陀螺仪,控制电机的速度。在移动过程中,负载应尽可能坚固,改变步进电机速度的唯一两种方法是: 1通过延迟方法,例如: for (i = 0; i<400; i++) { digitalWrite(StepPinB, LOW); delayMicrosecond

我正在做一个学校项目,使用一些由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的时钟频率,例如使用电压-频率转换器,可通过Arduino PWM+低通滤波器或使用带数字电位计的非稳态多谐振荡器非稳态振荡器来改变频率。 我已经尝试过电压-频率转换器的方法,但是由于电路的噪音,它不起作用


我希望您能帮助我找出在节目期间连续改变步进电机速度的更好方法,以及制作变频的更好方法,如第2点所示。

这不是一个具体的答案,因为我的声誉不允许我发表评论。 但我有另一个建议: 你有没有想过用定时器中断代替延迟

#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;
}

您将受益于完全自由的循环函数。你想做的每件事都有空间和时间,只是因为给出了时钟周期而很快被中断。

你使用的是同一时间500us,因此下面的代码可能适合你使用arduino millis函数:


然后,您可以在其内部调用该函数,而无需像代码一样使用微控制器。

这不是附加到中断的方式。您只是在调用clockSignal并附加void。@gre_gor当我再次尝试提出建议时,这种情况应该是问题下的注释,并使用我能找到的第一个德语示例:。请随意编辑到正确的实现。但无论如何,它背后的想法可能是有帮助的。谢谢你的回答,现在我将用你的代码做一些尝试,以验证我是否仍然可以在不停止电机的情况下检查传感器。谢谢你的回答,现在我将用你的代码做一些尝试,以验证我是否仍然可以在不停止电机的情况下检查传感器。
   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;
         }
     }
 }