我正在使用由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点所示。
答案 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;
}
您将获得完全免费的循环功能。你想做的每件事都有空间和时间,只有很短的时间才会中断,以便给出时钟周期。