Arduino中国 | Flamingo EDA

TAG | EasyDriver

Jun/09

30

用Arduino与EasyDriver驱动步进电机

与其它普通直流电机相比,步进电机最大的特点就是它可以通过输入脉冲信号来进行控制的,也就是说电机的总转动角度可以由输入脉冲数决定,而电机的转速由脉冲信号频率决定。正因如此,你可以用Arduino来为步进电机产生相应的脉冲信号,来精确地控制电机转动的角度和速度!

步进电机是机电控制中一种常用的执行机构,实际使用时通常会用到一个驱动电路来对其进行驱动,这里我们使用的是EasyDriver,使用它能够很方便地控制一个两相混合式步进电机。电路在工作时由Arduino负责给EasyDriver发送相应的控制脉冲信号,来驱动步进电机转动相应的角度。由于EasyDriver一边要接收Arduino的控制信号,一边要控制电机转过相应的角度,因此接线其实也可以分成两个部分。

一部分是同Arduino相连的GND, STEP, DIR三根接线,分别为地、步进脉冲引脚和方向控制引脚步,STEP和DIR使用Arduino上普通的数字I/O引脚即可:

另一部分则是为电机供电的GND和+V引脚(这里我使用的9V外接电源),以及与两相步进电机相连接的MA和MB这4个个引脚(分别同电机的一个相连接起来):

为了演示的方便,我们还在A0和A1两个引脚上接上了两个按钮来分别控制电机的方向。顺便提一句,Arduino的A0 ~ A6在需要的时候也可以当成数字I/O引脚使用,其中A0对应的数字I/O为14,A1对应的数字I/O为15,依次类推。

接线并不算太复杂,最后电路接线的效果图:

相应的程序也比较简单:

int dirPin = 6;
int stepperPin = 5;
int switch1  = 14;
int switch2 = 15;
int value;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
  pinMode(switch1, INPUT);
  pinMode(switch2, INPUT);
}

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
  for(int i=0; i < steps; i ++) {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(50);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(50);

    // speed control
    delayMicroseconds(100);
  }
}

void loop(){
  value = digitalRead(switch1);
  if (HIGH == value) {
    step(true,1600 * 5);
  }

  value = digitalRead(switch2);
  if (HIGH == value) {
      step(false,1600*5);
  }

}

按照前面的连线,控制电机转动的脉冲信号是通过Arduino上的数字I/O引脚5来提供的,而电机转动方向的控制则是通过数字I/O引脚6来实现的。两个按钮开关分别接在A0和A1号引脚上,对于数字I/O引脚14和15:

int dirPin = 6;
int stepperPin = 5;
int switch1  = 14;
int switch2 = 15;

步进电机的转动主要是通过step()函数来实现,该函数有两个参数:第一个是转动的方向,分别代表正转和反转;第二个是步进数目,即给的控制脉冲的数目。通过修改每个脉冲间隔之间的时间长度,可以非常容易地调整电机转动的速度:

    // speed control
    delayMicroseconds(100);

两个对step()函数的调用,分别控制电机正转/反转相应的圈数,由于每种电机步进的角度数不同,旋转一圈所需要的脉冲数也是不一样的:

  step(true,1600 * 5);
  step(false,1600 * 5);

最后提醒一下,EasyDriver上的R6是用来限流的,调节它可以设置经过驱动芯片的电流大小。

·