【问题标题】:Speed Control in dc motor Stepper (motor: NEMA 17 ; driver: drv8825) [frequency regulation]直流电机步进电机的速度控制(电机:NEMA 17;驱动器:drv8825)[频率调节]
【发布时间】:2017-04-06 10:58:37
【问题描述】:

我正在做一个学校项目,使用一些由 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”+“低通滤波器”给出)或使用“ astable multivibrator”(“非稳态振荡器”)带有“数字电位器”来改变频率。 我已经尝试过“电压-频率转换器”的方法,但由于电路的噪音,它不起作用。

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

【问题讨论】:

    标签: arduino driver frequency pwm motordriver


    【解决方案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 内部调用该函数,而无需像您的代码那样从属您的微控制器。

    【讨论】:

    • 感谢您的回答,现在我将尝试使用您的代码来验证是否仍然可以在不停止电机的情况下检查传感器。
    【解决方案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;
    }
    

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

    【讨论】:

    • 这不是你附加到中断的方式。你只是打电话给clockSignal() 并附加void
    • @gre_gor 发生这种情况时,我尝试提出建议(再次,应该是问题下的评论)并使用我能找到的第一个示例(德语:playground.arduino.cc/Deutsch/…)。随意编辑正确的实现。但无论如何,它背后的想法可能会有所帮助。
    • 感谢您的回答,现在我将尝试使用您的代码来验证是否仍然可以在不停止电机的情况下检查传感器。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多