极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2989|回复: 0

机翻Easydriver让步进器运行的示例代码和项目(1)

[复制链接]
发表于 2019-5-5 21:26:47 | 显示全部楼层 |阅读模式
本帖最后由 方恨少 于 2019-5-5 21:29 编辑

使用Easydriver总出现问题,索性找出官方例程来学习,一并翻译推荐给大家 !

简单的驱动示例
让步进器运行的示例代码和项目!

描述:
很多人购买EasyDrivers或BigEasyDrivers,然后让他们在他们的项目中工作得很好。但有些人不这样做,所以我认为写一些简单的说明让你的Easy Driver尽可能快速,轻松地工作是个好主意。

所有这些例子都将通过我的Easy Driver和Big Easy Driver步进电机驱动板完成,驱动几个不同的随机步进电机,我躺在实验室周围。我将使用Arduino UNO和chipKIT UNO32生成步进和方向脉冲虽然所有这些例子都适用于任何Arduino或Arduino克隆或Arduino兼容(如所有chipKIT板)。如果您想了解更多关于这些内容的信息

,请不要忘记阅读Dan Thompson的优秀Easy Driver教程博客文章。在博客文章的评论中回答了一些很好的问题。

注1:所有示例都适用于Easy Drivers或Big Easy Drivers。
注2:所有示例都适用于Arduino以及chipKIT板(由于PIC32速度,有些示例在chipKIT上运行得更好)
注3:所有示例都显示了用于电源输入的桶式插孔 - 您需要以某种方式为EasyDrivers供电,但它不需要是桶式插孔。你应该有一个能够在5V和30V之间输出一些电压的电源,电流为1安培或更高。
示例1:基本Arduino设置
这是Arduino,Easy Driver和步进电机最基本的例子。将电机的四根电线连接到Easy Driver(注意正确的线圈连接),将12V电源连接到电源输入引脚,并将Arduino的GND,引脚8和引脚9连接到Easy Driver。
Example1_bb.png

然后加载此草图并在Arduino或chipKIT上运行:

void setup() {               
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1);         
  digitalWrite(9, LOW);
  delay(1);         
}


没有什么比这更简单。代码在做什么?它将引脚8和9设置为输出。它开始时它们都很低。然后在主循环中,它只需将引脚9切换为高电平和低电平,在切换之间等待1ms。我们使用引脚9作为STEP控制,使用引脚8作为Easy Driver的DIRECTION控制。
由于我们没有在Easy Driver低电平上拉低MS1或MS2,因此Easy Driver将默认为1/8微步模式。这意味着每次“digitalWrite(9,HIGH);” 执行调用后,步进电机将移动一整步的1/8。因此,如果您的电机每步为1.8度,则每转将有200个完整步,或每转1600微步。
那么这段代码运行步进器的速度有多快?好吧,STEP信号高1ms,低1ms,每个完整脉冲需要2ms的时间。由于1秒内有1000ms,因此1000/2 = 500微步/秒。
如果我们想让电机变慢怎么办?我们改变延迟(); 线路有更长的延迟。如果你使用延迟(10); 对于两者,你将以50微秒/秒的速度移动。
如果你想让电机加速怎么办?我们不能真正延迟不到1毫秒,可以吗?是的,我们当然可以!我们可以将delay()调用更改为delayMicroseconds(100); 呼叫然后每个延迟将是100微秒(或我们),因此电机将以5000微秒/秒的速度驱动。
现在,您应该玩的一件事是Easy Driver上的当前调整底池。你需要一个小小的螺丝刀来转动它,并且一定不要将它推得太远(它们很精致)。此外,一些Easy Drivers是使用没有物理挡块的底座制造的,所以它们会四处转动。当你运行上面的代码时,慢慢转动锅的方式或其他方式。根据您所拥有的电机类型(及其线圈电阻),您可能会在旋转电位器时听到/感觉没有差异,或者您可能会注意到相当大的差异。

例1.5:按下按钮时移动
此示例与示例1几乎完全相同,但我们添加了一个按钮。当草图运行时,它等待按下按钮(Arduino引脚3上的低电平),然后它开始旋转步进电机3200步。它是以“非阻塞”的方式编写的,这意味着您可以轻松地将其他内容添加到loop()函数中,而无需为了运行步进电机而停止这些操作。(就像下面的AccelStepper所做的那样。)我们在引脚3和地之间增加了一个按钮开关,然后在引脚3和3.3V之间使用了3.3K上拉电阻。
Example1_5_bb.png

#define DISTANCE 3200

int StepCounter = 0;
int Stepping = false;

void setup() {               
  pinMode(8, OUTPUT);     
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);

  pinMode(3,INPUT);
}

void loop() {
  if (digitalRead(3) == LOW && Stepping == false)
  {
    Stepping = true;
  }

  if (Stepping == true)
  {
    digitalWrite(9, HIGH);
    delay(1);         
    digitalWrite(9, LOW);
    delay(1);

    StepCounter = StepCounter + 1;

    if (StepCounter == DISTANCE)
    {
      StepCounter = 0;
      Stepping = false;
    }
  }
}

例1.6:使用两个按钮前进和后退
这个例子几乎完全像1.5,除了我们在Arduino Pin 2上添加了第二个按钮,再次使用一个上拉电阻到3.3V。当您按下一个按钮时,电机将向一个方向移动3200步,当您按另一个按钮时,它将向另一个方向移动3200步。
Example1_6_bb.png


#define DISTANCE 3200

int StepCounter = 0;
int Stepping = false;

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);

  pinMode(2, INPUT);
  pinMode(3, INPUT);
}

void loop() {
  if (digitalRead(3) == LOW && Stepping == false)
  {
    digitalWrite(8, LOW);
    Stepping = true;
  }
  if (digitalRead(2) == LOW && Stepping == false)
  {
    digitalWrite(8, HIGH);
    Stepping = true;
  }

  if (Stepping == true)
  {
    digitalWrite(9, HIGH);
    delay(1);
    digitalWrite(9, LOW);
    delay(1);

    StepCounter = StepCounter + 1;

    if (StepCounter == DISTANCE)
    {
      StepCounter = 0;
      Stepping = false;
    }
  }
}


例1.7:以非常特定的速度按下开关时移动
此示例与设置中的1.5完全相同,但允许您指定电机的精确RPM。只要按下按钮,它就会以该速度旋转电机。

/* This example assumes a step/direction driver with Step on pin 9, Direction on pin 8
* And an input switch on pin 3. The switch is a switch to ground, with pin 3 pulled
* high with a pullup resistor. When the switch is turned on (closed, i.e. goes low)
* the the sepper motor steps at the rate specified (104 RPM in this code, with
* 1/8th microstepping of a 200 steps/rev motor)
*/

#define RPMS                104.0
#define STEP_PIN                9
#define DIRECTION_PIN           8
#define GO_PIN                  3

#define STEPS_PER_REV         200
#define MICROSTEPS_PER_STEP     8
#define MICROSECONDS_PER_MICROSTEP   (1000000/(STEPS_PER_REV * MICROSTEPS_PER_STEP)/(RPMS / 60))

uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;

void setup() {               
  pinMode(STEP_PIN, OUTPUT);     
  pinMode(DIRECTION_PIN, OUTPUT);
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(DIRECTION_PIN, LOW);
  pinMode(GO_PIN,INPUT);
}

void loop() {
  if (digitalRead(GO_PIN) == LOW)
  {
    CurrentTime = micros();
    if ((CurrentTime - LastStepTime) > MICROSECONDS_PER_MICROSTEP)
    {
      LastStepTime = CurrentTime;
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9)/2);
      digitalWrite(STEP_PIN, LOW);
      delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9)/2);
    }
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-8-14 19:13 , Processed in 0.070057 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表